글
이번에는, 상속 관계에서 클래스형이 가지는 의미에 대해서 살펴볼 예정입니다.
클래스형은 접근할 수 있는 범위를 뜻합니다. 선언된 클래스형의 범위 안에 해당되는 멤버들에만 접근이 가능하다는 이야기 입니다. 예를 들어, 클래스 Super 와 Sub 가 다음과 같이 정의되었다고 가정합니다.
class Super{
int variable = 1;
public void method(){
System.out.println("Super method");
}
}
class Sub extends Super{
int variable = 2;
public void method(){
System.out.println("Sub method");
}
}
Super 클래스에는 int 형 멤버 변수인 variable 이 1 로 선언되어 있고, 멤버 메소드로는 method() 가 있습니다. Sub 클래스는 Super 클래스를 상속하고 있고, Super 클래스와 마찬가지로 int 형 멤버 변수 variable 이 2 로 선언되어 있고, method() 를 overriding 하고 있습니다. 위의 두 클래스를 가지고, 몇 가지 경우를 살펴보면서 클래스형이 지니는 의미에 대해서 살펴보겠습니다.
먼저, 객체 생성한 클래스형과 이를 대입하려고 선언한 클래스형이 같은 경우입니다.
Super sp = new Super();
Sub sb = new Sub();
System.out.println(sp.variable); // 1
System.out.println(sb.variable); // 2
sp.method(); // Super method
sb.method(); // Sub method
Super, Sub 클래스형 변수를 각각 sp 와 sb 로 선언한 뒤 같은 클래스형으로 객체를 생성하여 대입합니다. 그 다음에, 각 인스턴스 변수들의 멤버 변수를 출력하고, 멤버 메소드를 호출합니다. 이 때 멤버 변수든, 멤버 메소드이든 접근할 수 있는 범위의 기준은 왼쪽에 선언된 클래스형이 됩니다. 즉, sp 는 Super 형으로 선언되었기 때문에, Super 형의 멤버 변수인 variable ( = 1) 과 method ("Super method" 를 출력하는) 에 접근을 할 수 있습니다. 그리고, sb 는 Sub 형으로 선언되었기 때문에, Sub 형의 멤버 변수인 variable ( = 2) 과 method ("Sub method" 를 출력하는) 에 접근할 수 있습니다.
그렇다면, 선언된 클래스형과 생성된 객체의 클래스형이 다른 경우는 어떤지 한번 살펴보겠습니다.
Super sp = new Sub();
System.out.println(sp.variable); // 1
sp.method(); // Sub method
상속 관계에서는, 위와 같이, 자식 클래스 객체를 생성하여 부모 클래스의 인스턴스 변수에 대입을 할 수 있습니다. 이 때 선언된 클래스형이 Super 이기 때문에 멤버 변수 variable ( = 1) 과 method ("Super method" 를 출력하는) 에 접근합니다. 단, 메소드가 overriding 되어 있는 경우에는, 가능한 가장 하위의 메소드가 불려집니다. 여기서는 Sub 클래스의 method 메소드가 Super 클래스의 method 클래스를 overriding 하고 있는 가장 하위의 메소드이기 때문에 Sub 의 method 가 호출됩니다.
결론적으로, 상속시 선언된 클래스형과 생성된 객체의 클래스형이 다른 경우 (선언된 클래스형 : 부모 / 생성된 객체의 클래스형 : 자식) 에는, 멤버 변수는 부모 클래스형에 해당하는 범위에 접근하고, 메소드는 일반 메소드는 부모 클래스형에 해당하는 범위에 접근하되, overriding 된 메소드는 이 메소드를 overriding 하는 가장 하위의 메소드가 호출됩니다.
'4.1) OCJP > 관련 이론 및 문법' 카테고리의 다른 글
관련 이론 및 문법 - Comparable 인터페이스 (0) | 2015.07.24 |
---|---|
관련 이론 및 문법 - File 클래스 (0) | 2015.07.24 |
관련 이론 및 문법 - 객체 직렬화 (Serialization) (0) | 2015.07.14 |
관련 이론 및 문법 - NumberFormat 클래스 (0) | 2015.07.14 |
관련 이론 및 문법 - DateFormat 클래스 (0) | 2015.07.13 |
관련 이론 및 문법 - 상속관계에서 인스턴스의 대입 (0) | 2015.07.13 |
관련 이론 및 문법 - has a / is a (0) | 2015.07.08 |
관련 이론 및 문법 - 익명 클래스 (anonymous class) (0) | 2015.07.08 |
관련 이론 및 문법 - Runnable 인터페이스 (0) | 2015.07.08 |
관련 이론 및 문법 - synchronized (0) | 2015.07.08 |
RECENT COMMENT