인터페이스 예제
Phone 인터페이스 : 배터리 상수와 여러가지 추상 메서드 작성
package ex9_interface;
public interface Phone {
//인터페이스 내에서 상수라고 인식하기 때문에 final 생략 가능
static int MAX_BATTERY_CAPACITY = 100;
//하나의 인터페이스에 두개 이상의 추상메서드 가능 / abstract 생략가능
public void powerOn();
public void powerOff();
public boolean isOn();
public void watchUtube();
public void charge();
}
SamsungPhone 클래스 : 앞의 인터페이스를 implements
package ex9_interface;
public class SamsungPhone implements Phone {
int batteryCapacity = 35;
boolean isOn = false;
@Override
public void powerOn() {
if(batteryCapacity >30) {
System.out.println("★★★폰이 켜졌습니다★★★");
isOn = true;
}
else
System.out.println("배터리가 부족합니다.");
}
@Override
public void powerOff() {
System.out.println("★★★폰이 꺼졌습니다★★★");
isOn = false;
}
@Override
public boolean isOn() {
if(isOn)
return true;
else
return false;
}
@Override
public void watchUtube() {
if(batteryCapacity > 15) {
System.out.println("---U튜브 시청중---");
batteryCapacity -= 10;
System.out.printf("잔여 배터리 : %d%%\n",batteryCapacity);
}
else {
System.out.println("배터리가 부족합니다.");
powerOff();
}
}
@Override
public void charge() {
if(batteryCapacity < Phone.MAX_BATTERY_CAPACITY - 20) {
System.out.println("---충전중---");
batteryCapacity += 10;
System.out.printf("잔여 배터리 : %d%%\n",batteryCapacity);
}
else {
System.out.println("충전할 필요가 없습니다.");
System.out.printf("잔여 배터리 : %d%%\n",batteryCapacity);
}
}
}
ApplePhone 클래스 : 앞의 인터페이스를 implements
package ex9_interface;
public class ApplePhone implements Phone {
int batteryCapacity = 40;
boolean isOn = false;
@Override
public void powerOn() {
if(batteryCapacity >30) {
System.out.println("★★★Power On★★★");
isOn = true;
}
else
System.out.println("Low battery");
}
@Override
public void powerOff() {
System.out.println("★★★Power Off★★★");
isOn = false;
}
@Override
public boolean isOn() {
if(isOn)
return true;
else
return false;
}
@Override
public void watchUtube() {
if(batteryCapacity > 15) {
System.out.println("---Watching Utube---");
batteryCapacity -=10;
System.out.printf("Remaining Battery : %d%%\n",batteryCapacity);
}
else {
System.out.println("Low battery");
powerOff();
}
}
@Override
public void charge() {
if(batteryCapacity < Phone.MAX_BATTERY_CAPACITY - 20) {
System.out.println("---Charging---");
batteryCapacity += 10;
System.out.printf("Remaining Battery : %d%%\n",batteryCapacity);
}
else {
System.out.println("You dont need to charge battery");
System.out.printf("Remaining Battery : %d%%\n",batteryCapacity);
}
}
}
Person 클래스 : 앞의 SamsungPhone과 ApplePhone을 사용하는 사람을 나타낸 클래스
package ex9_interface;
public class Person {
//휴대폰을 구입해 사용하는 사람 클래스
Phone p; //다형성 (Samsung or Apple 객체 둘다 받을 수 있다)
Person(Phone p){ //생성자를 통해 받아오거나
this.p = p;
}
//함수의 매개변수를 통해 받아오거나
public void buyNewPhone(Phone p) {
this.p = p;
System.out.println("새로운 폰을 샀습니다.");
}
public void turnOnPhone() {
p.powerOn();
}
public void turnOffPhone() {
p.powerOff();
}
public void watchUtube() {
if(p.isOn())
p.watchUtube();
else
System.out.println("폰이 꺼져있어 볼 수 없습니다");
}
public void charge() {
p.charge();
}
}
Main 클래스
package ex9_interface;
public class PhoneMain {
public static void main(String[] args) {
//익명 객체 생성
Person jimin = new Person(new ApplePhone());
jimin.turnOnPhone();
for(int i=0;i<6;i++) {
jimin.watchUtube();
if(i%3==0)
jimin.charge();
}
System.out.println();
jimin.buyNewPhone(new SamsungPhone());
jimin.turnOnPhone();
for(int i=0;i<6;i++) {
jimin.watchUtube();
if(i%3==0)
jimin.charge();
}
//인터페이스는 다양한 장점이 있다
//실제 구현 클래스의 내용을 전혀 보지않고 개발 코드로 객체 사용이 가능 -> 정보 은닉
//구현 클래스들이 독립적으로 사용될 수 있다
//개발 코드에서 객체의 변경이 필요할 때
//코드 내용 변경을 최소화 할 수 있다 -> 모듈화
}
}