음식을 생각해보자.
음식에는 한국 음식 일본 음식 이탈리아 음식 등등 많을 것이다.
예시가 이상 할 수 있겠지만 각 나라별 음식 메서드를 추가 할 때, 공통적으로 해당 국가의 식당의 갯수를 반드시 포함 해야 한다고 가정해 보자.
추상화를 쓰면 해결할 수 있을것이다. https://acid7937.tistory.com/24
그런데 한국음식 일본음식 이탈리아음식을 봤을때...
뭔가... 한국음식이랑 일본음식을 젓가락 쓰는 식문화권으로 따로 묶어버리고 싶다. 그럼 이때 어떻게 묶어버릴까?
이때 사용하는게 인터페이스 이다. (추상화랑 이때 갈린다.)
바로 코드를 살펴보자.
abstract class food{
abstract void Numberofrestaurants();
}
class koreanfood extends food implements asianfood{
public void Numberofrestaurants(){
System.out.println("식당의 수는 669,000");
}
public void kimchi(){
System.out.println("김치는 맛있어");
}
public void sighye(){
System.out.println("식혜는 시원해!");
}
public void chopsticks(){
System.out.println("쇠젓가락 좋아해요");
}
}
class japanesefood extends food implements asianfood{
public void Numberofrestaurants(){
System.out.println("식당의 수는 1,410,000");
}
public void sushi(){
System.out.println("스시는 맛있어");
}
public void Yakult(){
System.out.println("야쿠르트는 달달해!");
}
public void chopsticks(){
System.out.println("나무젓가락 좋아해요");
}
}
class italianfood extends food{
public void Numberofrestaurants(){
System.out.println("식당의 수는 152,881");
}
public void pizza(){
System.out.println("피자는 맛있어");
}
public void lasagna(){
System.out.println("라자냐는 맜있어.");
}
}
public interface asianfood {
public abstract void chopsticks(); //public abstact 작성 생략 가능.
}
public class Main{
public static void main(String[] args) {
koreanfood f1 = new koreanfood();
f1.kimchi();
f1.sighye();
f1.Numberofrestaurants();
japanesefood f2 = new japanesefood();
f2.sushi();
f2.Yakult();
f2.Numberofrestaurants();
italianfood f3 = new italianfood();
f3.pizza();
f3.lasagna();
f3.Numberofrestaurants();
asianfood[] as = new asianfood[]{
f1,f2
};
for(int i = 0; i < as.length; i++){
as[i].chopsticks();
};
}
}
출력은 다음과 같다.
김치는 맛있어
식혜는 시원해!
식당의 수는 669,000
스시는 맛있어
야쿠르트는 달달해!
식당의 수는 1,410,000
피자는 맛있어
라자냐는 맜있어.
식당의 수는 152,881
쇠젓가락 좋아해요
나무젓가락 좋아해요
-----------------------------------------------------------------------------------------------------------------------
코드들을 보니 어떤가
갑자기 implements가 보이고 interface라는 녀석도 보일것이다.
인터페이스는 추상화 메서드들의 집합이다. 또한 직접 인스턴스를 만들수도 없다. 어떻게 보면 추상화랑 같아 보인다.
또한 인터페이스의 메서드들은 무.조.건 추상화 메서드만 작성이 가능하기에 기본형이 public abstact 이다 그래서 주석 설명처럼 지워도 동작하는데 문제가 없다.
추상화를 상속받을땐 abstact 를 써주지만 인터페이스를 상속받을때는 implements를 써주면 된다.
추상화는 추상클래스에서 선언된 메서드들이 상속받는 자식에서 다써줘야 한다.(자식이 추상클래스가 아닌이상.)
인터페이스는 한번 더 따로 묶어서 날개를 달아 준다고 생각하면 좋다. (코드로 안만들었지만 다중 구현 가능해서 날개도 달고 부스터도 달고 계속 추가 할수 있음.)
--------------------------------------------------------------------------------------------------------------------------------------------------------------
참고로 자세히 설명은 안했지만 인터페이스는...
인터페이스 부모는 인터페이스만 가능.
다중 상속이 가능함. 추상이라서 충돌이 없음.
상수들도 항상 public static final 을 써 줘야 한다. 그래서 생략 가능
'자바 > 정리' 카테고리의 다른 글
(JAVA) 예외 (1) | 2022.11.30 |
---|---|
(JAVA)다형성 (0) | 2022.11.25 |
(JAVA) 추상화 (0) | 2022.11.17 |
(JAVA)캡슐화 (getter와 setter) (0) | 2022.11.13 |
(JAVA)캡슐화 (접근제어자) (0) | 2022.11.13 |