본문 바로가기

Study

추상 클래스와 인터페이스

추상 클래스

추상 클래스와 추상 메서드란 무엇일까?

먼저 추상 메서드는, 선언부만 존재하고 구현이 존재하지 않는 메서드를 말한다. 즉 선언만 해놓고 내용은 없는 메서드이다. 추상 메서드는 부모 클래스에서 선언하고 자식 클래스에서 상속받아 재정의(오버라이드)하도록 할 때 사용한다.

 

추상 클래스는, 추상 메서드가 하나 이상 존재하는 클래스이다. 추상 메서드가 있기 때문에 객체화 할 수 없으며(객체는 상태와 행동을 가지는 것인데, 추상 클래스에는 정의되지 않은 행동(추상 메서드)이 있으므로 일반 클래스처럼 인스턴스화 할 수 없음), 이를 사용하기 위해 추상 클래스를 상속받은 자식 클래스에서 추상 메서드를 재정의 해야 한다. 추상 메서드를 재정의 하지 않는 경우 컴파일에러가 발생한다. 

즉 추상 메서드는 추상 클래스를 상속받고 이를 재정의하는 것을 강제하도록 할 수 있다. 

→ 여러 작업자 간 작업이 통일된 부분을 공유하고, 기능 확장이 필요한 부분은 재정의하여 사용할 수 있도록 할 수 있음

 

 

인터페이스

인터페이스는 추상 클래스와 비슷하면서도 조금 다른데, 추상 클래스는 추상 메서드가 하나 이상 존재하는 클래스인 반면 인터페이스는 "상수와 추상 메서드로만" 이루어져 있다.(Java 8 이후부터는 default 메서드와 static 메서드를 추가하여 유연성을 가지게 되었다) 즉 로직이 존재할 수 없고 구현 클래스에서 메서드의 구현체를 만들어야만 한다.

인터페이스에 존재하는 모든 메서드는 public abstract 키워드로 선언되며, 이를 생략할 수 있다. 

인터페이스에 존재하는 모든 변수는 public static final 키워드로 선언되며, 이를 생략할 수 있다. (컴파일러가 자동으로 키워드를 추가해 준다)

 

인터페이스를 구현하는 클래스를 구현 클래스 라고 하며, 구현 클래스는 implements 키워드를 사용한다. 또한 (추상)클래스를 상속하는 것과 달리 인터페이스는 다중 상속이 가능하다. 사용 예시는 다음과 같다.

public class 구현 클래스 명 implements 인터페이스1, 인터페이스2 {
	// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}

구현 클래스는 상속받는 모든 인터페이스의 추상 메서드에 대한 구현을 작성해야 한다.

 

 

인터페이스를 사용하는 이유?

인터페이스를 사용하는 이유는 다양하지만 대부분 추상 클래스를 사용하는 이유(상속과 재정의를 강제함으로 인한 유지보수성과 확장성의 향상)와 다를 게 없다고 생각했다. Java8 이후로 인터페이스에 default method 와 static 메서드를 추가할 수 있게 되고, Java 9 이후부터는 private method 를 사용할 수 있게 되면서 추상 클래스에서 할 수 있는 대부분의 기능을 인터페이스로도 사용할 수 있게 되었다. 그럼에도 추상클래스를 사용하지 않고 인터페이스를 사용하는 결정적인 이유는 다중상속이 가능하기 때문으로 이해했다. 그러나 이렇게 생각하는 근거가 아직 부족하여 인터페이스에 대한 공부가 더 필요할 것 같다.

인터페이스와 상속을 사용하는 상황에 대해, 같이 스터디하는 분은 "공통된 부분을 재사용하는 부분은 상속을 사용하고 기능 확장이 필요한 부분은 인터페이스를 사용한다" 고 하셨는데, 이것도 생각해 볼 만한 관점인 것 같다.

 

 

 

 

 

'Study' 카테고리의 다른 글

스프링 @Transactional의 동작 원리와 스프링 AOP  (0) 2023.09.18
Java 예외처리  (0) 2023.08.17
Java 클래스와 상속  (0) 2023.08.09
자바 코드를 JVM으로 실행하는 과정  (0) 2023.07.31
SseEmitter 를 사용한 푸쉬알림  (0) 2023.07.17