본문 바로가기
(혼) (공) (자)

인터페이스

by 만석이 2024. 1. 17.
모든 메서드가 추상메서드인 추상클래스를 '인터페이스'라고 부른다.

인터페이스는 추상메서드와 상수로만 이루어져 있으며 일반적인 방법으로는 객체를 만들수없기 때문에 클래스라고 부를수없다.


그리고 인터페이스를 상속받을때는 implements 를 붙여줘야한다.

 

 

예제를보자

 

public class Person {

Phone p;//인스턴스 변수 선언

public Person(Phone p) {
this.p=p;
}

public void buyNewPhone(Phone p) {
this.p = p;
System.out.println("---------------");
System.out.println("새폰을 구매했습니다.");
}

public void turnOnPhone() {
p.poweron();
}

public void turnOffPhone() {
p.poweroff();
}

public void watchtube() {
if(p.isOn()) {
p.watchUtubte();
}else {
System.out.println("전원이 꺼져있어서 시청불가능");
}
}

public void chargePhone() {
p.charge();
}

}
Person 클래스에서는 공통적으로 사용할 메서드들을 정리했다. 

1.사람이름을 받는 메서드를 만들었다.
2.사람이 휴대폰 구매하면 폰이름을 받는 메서드를 만들었다.
3.사람이 휴대폰을 켰을때, 껏을때,유튜브를 볼때 메서드를 각각 만들어줬다.

4.유튜브 메서드는 전원이 켜져있으면 볼수있고, 꺼져있으면 
  출력문을 실행시켰다.

5.휴대폰 충전 메서드를 만들어주었다.





















public interface Phone {


public static final int Max_BATTERY_CAPACITY = 100;

abstract void poweron();
abstract void poweroff();
abstract boolean isOn();
abstract void watchUtubte();
abstract void charge();

}
Phone 인터페이스 클래스에서는 자식클래스에서 공통적으로 쓰이는 메서드를 명시해주었다.

메서드 전부 추상메서드이다.

final 은 상수로써 한번 지정시 변경이 불가능하다.

 

public class PineApplePhone 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 Power");
}
}


@Override
public void poweroff() {
System.out.println("Power Off");
isOn = false;
}


@Override
public boolean isOn() {

if(isOn) {
return true;
}else {
return false;
}

// TODO Auto-generated method stub

}


@Override
public void watchUtubte() {

if(batteryCapacity>10) {
System.out.println("----utube---");
batteryCapacity-=10;
System.out.println("batteryCapacity"+batteryCapacity);
}else {
System.out.println("Low battery");
poweroff();
}

}


@Override
public void charge() {

if( chargeing <20 ) {
System.out.println("chargeing");
batteryCapacity+=5;
System.out.println("charged"+batteryCapacity);
}else {
System.out.println("you don't charge");
System.out.println("잔여배터리"+batteryCapacity);
}
}


}
PineApplePhone 클래스는 Phone 클래스를 상속받는다.
PineApplePhone 클래스는 추상메서드를 무조건 오버라이딩
해줘야한다.


poweron() 메서드 부터보자

batteryCapacity 이 30이상이면 Power On 출력 해주고
isOn을
True로 만들어준다. 
그렇지 않으면  Low Power을 출력해준다.


poweroff() 메서드를 보자

Power Off 출력해주고 isOn을 Flase로 만들어준다.



boolean isOn() 메서드를보자

만약에 isOn이 True면 True를 리턴하고 
False면 False를 리턴한다.








watchUtubte() 메서드를 보자

만약에 batteryCapacity가 10보다 크다면 유튜브 출력해준다.
출력후에 batteryCapacity -10 을 해주고 저장한다.
그후에 batteryCapacity 를 재출력한다.

그렇지않고 batteryCapacity가 10 보다 작거나 같다면 
Low battery 를 출력한다.
그리고 poweroff() 메서드를 실행한다.








charge()메서드를 보자

만약에 batteryCapacity 가 20보다 작다면 chargeing을 출력
그리고 batteryCapacity +5하고 저장한다.
그 후에 batteryCapacity 을 재 출력한다.

그렇지않고 batteryCapacity 가 20보다 크거나 같다면 

you don't charge를 출력한다.
그 후에 batteryCapacity 을 재 출력한다.









 

public class PineApplePhone 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 Power");
}
}


@Override
public void poweroff() {
System.out.println("Power Off");
isOn = false;
}


@Override
public boolean isOn() {

if(isOn) {
return true;
}else {
return false;
}

// TODO Auto-generated method stub

}


@Override
public void watchUtubte() {

if(batteryCapacity>10) {
System.out.println("----utube---");
batteryCapacity-=10;
System.out.println("batteryCapacity"+batteryCapacity);
}else {
System.out.println("Low battery");
poweroff();
}

}


@Override
public void charge() {

if( chargeing <20 ) {
System.out.println("chargeing");
batteryCapacity+=5;
System.out.println("charged"+batteryCapacity);
}else {
System.out.println("you don't charge");
System.out.println("잔여배터리"+batteryCapacity);
}
}


}
//PineApplePhone 클래스와 메서드 방식이 비슷하니 생략//




public class PhoneMain {
public static void main(String[] args) {

PineApplePhone pp = new PineApplePhone();

Person min = new Person(new PineApplePhone());

min .turnOnPhone();

for(int i =0; i<6; i++) {
min  .watchtube();

if(i%3==0) {
min  .chargePhone();
}
}

min .buyNewPhone(new ThreeStatPhone());

min .turnOnPhone();

for(int i =0; i<6; i++) {
min  .watchtube();

if(i%3==0) {
min  .chargePhone();
}
}
}




}
PineApplePhone 객체를 변수pp에 담아주었다.

Person min = new Person(new PineApplePhone());

person객체를 만들껀데 PineApplePhone객체를 매개변수로
받았다.

그렇게 되면 min안에는
Person메서드에

PineApplePhone객체가 들어있는  min 객체를 만들게 된다.

즉 min 안에있는 메서드를로
PineApplePhone 객체를 호출할

수있게 된다는것이다.

그후 
min .turnOnPhone(); 해주면 오버라이딩된 
PineApplePhone의 turnOnPhone() 메서드가 실행된다.

for 문 을써서 유튜브를 6번 보게한다. 
유튜브 한번 볼때마다 batteryCapacity-=10 되고 
if 문이 있기때문에  i가 3의 배수일때 즉 3,6 마다 배터리의 
잔여량을 알려준다.

Person min = new Person(new PineApplePhone()); 의 
의미는 person의 생성자 매개변수에 PineApplePhone()객체를
넣는다. 그렇게 되면 p가 PineApplePhone가 되고
Person 매서드에  PineApplePhone()객체를 대입하게된다.

대입해서 얻은 값들이 min에 들어가게 되는것이다.


min .turnOnPhone(); 매서드를 실행시 p.poweron(); 메서드가실행된다.  왜냐하면 Person 의 메서드중
public void turnOnPhone() {
p.poweron();
}


turnOnPhone안에는 p.poweron(); 가 있기때문에 그렇다.



















'(혼) (공) (자)' 카테고리의 다른 글

내부클래스  (0) 2024.01.22
인터페이스-1  (0) 2024.01.22
Class - 추상화/추상메서드  (0) 2024.01.17
Class - 다형성 (2)  (0) 2024.01.16
Class 다형성 / 타입변환  (0) 2024.01.16