신입 개발자 단골 면접 질문이 있습니다. 자바의 인터페이스와 추상 클래스를 어떻게 활용할 수 있는지 예시와 함께 설명해보라는 것인데요. 저는 여태 개발을 하면서 인터페이스는 자주 사용했지만 추상 클래스는 자주 사용하지 않아 (거의 없었던 것 같습니다) 예시와 함께 한번 정리해보고자 합니다. 적합한 예시는 많겠지만 제가 좋아하는 "라면"을 가지고 예시를 들어볼게요. 그리고 요즘 유행하는 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 를 참고하여 이 둘의 차이를 확인해보도록 하자.
'자바' 카테고리의 다른 글
[자바] @JsonTypeInfo, @JsonSubTypes 를 활용하여 수정 이력 쌓아보기 (3) | 2023.03.17 |
---|---|
[자바] 메소드 시그니쳐 (method signature) (0) | 2023.02.25 |
[자바] Lombok 의 @EqualAndHashCode (0) | 2023.02.11 |
[자바] .equals(), .hashCode() 메소드에 대해 알아보자 (0) | 2023.02.11 |
[자바] Stream .sorted() 활용 (0) | 2023.02.06 |
댓글