[java] 다형성 - 참조 변수 타입과 실제 인스턴스 타입

Junseo Kim·2021년 1월 9일
0

[Java]자바 기초

목록 보기
19/35

상속 관계에 있는 클래스가 존재할 때, 조상 클래스와 자손 클래스의 같은 이름의 인스턴스 변수가 있는 경우, 클래스 타입에 따라 사용되는 변수가 달라진다.

Child가 Parent의 자손이고 둘다 x라는 인스턴스 변수를 가지고 있는 상태에서 아래와 같이 사용하면

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

System.out.println(p.x);
System.out.println(c.x);

p.x와 c.x의 값은 다르게 출력된다. 클래스 타입에 따라 이름이 같은 변수여도 각각 본인의 변수를 사용하기 때문이다.

하지만 인스턴스 메서드인 경우는 참조변수 타입에 상관없이 실제 인스턴스의 메서드가 호출된다.

Child가 Parent의 자손이고 둘다 print라는 인스턴스 메서드를 가지고 있는 상태(Child가 Parent의 print()메서드를 오버라이딩 한 상태)에서 아래와 같이 사용하면

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

p.print();
c.print();

둘다 동일한 메서드(Child의 print())가 호출된다. 참조 변수의 타입은 다르지만 실제 인스턴스의 타입이 동일하기 때문이다.

참고로 클래스 메서드(static 메서드)는 인스턴스 메서드와 달리 변수처럼 참조 변수의 타입에 따라 호출된다. 따라서 클래스 메서드 사용시 인스턴스를 생성하여 참조변수를 통해 사용하는 것이 아니라 클래스이름.메서드이름으로 사용하는 것이 좋다.

0개의 댓글