Programming Language/Java

상속과 인터페이스를 통해 휴대폰에 필요한 기술들을 제원으로 출력하는 프로그램을 작성하기

Ma_Sand 2022. 3. 8. 22:06
반응형
// Phone 클래스(interface)

public interface Phone {
    // public static final 생략 가능(어차피 상수 필드이므로)
	char[] NUMBERPAD = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '0', '#'};
	
    // 추상 메소드
	/*public abstract*/ String makeCall();  // 전화 걸기
	String takeCall(); // 전화 받기  
    // public abstract 생략 가능(interface이므로)
}



// Camera 클래스(interface)

public interface Camera {
	String picture();  // 촬영 방식 추상메소드
}



// CellPhone 클래스(interface) - Phone과 Camera 클래스에게 상속 받는다.

public interface CellPhone extends Phone, Camera {  
	String charge();  // 충전 방식 추상메소드
}



// NotePen 클래스(interface)

public interface NotePen {
	boolean PEN_BUTTON = true;
	boolean bluetoothPen();  // 블루투스펜 탑재 여부 추상메소드
}



// SmartPhone 클래스(CellPhone과 TouchDisplay를 implements)
// implements는 extends와 달리 다중 상속이 가능하다.
public abstract class SmartPhone implements CellPhone, TouchDisplay {
	private String maker;
	
	public SmartPhone() {  // 기본 생성자
		
	}
	// 스마트폰이 제원 정보를 출력하기 위한 추상메소드
	public abstract String printInformation();
	
	// 데이터 반환 및 초기화 메소드
	public void setMaker(String maker) {
		this.maker = maker;
	}
	public String getMaker() {
		return maker;
	}
}



// TouchDisplay 클래스

public interface TouchDisplay {
	String touch();  // 터치 방식 추상메소드
}



// GalaxyZFlip3 클래스

public class GalaxyZFlip3 extends SmartPhone implements NotePen {
	public GalaxyZFlip3() {   // 기본 생성자, 부모에게 상속받은 maker 필드를 "삼성"으로 초기화
		super.setMaker("삼성");
	}
	public String makeCall() {
		return "번호를 누른 후 통화 버튼을 누름";
	}
	public String takeCall() {
		return "수신 버튼을 누름";
	}
	public String picture() {
		return "1600만 화소 듀얼 카메라";
	}
	public String charge() {
		return "고속 충전과 고속 무선 충전 지원";
	}
	public String touch() {
		return "정전식 터치, 와콤펜 지원";
	}
	public boolean bluetoothPen() {
		return false;
	}
	@Override
	public String printInformation() {  // 실행 화면을 참조하여 오버라이딩
		return "갤럭시 Z 플립3는 " + getMaker() + "에서 만들어졌고 제원은 다음과 같다.\n"
               + makeCall() + "\n" + takeCall() + "\n" + picture() + "\n" + charge()
               + "\n" + touch() + "\n블루투스펜 탑재 여부: " + bluetoothPen() + "\n";
	}
}



// BlackBerry 클래스

public class BlackBerry extends SmartPhone implements NotePen {
	public BlackBerry() {  // 기본 생성자, 부모에게 상속받은 maker 필드를 "BlackBerry"로 초기화
		setMaker("BlackBerry");
	}
	public String makeCall() {
		return "번호를 누른 후 통화 버튼을 누름";
	}
	public String takeCall() {
		return "수신 버튼을 누름";
	}
	public String picture() {
		return "1200만 화소 카메라";
	}
	public String charge() {
		return "기본 충전";
	}
	public String touch() {
		return "버튼 누름";
	}
	public boolean bluetoothPen() {
		return false;
	}
	@Override
	public String printInformation() {  // 실행 화면을 참조하여 오버라이딩
		return "BlackBerry는 " + getMaker() + "에서 만들어졌고 제원은 다음과 같다.\n"
               + makeCall() + "\n" + takeCall() + "\n" + picture() + "\n" + charge()
               + "\n" + touch() + "\n블루투스펜 탑재 여부: " + bluetoothPen() + "\n";
	}
}



// PhoneController 클래스

public class PhoneController {
	// Phone 객체 배열의 각 인덱스에 GalaxyZFlip3, BlackBerry 객체를 저장하고, 
	// 각 객체의 정보를 문자열 배열에 저장하여 문자열 배열 주소를 반환하는 메소드
	private String[] result = new String[2];
	
	public String[] method() {
		Phone[] p = new Phone[2];
		p[0] = new GalaxyZFlip3();
		p[1] = new BlackBerry();
    
		/*
		 * 부모 참조변수에 자식 객체를 담은 경우
		 * -> 부모 참조변수만을 이용해서는 자식 객체에서 생성된 멤버에 접근 불가
		 * -> 다운 캐스팅으로 접근
		 */
				
    // for문을 이용하여 Phone 객체 배열에 모든 인덱스를 참조
		for(int i = 0; i < p.length; i++) {
        
            // Phone 객체 배열에 instanceof로 GalaxyZFlip3의 객체 타입 참조하여 오버라이딩된 
            // printInformation() 호출
			if(p[i] instanceof GalaxyZFlip3) {  
				result[i] = ((GalaxyZFLip3)p[i]).printInformation();
			} 
            // Phone 객체 배열에 instanceof로 BlackBerry의 객체 타입 참조하여 오버라이딩된 
            // printInformation() 호출
            else if(p[i] instanceof BlackBerry) {
				result[i] = ((BlackBerry)p[i]).printInformation();
			}
		}
		return result;
	}
}



// Run 클래스(실행 클래스)

import com.cd.chobo.controller.PhoneController;

public class Run {

	public static void main(String[] args) {  // PhoneController 객체를 생성하여 method() 호출
		
		PhoneController pc = new PhoneController();  // PhoneController 객체 생성
		String[] sArr = pc.method();  // method() 호출
		
    // 반복문을 이용하여 String배열의 각 인덱스 출력
		for(int i = 0; i < sArr.length; i++) {
			System.out.println(sArr[i]);
		}
	}
}
반응형