본문 바로가기
자바

[자바] 인터페이스와 추상 클래스 (feat. ChatGPT)

by kdohyeon (김대니) 2023. 3. 3.
반응형

신입 개발자 단골 면접 질문이 있습니다. 자바의 인터페이스와 추상 클래스를 어떻게 활용할 수 있는지 예시와 함께 설명해보라는 것인데요. 저는 여태 개발을 하면서 인터페이스는 자주 사용했지만 추상 클래스는 자주 사용하지 않아 (거의 없었던 것 같습니다) 예시와 함께 한번 정리해보고자 합니다. 적합한 예시는 많겠지만 제가 좋아하는 "라면"을 가지고 예시를 들어볼게요. 그리고 요즘 유행하는 ChatGPT 의 도움도 살짝 받아보겠습니다.


ChatGPT, 추상 클래스를 알려줘

ChatGPT 가 알려주는 추상 클래스는 하나 이상의 추상 메소드를 포함하는 클래스이다. 추상 메소드는 구현되지 않은 메소드로 자식 클래스에서 구현해야 한다. 자세한 내용은 ChatGPT 를 참고..

정말 기똥찹니다.. ChatGPT...

결국 클래스의 종류인데, 하나 이상의 추상 메소드를 포함하고 있으면 추상 클래스라고 한다. 예시와 함께 살펴보자. 라면 이라는 추상 클래스를 만들 수 있고 추상 메소드로 cookRamen() 메소드가 있다. 라면 추상 클래스를 상속받는 신라면 클래스는 cookRamen 추상 메소드를 구현해야 하는데, prepareNoodle(), preparePowder() 메소드를 따로 구현하여 호출한다.

public abstract class Ramen { // <-- 추상 클래스
    String name;
    
    public Ramen(String name) {
        this.name = name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public abstract void cookRamen(); // <-- 추상 메소드
}

public class ShinRamen extends Ramen {
    public void cookRamen() {
        prepareNoodle();
        preparePowder();
    }
    
    private void prepareNoodle() {
        // 끓는 물에 면을 끓인다.
    }
    
    private void preparePowder() {
        // 라면 스프를 넣는다.
    }
}

신라면, 짜파게티, 너구리 등 모든 라면은 라면을 조리한다 라는 개념이 들어가야 하기 때문에 추상 클래스로 만들어 자식 클래스에서 상속받게 할 수 있다. 

인터페이스는?

인터페이스는 추상 클래스와는 달리, 추상 메소드와 상수만 존재하며 다중 상속을 지원한다. 예를 들어, 라면을 상위 클래스로 정의하고 면, 스프, 기타 재료들을 각 인터페이스로 정의할 수 있다. 라면 종류에 따라서 필요한 재료들을 상속받아 사용할 수 있다.

public abstract class Ramen { // <-- 추상 클래스
    String name;
    
    public Ramen(String name) {
        this.name = name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public abstract void cookRamen(); // <-- 추상 메소드
}

public interface Egg {
    public void prepareEgg();
}

public class ShinRamen extends Ramen implements Egg {
    public void cookRamen() {
        prepareNoodle();
        preparePowder();
        prepareEgg();
    }
    
    private void prepareNoodle() {
        // 끓는 물에 면을 끓인다.
    }
    
    private void preparePowder() {
        // 라면 스프를 넣는다.
    }
    
    public void prepareEgg() {
        // 계란을 넣는다.
    } 
}

위 예시에서는 일반 라면 끓이는 과정에 계란을 인터페이스로 추가했다. 계란을 따로 인터페이스로 둔 이유는 라면에 따라 계란이 들어갈 수도 있고 아닐 수도 있기 때문에 인터페이스로 따로 상속받아 구현할 수 있도록 했다. 라면과 스프의 경우에는 모든 라면에 포함되어 있기 때문에 라면의 상위/하위 개념으로 보고 추상 클래스로 구현하였다.

ChatGPT 가 말하는 추상 클래스와 인터페이스의 차이

마지막으로 ChatGPT 를 참고하여 이 둘의 차이를 확인해보도록 하자.

구글보다 나은 것 같기도 하고...

 

반응형

댓글