반응형
// 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]);
}
}
}
반응형