TIL

Java 추상 클래스와 인터페이스 구분

빈코 2022. 5. 18. 17:17

지난 시간에 객체지향 프로그래밍(OOP)에 대해 포스팅을 했었습니다. 객체 지향의 특징 중 추상화(Abstraction)에 대해는 간단한 정의만 하고 넘어갔었습니다. 그 이유는 추상 클래스와 인터페이스를 같은 것이라고 생각을 하시는 분이 많은데, 사용용도 면에서 큰 차이가 있어서 좀 더 정확하게 비교해가며 이번 포스팅을 하려 합니다.

 

로고
추상 클래스 VS 인터페이스

 

사실 추상 클래스와 인터페이스의 구분은 면접 단골 질문이기도 합니다. 이론적으로는 누구나 외우기만 하면 대답할 수 있습니다. 하지만 그런 이론적인 내용 말고 정작 "언제 인터페이스를 사용하는 게 좋을까요?", "추상 클래스를 사용하면 안 되나요?"라는 실무적인 질문이 들어오면 대답하는 것이 생각보다 어려울 것 같습니다.

 

저도 마찬가지이고, 그렇기에 공부하면서 포스팅을 진행 중입니다. 이번 기회에 명확히 알고 실무에서는 정확히 용도를 파악하여 쓰고, 면접에서는 시원하게 대답할 수 있는 기회가 되길 바랍니다.

 

추상 클래스

정의📖

흔히 클래스를 설계도라 하면, 추상 클래스는 미완성 설계도라고 부릅니다. 말 그대로 어느 정도 범위에서는 동일한 역할이지만, 추상 클래스는 추상 메서드를 선언하여 상속을 통해서 자손 클래스에 완성하도록 하는 클래스일 뿐 일반 클래스와 크게 다른점은 없습니다. 또한, 상속이라는 개념이 들어가기 때문에 따로 객체를 생성할 수도 없습니다.

 

규칙

  • 추상 클래스는 키워드 abstract를 붙여 표현한다.
abstract class reservation {
	...
    public abstract void webMethod();
}
  • 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨둔다.
  • abstract로 선언한 메서드를 자식 클래스에서 반드시 구현해야 한다(overriding)

예시😃

public class LeeSin extends Champion {
	void speak() {
    	System.out.println("어디로 가야하오.");
    }
}
public class JarvanlV extends Champion {
	void speak() {
    	System.out.println("Demacia! For the king!.");
    }
}
public class Ashe extends Champion {
	void speak() {
    	System.out.println("화살 한 발로 세상을 평정해 주지.");
    }
}

 

제가 즐겨 하는 리그 오브 레전드 챔피언들의 대사를 예시로 들었습니다. 리신, 자르반, 애쉬는 Champion 클래스를 상속받아 각자의 명대사를 내뱉는데요. 그럼 이때 부모 클래스인 Champion은 어떻게 대사를 내뱉을까요? 

 

public class Champion {
	void speak() {
    	System.out.println("..??");
    }
}

 

각각의 챔피언들은 이미 대사를 가지고 있는데, 위 코드는 부모 클래스에서 대사를 가지고 있는 상황이 됩니다. 뭔가 애매하지 않나요? 이럴 때 추상 클래스를 사용을 해야 합니다. 즉, 부모 클래스에선 선언부만 작성하고 구현부는 작성하지 않는 것입니다.

 

public class Champion {
	abstract void speak() {}
}

 

이렇게 되면, 부모 클래스 Champion은 speak라는 함수만 선언을 하고 자식 클래스인 리신, 자르반, 애쉬가 부모 클래스를 상속받아 speak 함수를 각각의 챔피언에 맞게 대사를 지정해주는 것입니다. 이해가 되셨나요!? 그럼 인터페이스를 알아보겠습니다.

 

 

인터페이스

정의📖

인터페이스는 구현된 것은 없고, 밑그림만 그려져 있는 기본 설계도라고 표현할 수 있습니다. 추상 클래스와 가장 다른점은 인터페이스는 다중 상속이 가능합니다.

규칙

  • 모든 맴버 변수는 public static final 이어야 하며, 이를 생략할 수 있다.
public static final?
인터페이스 변수는 그저 밑그림일 뿐, 아무 인스턴스도 존재하지 않아 스스로 초기화될 수 없습니다. 그렇기에 public static final을 사용해 구현 객체의 같은 상태를 보장해야 합니다.
  • 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
  • 인터페이스는 호출 규칙을 정의하는 것이기 때문에 추상 메서드만 선언 가능하다.
  • 인터페이스는 인터페이스로부터만 상속받을 수 있다.

예시😃

인터페이스 예제
출처 : https://myjamong.tistory.com/150#recentEntries

 

블로그를 찾다가 정말 이해하기 쉬운 다이어그램을 보게 되어서 가져왔습니다. Human과 Animal은 생명체에 속하므로 Creature를 상속받고, 이후엔 구분에 따라 인간과 동물을 상속받게 됩니다. 인간은 Kevin, 동물은 Turtle과 Pigeon

 

그리고 상속 받은 자식 클래스에서 각각이 할 수 있는 기능들을 인터페이스로 구분해놨습니다. 케빈은 프로그래머 이면서 수영도 할 수 있고, 거북이는 수영만, 비둘기는 날 수 있다는 것을 알 수 있습니다.

 

추상 클래스인 인간과 동물에도 인터페이스를 상속받습니다. 인간은 말할 수 있는 특징을 인터페이스로 추가시켰습니다. 그런데 동물중에 거북이는 수영을 할 수 있고, 비둘기는 수영을 하지 못합니다. 두개 다 같은 조상인 animal을 상속받고 있는 상황인데 그러면 어떻게 거북이에게만 수영할 수 있다는 Swimable을 추가 할 수 있을까요? 이럴 경우에 인터페이스를 적극 활용하셔야 합니다.

 

이쯤 되면 감이 올 것 같습니다. 그래도 조금 더 정확히 짚고 넘어가 볼까요?

 

 

추상 클래스 VS 인터페이스

공통점

1. 둘 다 가지고 있는 추상 메서드를 구현하도록 강제한다.

2. 인스턴스화가 불가능하다.

3. 추상 클래스를 extends 또는, 인터페이스를 implements 한 자식만이 객체를 생성할 수 있다.

4. type이 지정되어 있기 때문에 선언된 type과 자식의 type이 같아야 한다.

 

차이점

1. 추상 클래스는 extends 키워드를 사용하고, 인터페이스는 implements 키워드를 사용한다.

2. 추상 클래스는 상속의 개념처럼 하위 클래스는 상속 클래스의 특성을 상속받는 한편, 인터페이스는 클래스가 '무엇을 할 수 있다'라고 하는 기능을 구현하도록 강제한다.

3. 추상 클래스는 is kind of / 인터페이스는 is able to 의 개념으로 이해하면 쉽다.

 

😊 추상 클래스는 자신의 기능들을 하위 클래스로 확장시키는 느낌이라면, 인터페이스는 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현하는 느낌이다. 

 

😊 사용 시기 : 추상 클래스는 상속 관계를 타고 올라갔을 때 기능까지 완벽히 똑같이 필요한 경우 사용, 인터페이스는 상속 관계를 타고 올라갔을 때 다른 조상 클래스를 상속하는데 같은 기능이 필요한 경우 사용

 


👨‍👩‍👦‍👦 오픈채팅방 운영

취업을 준비하는 예비 개발자분들을 위한 질문&답변할 수 있는 공간을 만들었습니다. 취업과 이직을 하기 위해서 어떤 걸 중점적으로 준비해야 하는지부터 포트폴리오&이력서 작성법 등 다양한 질문들을 받고 답변을 드립니다. 참여하셔서 다양한 정보 얻고 가시면 좋을 것 같네요😁

 

참여코드 : 456456

https://open.kakao.com/o/gVHZP8dg

 

비전공 개발자 취업 준비방(질문&답변)

#비전공 #개발자 #취업 #멘토링 #부트캠프 #국비지원 #백엔드 #프론트엔드 #중소기업 #중견기업 #자바 #Java #sql

open.kakao.com

 

 


👨‍💻 전자책 출간

아울러 제가  🌟비전공자에서 2년만에 보안 전문 중견기업으로 이직 한 방법들을 정리한 전자책을 출간 하게 되었습니다. 어떤 걸 공부해야 하는지, 이직을 위해서 무엇을 준비해야 하는지, 제가 받았던 기술 면접 리스트 등 다양한 목차로 구성되어 있습니다. 또한, 구매 시 1:1 채팅을 이용하여 포트폴리오 첨삭을 도와드리고 있습니다. 🐕전자책으로 얻은 모든 수익은 유기견 센터 '팅*벨 입양센터'에 후원될 예정입니다. 관심 있으신 분들은 아래 링크를 참고해주세요😁

https://kmong.com/gig/480954

 

비전공개발자 2년만에 중견기업 들어간 방법 | 14000원부터 시작 가능한 총 평점 0점의 전자책, 취

0개 총 작업 개수 완료한 총 평점 0점인 Binco의 전자책, 취업·이직 전자책 서비스를 0개의 리뷰와 함께 확인해 보세요. 전자책, 취업·이직 전자책 제공 등 14000원부터 시작 가능한 서비스

kmong.com


 

마치며

지금까지 추상 클래스(abstract class)와 인터페이스(interface)를 알아보았습니다. 서두에도 말씀드렸듯이, 이 두 가지 용어는 면접 단골 질문이며 주관적인 생각으로 꼬리에 꼬리를 무는 질문이 이어지면 대답하기 어려운 부분이라고 생각합니다. 사용 용도를 명확히 익히고 실무에서든 면접에서든 잘 활용하시길 바랍니다.

 

 

JAVA 관련 포스팅

* [ 객체 지향 프로그래밍(OOP)이란? ]

* [ Java Enum Class란? ]

* [ JPA 영속성 컨텍스트 핵심요약 ]

* [ JPA의 정의와 장 ·단점 ]

* [ Java MVC Pattern 바로 알기 ]

 

반응형

'TIL' 카테고리의 다른 글

Java MVC 패턴 바로 알기  (1) 2022.05.20
Java Enum 클래스  (0) 2022.05.19
객체 지향 프로그래밍(OOP)이란?  (0) 2022.05.16
JPA 영속성 컨텍스트 정의 및 핵심요약  (0) 2022.05.12
JPA의 정의와 장·단점  (0) 2022.05.10