Computer Science

추상클래스(Abstract)와 인터페이스(Interface)의 공통점과 차이점

emhaki 2023. 1. 15. 16:24
728x90
반응형
SMALL

추상 클래스 - 객체들의 공통 특성들을 모아놓은 클래스

추상 클래스는 여러 자식들이 가지고 있는 공통된 속성들을 뽑아서 하나의 클래스를 만들어 놓은 것을 뜻한다. 그래서 하위 클래스에서도 extends(상속)이라는 키워드를 사용하여 이 추상 클래스를 상속받아 객체를 구체화시켜간다. 이때 상속의 의미는 ~의 한 종류 라는 의미를 가지게 된다. 추상 클래스는 클래스라는 이름에서 알 수 있듯 엄연한 객체이다. 단독으로 생성하지는 못하지만 객체이기에 생성자도 사용할 수 있다.

abstract class 클래스이름 {
	
    public abstract void 메서드이름();
}

🔎 추상 클래스 정리

  • 추상클래스는 하위 클래스들의 공통점들을 모아 추상화하여 만든 클래스
  • 추상클래스는 다중 상속이 불가능하여 단일 상속만 허용한다.
  • 추상클래스는 추상 메소드 외에 일반클래스와 같이 일반적인 필드, 메서드, 생성자를 가질 수 있다.
  • 이러한 특징으로 추상클래스는 추상화(추상 메서드)를 하면서 중복되는 클래스 멤버들을 통합 및 확장을 할 수 있다.
  • 같은 추상화인 인터페이스와 다른점은, 추상클래스는 클래스간의 연관 관계를 구축하는 것에 초점을 둔다.

인터페이스 - 객체 생성을 위한 설계도

인터페이스는 객체가 아니라 추상 자료형이다. 객체가 아니기에 생성자도 사용할 수 없다. 오로지 상수와 추상 메서드만 가질 수 있고 이것을 다른 객체가 구현한다. 그래서 자바에서 implement(구현하다)라는 키워드를 사용하는 것. 이때 구현의 의미는 ~할 수 있는 이라는 의미를 가진다.

interface 인터페이스이름 {
	public static final 상수이름 = 값;
    	public abstract void 메서드이름();
}

🔎 인터페이스 정리 

  • 내부의 모든 메서드는 public abstract로 정의(default 메소드 제외)
  • 내부의 모든 필드는 public static final 상수
  • 클래스에 다중 구현 지원.
  • 인터페이스 끼리는 다중 상속 지원.
  • 인터페이스에도 static, default, private 제어자를 붙여 클래스 같이 구체적인 메서드를 가질 수 있음. 따라서 하위 멤버의 중복 메서드 통합을 어느정도 할 수는 있겠지만, 필드는 상수이기 때문에 중복 필드 통합은 불가능
  • 인터페이스는 부모 자식 관계인 상속에 얽매이지 않고, 공통 기능이 필요할 때마다 추상 메서드를 정의해놓고 구현(implement)하는 식으로 추상클래스보다 자유롭게 붙였다 뗏다 사용
  • 인터페이스는 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용하는 것에 초점
  • 다중 구현이 된다는 점을 이용해, 내부 멤버가 없는 빈 껍데기 인터페이스를 선언하여 마커 인터페이스로서 이용 가능 

 

추상클래스 생각할 때에는 복제를 떠올리고, 인터페이스를 생각할 때에는 계약서, 설계도 라고 생각하면 될 것 같다. 예를 들어서 집을 만든다고 할 때, 집에 전체적인 부분은 추상클래스로 복제하고, 문이나 창문, 굴뚝 등은 인터페이스를 참고해 변경시켜준다고 생각하면 이해가 쉽다.

 

추상 클래스와 인터페이스의 차이점을 정확히 알아야하는 이유는 두 개의 사용처가 완전히 다르기 때문이다. 추상 클래스는 많은 객체를 생성해야 할 때 각각의 객체에 공통점과 개발의 효율성을 위해 생성하지만, 인터페이스는 수많은 개발자가 함께 협업을 할 때 객체 간의 통일성을 강제하기 위한 용도로 많이 사용된다. 

추상 클래스와 인터페이스의 공통점

둘 다 자기 자신이 new를 통해 객체를 생성할 수 없고, 오로지 자식만이 객체를 생성할 수 있다.

둘 다 추상 메서드(abstract method)를 갖는다.

둘 다 하위 클래스에서 추상 클래스를 모두 구현해야 한다.

추상 클래스와 인터페이스의 차이점

추상 클래스(Abstract Class) 인터페이스(Interface)
상속하여 공통된 기능을 만들고, 확장하기 위함 구현하는 객체들이 같은 동작을 보장하기 위함
다중상속 불가능 다중상속 가능
생성자와 일반변수 모두 가질 수 있다. 생성자와 일반변수를 가질 수 없다.
메서드를 부분적으로 구현할 수 있다. 메서드 선언만 가능하다
extends 키워드를 사용한다. implements 키워드를 사용한다.

 

추상 클래스와 인터페이스 어떨때 사용해야 해?

🔎 추상화 클래스

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

🔎 인터페이스

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

참고

https://coding-factory.tistory.com/868

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-vs-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

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

 

728x90
반응형

'Computer Science' 카테고리의 다른 글

프로세스(Process)와 스레드(Thread)  (0) 2023.01.18
[DATABASE] ORM이란?  (0) 2023.01.18
깃(Git)과 깃허브(Github)  (0) 2023.01.13
[DATABASE] Transaction과 ACID  (0) 2023.01.12
SOLID란? 객체지향 설계 5원칙(Python)  (0) 2023.01.11