오늘은 확실히 알아두면 좋을 추상클래스와 인터페이스의 차이에 대해 알아보자!
추상클래스(abstract class)
클래스는 일반 클래스(concrete class)와 추상 클래스(abstract class)로 나뉜다.
추상 클래스는 클래스 구현부 내부에 추상 메서드가 하나 이상 포함되거나 abstract로 정의된 경우를 말한다.
- 추상 클래스와 일반 클래스는 상속 관계에 놓여있다.
- 추상 클래스가 부모 클래스, 일반 클래스가 자식 클래스이다.
- 추상 클래스는 새로운 일반 클래스를 위한 부모 클래스의 용도로만 사용된다.
- 일반 클래스들의 필드와 메서드를 통일하여 일반 클래스 작성 시 시간을 절약할 수 있다.
- 추상 클래스는 동일한 부모를 가지는 클래스를 묶는 개념으로 상속을 받아서 기능을 확장시키는 것이 목적이다.
작성 예시
public abstract class Animal {
public abstract void sound();
}
어떤 클래스가 추상 클래스를 상속받는다면 해당 클래스는 추상 클래스에 선언했던 추상 메서드를 무조건 구현을 해야 하는 룰이 있다. 이 룰을 어기면 에러가 발생한다.
public class Dog extends Animal {
public void sound() {
System.out.println("멍멍")
}
}
추상 클래스에서도 일반 메서드를 구현할 수 있다. Animal 추상 클래스에 취미를 출력해주는 hobby 메서드를 만들어 보자.
public abstract clss Animal {
public abstract void sound();
public void hobby() {
System.out.println("산책을 좋아해요");
}
}
해당 메서드는 Dog 클래스에서도 호출할 수 있다.
인터페이스
인터페이스는 모든 메서드가 추상 메서드인 경우를 말한다.
- 인터페이스는 추상 메서드보다 한 단계 더 추상화된 메서드라고 볼 수 있다.
- 인터페이스에 적는 모든 메서드들은 추상 메서드로 간주되기 때문에 abstract를 적지 않는다.
- 기존에는 인터페이스에 일반 메서드를 구현할 수 없었지만, Java8부터는 default 예약어를 이용해 일반 메서드 구현이 가능하다.
- 인터페이스는 static final 필드만 가질 수 있다. 필드를 선언할 때는 public static final이 생략되어 있다고 생각하자.
public static final을 사용하는 이유는 다음과 같다.
1. 구현 객체의 같은 동작을 보장하기 위한 목적이다.
2. 인터페이스 변수는 스스로 초기화 될 권한이 없다.
3. 아무 인스턴스도 존재하지 않는 시점이기 때문이다.
- 인터페이스도 추상클래스와 마찬가지로 new 연산자를 사용하여 객체를 생성할 수 없다.
- 인터페이스는 구현 객체가 같은 동작을 보장한다는 것이 목적이다.
- 인터페이스는 추상 클래스와 다르게 다중 상속이 가능하다.
추상 클래스와 인터페이스의 공통점
- 추상 클래스와 인터페이스는 선언만 있고 구현 내용은 없는 클래스이다.
(Java8부터 인터페이스에서 default method로 구현이 가능하지만 일반적인 구현은 없다.)
- 인스턴스화를 할 수 없다.
- 추상 클래스를 extends로 상속받은 자식들과 인터페이스를 implements 하고 구현한 자식들만 객체를 생성할 수 있다.
- 결론 : 자식 클래스가 무언가 반드시 구현하도록 위임해야할 때 사용한다.
추상 클래스와 인터페이스의 차이점
- 추상 클래스는 단일 상속, 인터페이스는 다중 상속이다.
- 추상 클래스의 목적은 상속을 받아 기능을 확장시키는 것이다.
- 인터페이스의 목적은 구현하는 모든 클래스에 대해 특정한 메서드가 반드시 존재하도록 강제하는 역할이다.
'📒 기술 또는 개념 > 💻 Develop' 카테고리의 다른 글
[Develop] JVM에 대해 (0) | 2023.11.03 |
---|---|
[Develop] 애자일 개발 프로세스에 대해 (0) | 2023.11.02 |
[Develop] SDK에 대해 (0) | 2023.10.19 |