1강에서 정의한 일반 고객 클래스와 VIP고객 클래스를 생가해보면 , 일반 고객(상위클래스)이 더 일반적인 개념이고,
VIP고객 클래스(하위 클래스)가 더 구체적이고, 기능이 더 많다. VIP는 일반 고객의 기능을 모두 상속받고 그 외에 추가 기능을 더할 수 있기 때문이다.
따라서 VIP고객은 VIP형이면서 일반고객 형이라고 할 수 있다. 따라서 다음과 같은 선언이 가능하다.
Customer vc = new VIPcustomer();
위와 같은 상황을 묵시적 형 변환이라고 하며 업캐스팅(upcasting)이라고도 한다.
VIP고객이 일반고객의 하위 클래스이기에 가능한 선언이며, 반대로 상위클래스를 하위 클래스의 형으로 형 변환 시킬 수는 없다.
위와 같이 선언하면, 인스턴스vc는 선언된 클래스 형(여기선 Customer)의 멤버변수와 메서드에만 접근할 수 있다.
다음 예시를 보자.
package ineritance;
public class Mother {
public void test1() {
System.out.println("mother method");
}
}
package ineritance;
public class Son extends Mother {
public void test1() {
System.out.println("son method");
}
}
package ineritance;
public class MotherSonTest1 {
public static void main(String[] args) {
Mother a = new Son(); // 묵시적 형변환.
a.test1();
}
}
출력결과:
son method
분명 묵시적 형 변환이 된 클래스는 변환된 클래스 형의 메서드와 멤버 변수만을 참조할 수 있다 하였는데, 위의 결과는 Son클래스의 메서드가 호출된 것을 볼 수 있다.
이러한 기술을 가상 메서드라고 하고 이는 상속에서 상위 클래스와 하위클래스에 같은 이름의 메서드가 존재할 때 호출되는 메서드는 인스턴스에 따라 결정되는 것이다. 즉 선언한 클래스 형이 아닌 생성된 인스턴스의 메서드를 호출하는 것이다.
가상메서드(virtual method)
자바의 클래스는 멤버변수와 메서드로 이루어진다. 클래스를 생성하여 인스턴스가 만들어지면 멤버변수는 힙 메모리에 위치하지만 메서드는 메서드 영역에 따로 생성된다. 즉 같은 객체의 인스턴스를 여러 개 생성한다고 해서 메서드도 여러개 생성되지 않는다. 따라서 인스턴스가 달라도 동일한 메서드가 호출되는 것이다. 자바의 모든 메서드는 가상메서드이다.
'java' 카테고리의 다른 글
인터페이스 - 느슨한 결합력 (0) | 2021.04.25 |
---|---|
자바의 다형성 (0) | 2021.03.25 |
Java - 4강 추상 클래스, 템플릿 메서드, final예약어 (0) | 2021.02.21 |
Java -3강 다형성, instanceof, 다운캐스팅 (0) | 2021.02.21 |
Java-1강 상속 (0) | 2021.02.21 |