1. 자동 타입 변환(업캐스팅 - Upcasting) : 프로그램 실행 도중 자동적으로 타입 변환이 이루어짐
자식은 부모 타입으로 자동으로 변환이 가능
바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환 가능
부모 클래스에 선언된 필드와 메서드만 접근이 가능
=> but, 메서드가 자식 클래스에서 재정의되었다면 자식 클래스의 메서드가 호출
자식 클래스에서 추가한 메서드나 필드는 접근할 수 없음
=> 이러한 이유로 강제 타입 변환을 사용
자동 타입 변환 예시
class Animal {
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
void sound() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
// Dog 객체를 Animal 타입으로 업캐스팅
Animal animal = new Dog(); // 업캐스팅 (자동)
animal.sound(); // 멍멍! 재정의된 자식 메서드가 호출
}
}
2. 강제 타입 변환(다운캐스팅 - Downcasting) : 부모 타입을 자식 타입으로 변환하는 것
자식 타입이 부모 타입으로 자동 타입 변환 후 다시 자식 타입으로 변환할 때 강제 타입 변환 사용 가능
=> 명시적 변환 사용해야 한다.
instanceof 연산자 사용 : 강제 타입 변환 하기 전에 객체가 실제로 해당 타입인지 확인
다운캐스팅을 사용하는 이유는 자식 클래스에서만 정의된 메서드나 필드에 접근하기 위해서
강제 타입 변환 예시
class Animal {
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
void sound() {
System.out.println("멍멍!");
}
void fetch() {
System.out.println("공을 물어옵니다.");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // 업캐스팅 (자동)
// 다운캐스팅 전에 타입이 맞는지 확인
if (animal instanceof Dog) {
Dog dog = (Dog) animal; // 다운캐스팅
dog.fetch(); // 공을 물어옵니다.
}
}
}
[문제 풀이]
HttpServlet클래스는 abstract로 작성된 추상 클래스이며
그 안에 service() 메서드는 abstract로 작성된 추상 메서드이다.
따라서 객체를 만들지 못하고 상속받은 클래스에서 구현해야 한다.
LoginServlet 클래스와 FileDownloadServlet 클래스는 HttpServlet 클래스를 상속하여
service() 메서드를 각 클래스에서 구현하였다.
method(HttpServlet servlet) 메서드는 매개변수로 HttpServlet 타입을 받는다.
LoginServlet와 FileDownloadServlet 는 자동 타입 변환되어 각자의 구현된 service() 메서드를 호출한다.