국비교육/국비교육 복습
day13_oop.poly2 : 다형성(polymorphism) + 업 캐스팅(up casting) (★)
Luver Duck
2022. 8. 14. 23:24
다음 요구사항에 맞게 프로그램을 구현
요구사항
- 사용자에게 Scanner를 이용하여 휴대폰 종류를 입력받는다
- 갤럭시22s
- 갤럭시폴드3
- 아이폰12
- 아이폰13
- 사용자에게 Scanner를 이용하여 수행할 작업의 종류를 입력받는다.
- 사진촬영
- 갤러리보기
- 통화
- 문자
- 모든 종류의 휴대폰은 다음 기능들을 가지고 있다.
- 사진촬영(camera)
- 갤러리보기(gallery)
- 통화(call)
- 문자(sms)
- 모든 메소드는 다음과 같은 형태로 출력되어야 한다
- ex : 아이폰12 선택 후 사진촬영 선택 시 아이폰12의 사진촬영 기능 실행 메세지 출력
- 이 문제는 다형성을 이용해도 풀리고, 이용하지 않아도 풀린다.
- 상위 클래스는 원하는대로 구현
Phone 클래스 (슈퍼 클래스 + 추상 클래스)
package day13_oop.poly2;
// 슈퍼 클래스 + 추상 클래스
public abstract class Phone {
// 멤버 필드
// 생성자
// 메소드
// 추상 메소드
public abstract void camera();
public abstract void gallery();
public abstract void call();
public abstract void sms();
}
Galaxy22s 클래스
package day13_oop.poly2;
public class Galaxy22s extends Phone {
// 멤버 필드
// 생성자
// 메소드
// 추상메소드 오버라이딩
@Override
public void camera() {
System.out.println("Galaxy22s의 사진촬영 기능 실행");
}
@Override
public void gallery() {
System.out.println("Galaxy22s의 갤러리보기 기능 실행");
}
@Override
public void call() {
System.out.println("Galaxy22s의 통화 기능 실행");
}
@Override
public void sms() {
System.out.println("Galaxy22s의 문자 기능 실행");
}
}
GalaxyFold3 클래스
package day13_oop.poly2;
public class GalaxyFold3 extends Phone {
// 멤버 필드
// 생성자
// 메소드
// 추상메소드 오버라이딩
@Override
public void camera() {
System.out.println("GalaxyFold3의 카메라 기능 실행");
}
@Override
public void gallery() {
System.out.println("GalaxyFold3의 갤러리보기 기능 실행");
}
@Override
public void call() {
System.out.println("GalaxyFold3의 통화 기능 실행");
}
@Override
public void sms() {
System.out.println("GalaxyFold3의 문자 기능 실행");
}
}
IPhone12 클래스
package day13_oop.poly2;
public class IPhone12 extends Phone {
// 멤버 필드
// 생성자
// 메소드
// 추상메소드 오버라이딩
@Override
public void camera() {
System.out.println("IPhone12의 카메라 기능 실행");
}
@Override
public void gallery() {
System.out.println("IPhone12의 갤러리보기 기능 실행");
}
@Override
public void call() {
System.out.println("IPhone12의 통화 기능 실행");
}
@Override
public void sms() {
System.out.println("IPhone12의 문자 기능 실행");
}
}
IPhone13 클래스
package day13_oop.poly2;
public class IPhone13 extends Phone {
// 멤버 필드
// 생성자
// 메소드
// 추상메소드 오버라이딩
@Override
public void camera() {
System.out.println("IPhone13의 카메라 기능 실행");
}
@Override
public void gallery() {
System.out.println("IPhone13의 갤러리보기 기능 실행");
}
@Override
public void call() {
System.out.println("IPhone13의 통화 기능 실행");
}
@Override
public void sms() {
System.out.println("IPhone13의 문자 기능 실행");
}
}
메인 메소드
package day13_oop.poly2;
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 기종 입력
System.out.print("기종 선택 : ");
int name = sc.nextInt();
// 기능 입력
System.out.println("기능 선택 : ");
int function = sc.nextInt();
// 해당 객체 생성 - 업 캐스팅 : 하위 클래스를 상위 클래스로 보관
Phone phone;
if(name == 1) {
phone = new Galaxy22s();
}
else if(name == 2) {
phone = new GalaxyFold3();
}
else if(name == 3) {
phone = new IPhone12();
}
else {
phone = new IPhone13();
}
// 기능 실행
if(function == 1) {
phone.camera();
}
else if(function == 2) {
phone.gallery();
}
else if(function == 3) {
phone.call();
}
else {
phone.sms();
}
sc.close();
}
}
** 다형성의 조건
1) 상속 관계
2) 메소드 재정의
- 서브 클래스인 Galaxy22s, GalaxyFold3, IPhone12, IPhone13을 슈퍼 클래스인 Phone의 형태로 저장하는 것처럼
서브 클래스를 슈퍼 클래스의 형태로 형 변환 하는 것을 업 캐스팅이라고 한다
- 업 캐스팅이 가능한 이유
슈퍼 클래스의 상속을 받은 서브 클래스는 슈퍼 클래스의 모든 필드, 메소드를 상속받았으므로
슈퍼 클래스가 되기 위한 모든 필드, 메소드를 가지고 있기 때문이다
- 객체 생성과 기능 실행의 if문에서
else가 아닌 else if로 'name == 4' 또는 'function == 4'인 경우를 직접 지정하려면 phone의 초기값을 설정해야 한다