국비교육/국비교육 복습

day13_oop.poly2 : 다형성(polymorphism) + 업 캐스팅(up casting) (★)

Luver Duck 2022. 8. 14. 23:24

다음 요구사항에 맞게 프로그램을 구현

요구사항

  • 사용자에게 Scanner를 이용하여 휴대폰 종류를 입력받는다
    1. 갤럭시22s
    2. 갤럭시폴드3
    3. 아이폰12
    4. 아이폰13
  • 사용자에게 Scanner를 이용하여 수행할 작업의 종류를 입력받는다.
    1. 사진촬영
    2. 갤러리보기
    3. 통화
    4. 문자
  • 모든 종류의 휴대폰은 다음 기능들을 가지고 있다.
    • 사진촬영(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의 초기값을 설정해야 한다