JAVA 인터페이스를 사용해야 하는 이유
JAVA에서 인터페이스를 왜 사용해야할까?
1. 구현체가 어떤 게 오든 받아줄 수 있게 타입 형태로 제시하기 위함 => implements Phone
추상클래스 extends는 공통 기능 상속, 규약 구현(추상메소드)
인터페이스는 implements 공통 규약, 구현
static class ApplePhone implements Phone{
// 코드 구현
}
static class SamsungPhone implements Phone{
// 코드 구현
}
static class Person{
Phone phone; // ApplePhone, SamsungPhone 다 가능
}
2. 구현체(객체)를 필요 = 구현체 사용 = 메소드를 호출
메소드 선언(이름, 매개변수) 통일
메소드의 이름과 매개변수를 통일해줘야하는데 이때, 접근제어자를 쓰지 않으면 아래와 같은 오류가 난다
'useYoutube()' in 'day03.EX06.ApplePhone' clashes with 'useYoutube()' in 'day03.EX06.Phone'; attempting to assign weaker access privileges ('package-private'); was 'public'
인터페이스는 메소드 public이 생략되어있기 때문에 클래스에서 메소드를 선언할 땐 접근제어자를 붙여줘야한다
필드는 프라이빗으로, 메소드는 퍼블릭으로 많이 사용한다고 한다
public interface Phone {
int BATTERY_CAPACITY = 100;
void charge();
void operateKakaotalk();
void useYoutube();
void checkBattery();
void turnOn();
void turnOff();
}
static class ApplePhone implements Phone{
int battery=70;
final int BATTERY_CAPACITY = 100;
boolean isOn = true;
ApplePhone(){
}
@Override
public void charge(){
if(battery == 100){
System.out.println("100%");
}else if(battery <=90){
battery +=10;
System.out.println(battery+"%");
}else{
battery += (BATTERY_CAPACITY-battery);
System.out.println(battery+"%");
}
}
@Override
public void operateKakaotalk(){
if(battery>5){
battery-=5;
} else {
battery =0;
turnOff();
}
}
@Override
public void useYoutube(){
if(battery>10){
battery-=10;
} else {
battery =0;
turnOff();
}
}
@Override
public void checkBattery(){
System.out.println(battery);
}
public void turnOn(){
isOn = true;
}
public void turnOff(){
isOn = false;
}
}
추상클래스와 인터페이스 비교
추상클래스
: 상속할 각 객체들의 공통점을 찾아 추상화, 같은 부모클래스를 상속하며 부모클래스가 가진 기능들을 구현해야할 경우 사용 (상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많음)
인터페이스
: 서로 관련성이 없는 클래스들을 묶어주고 싶을 때, 다중 상속(구현)을 통한 추상화 설계
구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용