코린이의 소소한 공부노트

다형성 본문

Java

다형성

무지맘 2022. 4. 19. 14:04


다형성

  - 여러 가지 형태를 가질 수 있는 능력으로,

  - 자바에서는 조상 타입 참조변수로 자손 타입 객체를 다루는 것을 말한다.

class Parent {
    int pi1; // 멤버 변수 2개
    int pi2;
    
    void pm1() { }  // 메서드 3개
    void pm2() { }
    void pm3() { }
}
class Child extends Parent {
    int ci; // 멤버 변수 1개
    
    void cm() { } // 메서드 1개
}

// 메인 내부에서..
Parent p = new Parent(); // OK
Child c = new Child(); // OK
Parent pp = new Child(); // OK. WHY????

Parent 클래스가 있고, 이를 상속받은 Child 클래스가 있다. 두 클래스를 이용해 객체를 생성할 때 참조변수의 타입(왼쪽)과 객체의 타입(오른쪽)을 일치시켜서 객체 생성을 하는 게 일반적이었는데, 다형성은 불일치해도 객체 생성을 가능하게 해 준다.

 

객체와 참조변수의 타입이 일치할 때와 일치하지 않을 때 어떤 차이가 있는지 확인해보자.

1. 참조변수와 객체의 타입이 일치

Parent p = new Parent(); // OK
Child c = new Child(); // OK

참조변수의 타입과 객체의 타입이 일치하기 때문에, 참조변수로 접근할 수 있는 변수/메서드는 모두 객체에 있다. 따라서 에러 날 일이 없다.

2. 참조변수와 객체의 타입이 불일치

Parent pp = new Child(); // OK

1) 참조변수: 조상, 객체타입: 자손

  - Parent 클래스의 멤버는 5개이고, Child 클래스의 멤버는 7개이다. 객체 생성 시 Child 클래스로 생성했기 때문에 객체에는 7개의 멤버가 있지만 참조변수는 Parent 클래스로 되어있기 때문에 접근 가능한 멤버는 5개뿐이다. 객체에 있는 나머지 2개(ci, cm)는 접근 불가능하지만 사용하지도 않으므로 에러가 발생하지는 않는다.

    -> 다형성

Child cc = new Parent(); // error

2) 참조변수: 자손, 객체타입: 조상

  - 참조변수의 멤버는 7개인데, 객체에는 5개의 멤버만 존재하기 때문에 실제로 사용할 수 없는 멤버가 2개(ci, cm)나 있다. 그렇기 때문에 에러가 발생한다

    -> 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없다.

'Java' 카테고리의 다른 글

instanceof 연산자  (0) 2022.05.03
참조변수의 형변환  (0) 2022.04.20
접근 제어자를 이용한 캡슐화  (0) 2022.04.18
제어자  (0) 2022.04.16
임포트와 스태틱 임포트  (0) 2022.04.14