이번에는, 상속 관계에서 클래스형이 가지는 의미에 대해서 살펴볼 예정입니다.


클래스형은 접근할 수 있는 범위를 뜻합니다. 선언된 클래스형의 범위 안에 해당되는 멤버들에만 접근이 가능하다는 이야기 입니다. 예를 들어, 클래스 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 하는 가장 하위의 메소드가 호출됩니다.

by kkikkodev 2015. 7. 13. 23:07