✅ 추상 클래스 - 객체들의 공통 특성들을 모아놓은 클래스
추상 클래스는 여러 자식들이 가지고 있는 공통된 속성들을 뽑아서 하나의 클래스를 만들어 놓은 것을 뜻한다. 그래서 하위 클래스에서도 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
'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 |