업캐스팅과 다운캐스팅
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 30번째.
이전 레슨에서는 부모 타입 변수가 자식 객체를 담을 수 있다는 것을 배웠습니다: Animal myPet = new Dog(). 이 할당을 업캐스팅이라고 하며, Dog는 항상 Animal이므로 자동으로 이루어집니다.
Upcasting은 상속 계층 구조에서 위로 이동합니다. 이는 암시적이며 항상 안전합니다.
Dog dog = new Dog();
Animal animal = dog; // 업캐스팅 - 자동upcast하면 parent class에 정의된 methods만 액세스할 수 있습니다. 자식 클래스에만 있는 methods는 객체가 내부적으로 여전히 Dog임에도 숨겨집니다.
Downcasting은 반대 방향으로 진행되며, parent 참조를 다시 자식 타입으로 변환합니다. 항상 안전한 것은 아니므로 explicit 캐스팅이 필요합니다.
Animal animal = new Dog(); // 업캐스팅
Dog dog = (Dog) animal; // 다운캐스팅 - 명시적 캐스트 필요
dog.bark(); // 이제 Dog 메서드에 접근할 수 있습니다Downcasting은 위험합니다. 객체가 실제로 캐스팅하려는 유형이 아니라면 Java는 런타임에 ClassCastException을 발생시킵니다.
Animal animal = new Cat();
Dog dog = (Dog) animal; // 컴파일은 되지만, 런타임에 충돌합니다!컴파일러는 선언된 타입만 보기 때문에 이 오류를 포착할 수 없습니다. 실제 객체 타입은 프로그램이 실행될 때만 알 수 있습니다. 다음 레슨에서는 다운캐스팅하기 전에 객체의 타입을 안전하게 확인하는 방법을 배웁니다.
챌린지
쉬움업캐스팅과 다운캐스팅이 실제로 어떻게 작동하는지 보여 주는 미디어 플레이어 시스템을 만들어 봅시다. 미디어 유형의 계층 구조를 만들고 부모 참조와 자식 참조 간의 변환을 연습하게 됩니다.
코드를 네 개의 파일로 구성합니다.
Media.java: 모든 미디어 유형이 공유하는 기본 class를 만듭니다. 모든 미디어 항목에는titlefield (String)가 있습니다. 이를 initialize하는 constructor, getter methodgetTitle(), 그리고 다음을 출력하는 methodplay()를 포함하세요:Playing: [title]Song.java: Media를 extends하는 class를 만듭니다. Song에는 추가로artistfield (String)가 있습니다. 부모 초기화에는super를 사용하세요.play()를 Override하여 다음을 출력하세요:Playing song: [title] by [artist]. 다음을 출력하는 methodshowArtist()를 추가하세요:Artist: [artist]Podcast.java: Media를 extends하는 또 다른 class를 만듭니다. Podcast에는episodefield (int)가 있습니다.play()를 Override하여 다음을 출력하세요:Playing podcast: [title] - Episode [episode]. 다음을 출력하는 methodshowEpisode()를 추가하세요:Episode: [episode]Main.java: 미디어 유형을 사용하여 업캐스팅과 다운캐스팅을 보여 주세요. 네 가지 입력, 즉 노래 제목, 아티스트 이름, 팟캐스트 제목, 에피소드 번호를 받습니다.먼저 Song을 만들고 이를 Media 참조로 업캐스팅합니다. 이 참조에서
play()를 호출하여 런타임 다형성이 작동하는 모습을 확인하세요.다음으로 해당 Media 참조를 다시 Song으로 다운캐스팅하고
showArtist()를 호출하여 자식 고유의 method에 접근하세요.그런 다음 Podcast를 만들고 이를 Media 참조로 업캐스팅합니다. 이 참조에서
play()를 호출하세요.마지막으로 해당 Media 참조를 다시 Podcast로 다운캐스팅하고
showEpisode()를 호출하세요.
네 가지 입력, 즉 노래 제목 (String), 아티스트 이름 (String), 팟캐스트 제목 (String), 에피소드 번호 (int)를 받습니다.
출력은 네 줄이어야 합니다. 노래에 대한 두 줄(재생 출력과 아티스트 정보)과 팟캐스트에 대한 두 줄(재생 출력과 에피소드 정보)입니다. 업캐스팅을 사용하면 서로 다른 미디어 유형을 일관된 방식으로 다룰 수 있고, 다운캐스팅을 사용하면 각 유형의 고유한 기능에 접근할 수 있다는 점에 주목하세요!
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 입력 읽기
String songTitle = scanner.nextLine();
String artistName = scanner.nextLine();
String podcastTitle = scanner.nextLine();
int episodeNumber = scanner.nextInt();
// TODO: Song을 생성하고 Media 참조로 업캐스트하세요
// TODO: Media 참조에서 play()를 호출하세요 (다형성을 보여줍니다)
// TODO: Media 참조를 다시 Song으로 다운캐스트하세요
// TODO: Song 참조에서 showArtist()를 호출하세요
// TODO: Podcast를 생성하고 Media 참조로 업캐스트하세요
// TODO: Media 참조에서 play()를 호출하세요
// TODO: Media 참조를 다시 Podcast로 다운캐스트하세요
// TODO: Podcast 참조에서 showEpisode()를 호출하세요
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조직접 연습해 보세요: 온라인 Java 컴파일러