ss__jae2
타닥타닥 IT
ss__jae2
전체 방문자
오늘
어제

Github

  • 타닥타닥 IT (179)
    • 웹개발 (86)
      • JAVA (23)
      • DBMS (6)
      • HTML (9)
      • CSS (7)
      • JavaScript (12)
      • JSP (14)
      • Spring (15)
    • FrontEnd (63)
      • HTML (5)
      • CSS (12)
      • JavaScript (16)
      • React.js (14)
      • Node.js (16)
    • API (5)
    • SQLD (21)
      • SQLD (1)
      • 1과목 데이터 모델링의 이해 (11)
      • 2과목 SQL 기본 및 활용 (9)
    • CS Study (4)
      • 네트워크 (4)

공지사항

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.
ss__jae2

타닥타닥 IT

웹개발/JAVA

[JAVA] 다형성( polymorphism )

2022. 1. 25. 00:42
반응형

1. 다형성( polymorphism )이란?

  • 객체지향 개념에서 다형성이란 여러 가지 형태를 가질 수 있는 능력을 의미하며, 자바에서는 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다.
    ( 하나의 변수로 다른 타입의 다양한 객체를 참조할 수 있다. )
  • 좀 더 구체적으로 말하자면 조상클래스 타입의 참조 변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다는 것이다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Tv {
        boolean power;
        int channel;
        void power() {}
        void channelUp() {}
        void channelDown() {}
    } // 5개 사용 가능​
     
    class CaptionTv extends Tv {
        String text;
        void caption() {}
    } // 7개 사용 가능​
    c
  • 지금까지 우리는 Tv t = new Tv(); 또는 CaptionTv c = new CaptionTv(); 형식으로만 사용해 왔다.
  • 이처럼 인스턴스의 타입과 참조 변수의 타입이 일치하는 것이 보통이지만, Tv 와 CaptionTv 처럼 클래스가 서로 상속관계에 있을 경우 다음과 같이 조상클래스 타입의 참조 변수로 자손클래스의 인스턴스를 참조하도록 하는 것도 가능하다.
    Tv t = new CaptionTv(); ==> 조상 타입의 참조 변수로 자손 인스턴스를 참조
  • 그렇다면
    CaptionTv c = new CaptionTv(); ( 7 -> 7 )
    Tv t = new CaptionTv();   ( 5 -> 7 )
    둘의 차이는 무엇일까?
  • 둘 다 같은 타입의 인스턴스지만 참조 변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다.
  • 그럼 여기서 반대로
    CaptionTv c = new Tv(); ( 7 -> 5)는 가능할까에 대한 답변은 불가능하다는 점이다.
    실제 인스턴스인 Tv 멤버 개수보다 참조 변수 c가 사용할 수 있는 멤버 개수가 더 많기 때문이다.
  • CaptionTv 클래스에서 text와 caption() {}이 정의되어 있으므로 참조변수 c로는 c.text, c.caption()과 같은 방식으로 c가 참조하고 있는 인스턴스에서 text와 caption()을 사용하려고 시도할 수 있다.
    하지만, c가 참조하고 있는 인스턴스는 Tv 타입이고, Tv 타입의 인스턴스에는 text와 caption()이 존재하지 않기 때문에 이를 사용하려 하면 문제가 발생한다.
  • 그래서 자손 타입의 참조 변수로 조상 타입의 인스턴스를 참조하는 것은 존재하지 않는 멤버를 사용하고자 할 가능성이 있으므로 허용하지 않는 것이다.
  • 참조 변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 작아야 한다.
    * 조상 타입의 참조 변수로 자손 타입의 인스턴스를 참조할 수 있다.
    * 반대로 자손타입의 참조 변수는 조상 타입의 인스턴스를 참조할 수 없다.

2. 참조 변수의 형변환

  • 기본형 변수와 같이 참조 변수도 형변환이 가능하다.
  • 단, 서로 상속관계에 있는 클래스에서만 가능하기 때문에 자손 타입의 참조 변수를 조상 타입의 참조 변수로, 조상 타입의 참조 변수를 자손타입의 참조 변수로의 형변환만 가능하다.

    자손타입 -> 조상타입
    ( Up - casting )
    형변환 생략 가능 부모 타입의 객체에 자식 클래스의 필드를 담아주는 것
    부모 타입의 객체에 자식 객체를 넣어주는 것
    부모 타입의 객체에 자식 생성자를 호출해주는 것
    조상타입 -> 자손타입
    ( Down - casting )
    형변환 생략 불가능 업캐스팅된 객체를 다시 자식 객체에 담는 기법
    업캐스팅 되어 있어야만이 다운 캐스팅이 가능함
  • 어떠한 클래스 Car가 있을 때 Car타입의 참조변수 c를 Car타입의 조상인 Object타입의 참조변수로 형변환하는 것은 참조 변수가 다룰 수 있는 멤버의 개수가 실제 인스턴스가 갖고 있는 멤버의 개수보다 적을 것이 분명하므로 문제가 되지 않는다. ==> 형변환을 생략 가능
  • 형변환은 참조 변수의 타입을 변환하는 것이지 인스턴스를 변환하는 것이 아니기 때문에 참조 변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다.
  • 단지, 참조변수의 형변환을 통해서 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위( 개수 )를 조절하는 것뿐이다.

    다형성 & 형변환

3. instanceof 연산자

  • 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다.
  • 주로 조건문에 사용되며 instanceof의 왼쪽에는 참조 변수를 오른쪽에는 타입( 클래스명 )이 피연산자로 위치한다.
  • 그리고 연산의 결과로 boolean값인 true와 false 중 하나를 반환한다.
  • instanceof를 이용한 연산 결과로 true를 얻었다는 것은 참조 변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻한다.

4. 참조 변수와 인스턴스의 연결

  • 조상클래스에 선언된 멤버 변수와 같은 이름의 인스턴스 변수를 자손 클래스에서 중복으로 정의했을 때 조상 타입의 참조 변수로 자손 인스턴스로 참조하는 경우와 자손 타입의 참조 변수로 자손 인스턴스를 참조하는 경우는 서로 다른 결과를 얻는다.
  • 메소드의 경우 조상클래스의 메소드를 자손의 클래스에서 오버라이딩한 경우에는 참조 변수의 타입에 관계없이 항상 실제 인스턴스 메소드가 호출되지만, 멤버 변수의 타입에 따라 달라진다.
  • 멤버 변수가 조상클래스와 자손클래스에 중복으로 정의된 경우, 조상 타입의 참조 변수를 사용했을 때는 조상클래스에 선언된 멤버 변수가 사용되고, 자손 타입의 참조 변수를 사용했을 때는 자손 클래스에 선언된 멤버 변수가 사용된다.
  • 하지만 중복 정의되지 않을 경우 조상 타입의 참조 변수를 사용했을 때와 자손 타입의 참조 변수를 사용했을 때의 차이는 없다.

반응형
저작자표시 (새창열림)

'웹개발 > JAVA' 카테고리의 다른 글

[JAVA] 인터페이스( interface )  (0) 2022.01.26
[JAVA] 추상클래스( abstract class )  (0) 2022.01.26
[JAVA] 제어자( modifier )  (0) 2022.01.24
[JAVA] 상속( inheritance ), 오버라이딩( overriding )  (0) 2022.01.20
[JAVA] 오버로딩( Overloading ), 생성자( Constructor ), 변수의 초기화  (0) 2022.01.18
    '웹개발/JAVA' 카테고리의 다른 글
    • [JAVA] 인터페이스( interface )
    • [JAVA] 추상클래스( abstract class )
    • [JAVA] 제어자( modifier )
    • [JAVA] 상속( inheritance ), 오버라이딩( overriding )
    ss__jae2
    ss__jae2

    티스토리툴바