클래스 상속시 참조 변수와 인스턴스 관계
클래스를 상속받아 인스턴스를 생성시 다형성을 지원하므로 참조 변수 타입을 부모, 자손클래스 타입을 사용할 수 있습니다. 이때 참조 타입에 따라 인스턴스 멤버의 참조가 달라지는데 확인을 위해 Parent 클래스를 상속한 Son클래스를 만들어 두었습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 조상클래스 public class Parent { public String name = "Parent"; public void getName(String word){ System.out.println(this.name + " said! " + word); } } // 자손클래스 public class Son extends Parent { public String name = "Son"; public void getName(String word){ System.out.println(this.name + " said! " + word); // System.out.println(super.name + " said! " + word); } } |
Parent 클래스를 상속한 Son클래스를 가지고 인스턴스를 생성하고 이를 참조하는 변수 fson, sson의 타입을 각각 Parent, Son으로 선언하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class extendsMain { public static void main(String[] args){ Parent fson = new Son(); // 자손클래스의 인스턴스를 조상클래스 타입으로 참조 Son sson = new Son(); // 자손클래스의 인스턴스를 자손클래스 타입으로 참조 // 멤버 변수는 참조타입에 따라 달라짐 System.out.println(fson.name); // Parent System.out.println(sson.name); // Son // 메소드는 참조 타입과 무관하게 생성된 인스턴스의 메소드를 참조 fson.getName("I'm your father"); // Son said! I'm your father sson.getName("I'm your son"); // Son said! I'm your son } } |
위의 결과에서 볼 수 있듯이 멤버 변수의 경우 참조 타입에 따라 참조하는 멤버 변수가 달라지며 메소드의 경우 참조타입과 무관하게 인스턴스 변수를 참조합니다. 이런 경우는 부모 클래스의 멤버변수와 같은 이름의 멤버변수를 자손클래스에 정의한 경우에 해당하며 정의하지 중복되지 않을 경우는 문제가 되지 않습니다. 자손 클래스에 중복정의 되었음에도 의도적으로 부모 클래스의 멤버변수를 참조할 경우 Son클래스의 주석처리된 것 처럼 “super” 키워드를 사용하여 참조가 가능합니다. 상속으로 구현된 클래스의 인스턴스 멤버중 참조 타입에 영향을 받지않는 멤버는 인스턴스 메서드밖에 없습니다.
상속을 사용할 경우 이점을 유의해서 사용해야할 것 같습니다.
프로젝트 끝나고 조금 여유 있어서 자바공부 시작했는데 재미있네요 ㅎㅎ 틀린 점이나 궁금한 점 있으시면 댓글 달아주시면 감사하겠습니다!
-
셋째