05-07 인터페이스 개념과 간단한 예제 코드 - 개발새발자 작성 일기

개발새발자·2023년 11월 5일
1

자바 개념

목록 보기
15/15

인터페이스

예제

class Animal {
    String name;

    void setName(String name) {
        this.name = name;
    }
}

class Tiger extends Animal {
}

class Lion extends Animal {
}

class ZooKeeper {
    void feed(Tiger tiger) {  // 호랑이가 오면 사과를 던져 준다.
        System.out.println("feed apple");
    }

    void feed(Lion lion) {  // 사자가 오면 오렌지를 던져준다.
        System.out.println("feed orange");
    }
}

public class Sample {
    public static void main(String[] args) {
        ZooKeeper zooKeeper = new ZooKeeper();
        Tiger tiger = new Tiger();
        Lion lion = new Lion();
        zooKeeper.feed(tiger);  // feed apple 출력
        zooKeeper.feed(lion);  // feed orange 출력
    }
}

호랑이 - 사과
사자 - 오렌지

이 루틴의 코드인데 만약 동물이 호랑이와 사자 말고도 원숭이, 강아지, 고양이가 추가된다면 코드가 어떻게 달라질까

코드가 추가된 예제

class Animal {
    String name;

    void setName(String name) {
        this.name = name;
    }
}

class Tiger extends Animal {
}

class Lion extends Animal {
}

class Monkey extends Animal {
}

class Dog extends Animal {
}

class Cat extends Animal {
}

class ZooKeeper {
    void feed(Tiger tiger) {  // 호랑이가 오면 사과를 던져 준다.
        System.out.println("feed apple");
    }

    void feed(Lion lion) {  // 사자가 오면 오렌지를 던져준다.
        System.out.println("feed orange");
    }
    
    void feed(Monkey monkey) { // 원숭이가 오면 바나나를 던져준다.
    	System.out.println("feed banana");
    }
    
    void feed(Dog dog) { // 강아지가 오면 감자를 던져준다.
    	System.out.println("feed potato");
    }
    
    void feed(Cat cat) { // 고양이가 오면 생선을 던져준다.
    	System.out.println("feed fish");
    }
    
}

public class Sample {
    public static void main(String[] args) {
        ZooKeeper zooKeeper = new ZooKeeper();
        Tiger tiger = new Tiger();
        Lion lion = new Lion();
        Monkey monkey = new Monkey();
        Dog dog = new Dog();
        Cat cat = new Cat();
        
        zooKeeper.feed(tiger);  // feed apple 출력
        zooKeeper.feed(lion);  // feed orange 출력
        zooKeeper.feed(monkey); // feed banana 출력
        zooKeeper.feed(dog); // feed potato 출력
        zooKeeper.feed(cat); // feed fish 출력
    }
}

점점 추가하다보니 zooKeeper 클래스 안이 길어지는 게 보인다

이런 반복된 복잡을 줄이는 방법이 분명 존재할텐데
그 방법을 뭐라 부를까

이 때 바로 interface를 사용하는 것이다
(잘 이해가 안가도 상관없다. 사용한 예제를 먼저 살펴보자)

interface를 사용한 예제


interface Predator {
    String getFood();
}
class Animal {
    String name;

    void setName(String name) {
        this.name = name;
    }
}

class Tiger extends Animal implements Predator {
    public String getFood() {
        return "apple";
    }
}

class Lion extends Animal implements Predator {
    public String getFood() {
        return "banana";
    }
}

class ZooKeeper {
    void feed(Predator predator) {
        System.out.println("feed " + predator.getFood());
    }

}

public class Sample {
    public static void main(String[] args) {
        ZooKeeper zooKeeper = new ZooKeeper();
        Tiger tiger = new Tiger();
        Lion lion = new Lion();
        zooKeeper.feed(tiger);
        zooKeeper.feed(lion);
    }
}

반복되는 형태이면서 각자 class 따라 내용만 다른 부분인 먹이 부분(apple, orange, banana ..) 이 부분을 interface로 만든다

interface Predator {
    String getFood();
}

이렇게 말이다
apple, orange, banana .. 이 부분이 String 형태이므로 String 으로 작성해주고 음식 관련이니까 getFood()로 작성해주기로 하자 (getFood는 함수 이름일 뿐 getter, setter와 상관없음)


그리고 Tiger, Lion 등 class에 implements Predator 이렇게 인터페이스를 추가해주고 각자에 맞는 메서드를 만들어준다
그러면 interface를 사용해 코드를 구현할 수 있게 된거다

처음에는 이해하기 어려울 수 있다


내가 이해한 바대로 설명해보자면 interface를 사용하지 않은 코드는
각자 포털이 있는 거였다
사자가 지나드는 포털, 호랑이가 지나드는 포털..
그래서 동물의 수만큼 포털이 있는거다 사자는 사자포털에 지나다니고 호랑이는 호랑이포털에 지나다니고
근데 그 포털이 하는 일은 음식 종류 찾아주는 거다
사자포털에는 사과를 반환하고 호랑이포털은 오렌지를 반환하고

근데!
포털이 하나만 있어도 되지 않나 싶은 거다
중심 포털 하나만 있고 들어오는 동물이 뭐인지만 알면 그에 맞는 음식을 반환할 수 있지 않은가
포털 하나만 있어서 사자가 들어오면 사과를 반환하고 호랑이가 들어오면 오렌지를 반환하고
굳이 사자 하나, 호랑이 하나 포털 있기에는 운영비가 많이 들 것 아닌가

그래서 그 중심 포털이 interface 인거고 이 포털 이름을 getFood라고 붙여 놓았다
이러면 동물들이 계속 추가되어도 포털을 계속 만드는 게 아니라 중심 포털에 입력, 출력값만 입력해놓아도 되니까

아무튼 이상한 소리지만 한명이라도 이해하고 도움이 되었으면 장땡이라는 마인드로 적어놓았다

profile
바삭하고 촉촉한 쿠키로 살자

0개의 댓글