[JAVA의 정석]객체지향 프로그래밍 - 다형성

etlaou·2021년 7월 24일
0

다형성

한 타입의 참조변수로 여러 타입의 객체를 참조하는 것
조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있다.

이처럼 조상클래스의 참조변수를 사용해 자손 클래스의 인스턴스를 참조하면

CaptionTv c = new CaptionTv();
TV t = new CaptionTv();

같은 타입의 인스턴스지만 참조변수 타입(CaptionTv, TV)에 따라 사용할 수 있는 멤버의 개수가 달라진다.

만약 반대로, 자손타입의 참조변수로 조상타입의 인스턴스를 참조 가능할까?
불가능하다.
왜냐하면, 자손클래스는 조상클래스보다 멤버의 개수가 더 많기 때문에 컴파일 에러가 발생한다. 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야한다.

참조변수 형변환

  • 서로 상속관계에 있는 클래스 사이에서만 형변환이 가능하다.

자손타입 → 조상타입 (Up-casting): 형변환 생략 가능
조상타입 → 자손타입 (Down-casting): 형변환 생락 불가능


다음과 같이 상속 관계를 갖는 클래스가 있다고 하자.

FireEngine f;
Ambulance a;

a = (Ambulance)f;
f = (FireEngine)a;

FireEngine과 Amubulance는 형제관계로 보이지만, 자바에서는 자손-조상 관계만 있기때문에 서로 상속관계가 아니므로 형변환이 불가능하다.

Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;

car = fe; // (Car)fe에서 (Car)가 생략된 것 → 자손에서 조상으로의 형변환
fe2 = (FireEngine)car; // 조상에서 자손으로 형변환할 경우 생략하면 안된다.

형변환은 참조변수의 타입을 변화하는 것이지 인스턴스를 변환하는 것은 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다.

단지 참조변수의 형변환을 통해서, 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위를 조절하는 것이다.

instanceof 연산자

  • instanceof 연산자를 왜 사용할까?
    : 메서드가 호출될 때, 매개변수롤 클래스를 넘겨받게되는데 메서드 내에서는 정확히 어떤 인스턴스인지 알 길이 없기때문에, instanceof 연산자를 사용해 참조변수가 가리키고 있는 인스턴스의 타입을 체크하고 적절한 형변환을 한다.

(참조변수 instanceof 타입) 이 True이면 참조변수가 검사한 타입(클래스)로 형변환이 가능하다.

참조변수와 인스턴스 연결

조상클래스와 자손클래스에 중복으로 같은 이름의 인스턴스 변수와 멤버변수가 정의되었을 때, 참조변수에 따라 서로 다른 결과를 얻는다.

조상클래스의 참조변수일 경우, 조상클래스의 선언된 멤버변수
자손클래스의 참조변수일 경우, 자손클래스의 선언된 멤버변수가 사용된다.

매게변수의 다형성

아래와 같이 클래스가 정의되어 있을 경우,

Buy 메서드를 보면 매개변수별로 메서드를 구현해야 한다. 하지만 이는 코드가 길어지고 동일한 기능을 하는 메서드임에도 여러개가 필요하다는 단점이 있다. 이렇게 되면 종류가 늘어날 때마다 새로운 메서드를 추가해야한다는 불편함이 있다.

하지만 매개변수를 조상클래스의 자손타입의 참조변수면 어느 것이나 매개변수로 받아들일 수 있다.

profile
To be Cloud DevOps Engineer

0개의 댓글