HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🍗
[New] 조규현팀
/
🏪
TS Store
/
⛈️
인터페이스와 추상클래스
⛈️

인터페이스와 추상클래스

Person
완료율%
상태
완료
나의 블로그
https://morning-paprika-8fa.notion.site/ed1a2967d2d84033994bd03113d62444
Think Sharing (TS)
🪚
인터페이스와 추상클래스
인터페이스 vs 추상클래스1️⃣  추상클래스추상메서드추상클래스 규칙2️⃣ 인터페이스인터페이스의 규칙인터페이스의 다중상속3️⃣  추상 클래스 / 인터페이스 공통점왜 두가지로 나눠서 사용하는 것일까?4️⃣  추상 클래스 / 인터페이스 차이점사용용도의 차이점접근자다중 상속 여부사용 의도5️⃣  결론추상클래스인터페이스6️⃣  REF

인터페이스 vs 추상클래스

1️⃣  추상클래스

  • 일반 클래스와 크게 다를 것은 없지만 단지, 추상 메서드를 선언하여 상속을 통해 자손 클래스에서 완성하도록 유도하는 클래스이다.
  • 클래스를 설계도라고 표현한다면 추상 클래스는 미완성 설계도로 표현할 수 있다.
    • 같은 크기의 TV라도 기능의 차이에 따라 여러 종류의 모델이 있지만 설계도 90은 동일할테니 어느정도 틀을 갖춘 상태에서 진행하는 것이 좋으며 이때 추상 클래스를 사용할 수 있다.
  • 추상클래스 자체는 미완성 설계도이기 때문에 그 자체만으로는 객체를 생성할 수 없다.
// abstract 키워드를 붙여주어야 합니다. abstract class 클래스이름 { }

추상메서드

  • 메서드의 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨둔 메서드를 말한다.
  • 추상 메서드는 상속받는 클래스에 따라 달라질 수 있다.
abstract class AbstractA { abstract void method(); }

추상클래스 규칙

  • 추상 클래스 키워드는 abstract를 붙여서 표현한다.
    • 추상 메서드를 포함하지 않은 클래스 에서도 abstract 키워드를 붙여서 추상클래스로 지정할 수 있다.
  • 클래스를 abstract로 지정하면 new를 통해 객체를 직접 생성할 수 없다.
  • 메서드에 abstract를 사용할 경우 interface의 메서드와 같이 구현 부분이 없다.
  • abstract로 선언한 메서드를 자식 클래스에서 필수적으로 구현해야 한다.(오버라이딩)
    • 이는 자식 클래스에서 추상 메서드를 반드시 구현하도록 강제하는 것이다.
public abstract class Player { boolean pause; int currentPos; public Player() { this.pause = false; this.currentPost = 0; } abstract void play(int pos); abstract void stop(); void pause() { if(pause) { pause = false; play(currentPos); } else { pause = true; stop() } } } // 구현체 // 상속받은 메서드 외에 필드나 메서드 추가로 작성이 가능하다. public class Melon extends Player { @Override void play(int pos) { // 구현 } @Override void stop() { // 구현 } }
 

2️⃣ 인터페이스

  • 인터페이스는 일종의 추상 클래스로 추상 메서드를 갖지만 추상 클래스보다 추상화 정도가 높다.
  • 추상 클래스와 달리 몸통을 갖춘 일반 메서드, 멤버 변수를 구성원으로 가질 수 없다.
  • 추상 클래스를 미완성 설계도라 한다면 인터페이스는 구현된 것은 아무것도 없는 밑그림만 그려진 기본 설계도라고 할 수 있다.
  • 인터페이스도 추상 클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하고 클래스와 다르게 다중상속이 가능하다.
// 인터페이스는 추상메서드만 허용하기 때문에 abstract 키워드는 생략이 가능하다. // 정적 메서드는 static를 붙이거나 default 키워드를 붙여서 메서드 작성은 가능하다. interface 인터페이스이름 { void method(); }

인터페이스의 규칙

  • 추상 클래스처럼 불완전한 것이기 때문에 그 자체만으로 사용 되기 보다, 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다.
  • 일반 메서드 또는 멤버 변수를 구성원으로 가질 수 없다.
notion image
  • 모든 멤버 변수는 public static final 이어야 하며, 이를 생략할 수 있다.
    • 인터페이스 변수는 아무 인스턴스도 존재하지 않는 시점이기 때문에 스스로 초기화 될 권한이 없다. 그렇기 때문에 public static final를 사용해 구현 객체의 같은 상태를 보장한다.
    • notion image
  • 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
    • 단 JDK1.8부터 static 메서드와 default 메서드를 사용할 수 있다.
    • notion image
 

인터페이스의 다중상속

notion image
  • 인터페이스는 abstract 메서드만을 가지고 있으며 이를 상속할 경우 상속하는 클래스에서 무조건 그 메서드를 구현해주어야 한다.
  • 이 경우 다중 상속하고 있는 인터페이스들에 동일한 메서드가 존재 한다면 구현하는 클래스에서는 하나만 오버라이드 해주면 된다.
    • 하지만 메서드 파라미터 정보가 다르면 오버로딩처럼 여러개 구현을 해야한다.
notion image
notion image
  • 그런데 이제 인터페이스에서 default 메서드를 구현할 수 있는데 두개의 인터페이스를 다중 상속하는 경우, 이 default 메서드가 중복이 되면 어떻게 될까?
    • notion image
    • 상속받은 인터페이스들 중에서 중복으로된 메서드가 존재한다면 강제로 구현하도록 한다.
 

3️⃣  추상 클래스 / 인터페이스 공통점

  • 추상 클래스, 인터페이스 모두 가지고 있는 추상 메서드를 구현하도록 강제하며 인스턴스화가 불가능하다.

왜 두가지로 나눠서 사용하는 것일까?

  • 이론적인 차이점을 다 제외한다면 두개로 나눠서 사용하는 가장 큰 차이점은 사용용도로 볼 수 있다 !
 

4️⃣  추상 클래스 / 인터페이스 차이점

사용용도의 차이점

  • 추상클래스는 IS -A “~ 이다.”
  • 인터페이스는 HAS -A “~을 할 수 있는”
  • 이렇게 구분되는 이유는 다중상속의 여부에 따라 용도를 정한 것 같다.
    • 자바의 특성으로 한개의 클래스만 상속이 가능하여 해당 클래스의 구분은 추상클래스를 통해 해결하고, 할 수 있는 기능들은 인터페이스로 구현한다.

접근자

  • 인터페이스에서 모든 변수는 public static final 만 가능하고 메서드는 public abstract 만 가능하다.
  • 추상 클래스는 static 이나 final 이 아닌 필드를 가질 수 있고, public, protected, private 모두 가질 수 있다.
 

다중 상속 여부

  • 인터페이스를 구현하는 클래스는 다른 여러개의 인터페이스를 함게 구현이 가능하다.
  • 자바에서는 다중상속을 지원하지 않기 때문에 여러 추상클래스를 상속할 수 없다.
 

사용 의도

  • 추상클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화 시켜 놓은 것이다.
    • 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며 부모가 클래스가 가진 기능들을 구현해야 할 경우 사용한다.
  • 인터페이스는 상속관계를 타고 올라갔을 때 다른 조상 클래스를 상속하더라도, 같은 기능이 필요한 경우 사용한다.
    • 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용한다.
notion image
  • Creture - 가장 상위 부모클래스로 추상클래스이다.
    • Animal - Creture를 상속받으며 먹을 수 있기 때문에 먹는다 라는 인터페이스를 구현한다.
      • 강지 - Animal을 상속받은 클래스로 먹는다를 구현한다.
      • Human - Animal을 상속 받은 추상 클래스로 인간은 또 말을 할 수 있기 대문에 말하다 라는 인터페이스를 구현한다.
        • 형욱 - 개발자라는 타입을 가질 수 있기 때문에 개발자라는 인터페이스를 구현하고 그 안에 메서드들도 구현이 가능하다.
    • Plant - Creture를 상속받으며 별다른 스스로 먹이를 찾아서 먹을 수 없기 때문에 먹는다 라는 인터페이스를 구현하지 않았다.
      • 장미 - 장미는 먹는다 라는 행위를 할 수 없다.
      • 파리지옥 - 파리지옥은 파리를 먹을 수 있기 때문에 먹는다라는 행위를 구현할 수 있다.
 
🔥
Creture에 먹는다를 만들면 간단해 보이지만 Plant는 여기서 먹는다 라는 행위를 할 수 없기 때문에 이런 경우 인터페이스를 통해서 각각 먹는 행위를 할 수 있는 클래스에 implements를 해주면 가독성이 올라가며 유지보수 또한 쉬워진다.

5️⃣  결론

추상클래스

  • 관련성이 높은 클래스 간에 코드를 공유하고 싶은 경우
  • 추상 클래스를 상속 받을 클래스들이 공통으로 가지는 메서드와 필드가 많거나, public이외에 접근자 선언이 필요한 경우
  • non-static, non-final 필드 선언이 필요한 경우 (각 인스턴스에서 상태 변경을 위한 메서드가 필요한 경우)
 

인터페이스

  • 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우
    • Comparable, Clonable 인터페이스는 여러 클래스들에서 구현되지만 구현클래스들 간에 관련성은 없다.
  • 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지 신경쓰지 않는 경우
  • 다중상속을 허용하고 싶은 경우

6️⃣  REF

velog.io
https://velog.io/@new_wisdom/Java-%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%9D%98-%EC%B0%A8%EC%9D%B4
[Java] 인터페이스와 추상 클래스 차이는 무엇일까?
이번 글에서는 인터페이스와 추상 클래스의 차이에 대해서 정리해보겠습니다. 실제로 이 질문은 면접에서도 자주 물어보는 질문이고, 약간 알듯 말듯 한데 대답하기는 애매한 주제라 한번 각각 특징에 대해서 정리해보고 둘의 차이를 정리 해보겠습니다. 클래스를 설계도에 비유한다면 추상 클래스는 미완성 설계도에 비유할 수 있습니다. 추상 클래스는 키워드 abstract 를 붙이기만 하면 됩니다.
[Java] 인터페이스와 추상 클래스 차이는 무엇일까?
https://devlog-wjdrbs96.tistory.com/370
[Java] 인터페이스와 추상 클래스 차이는 무엇일까?