추상 클래스(Abstract Class)

클래스는 일반 클래스(Concrete Class)와 추상 클래스로 나뉘는데 추상 클래스는 클래스 구현부 내부에 추상 메서드가 하나 이상 포함되거나 abstract로 정의된 경우를 말한다. 이러한 정의는 피상적인 것 같다.

 

공통의 자료형이라고 할 수 있는 추상클래스가 갖고 있는 공통 서비스 함수이다. 다만, 공통 서비스인데 구현이 공통인 것이 아니라 그 서비스라고 하는 목록이 공통인 것을 말한다. 이렇게 정의를 하는게 정확하게 전달하는 의미라고 생각한다.

 

  • 추상 클래스는 new 연산자를 사용하여 객체를 생성할 수 없다.
  • 추상 클래스(부모)와 일반 클래스(자식)는 상속의 관계에 놓여있다.
  • 추상 클래스는 새로운 일반 클래스를 위한 부모 클래스의 용도로만 사용된다.
  • 일반 클래스들의 필드와 메소드를 통일하여 일반 클래스 작성 시 시간을 절약할 수 있다.
  • 추상 클래스는 단일 상속만 가능하며 일반 변수를 가질 수 있다.
  • 추상 클래스는 동일한 부모를 가지는 클래스를 묶는 개념으로 상속을 받아서 기능을 확장시키는 것이 목적이다.

 

인터페이스(Interface)

인터페이스는 모든 메서드가 추상 메서드인 경우를 말한다.

  • 인터페이스는 추상 클래스보다 한 단계 더 추상화된 클래스라고 볼 수 있다.
    • 인터페이스에 적는 모든 메서드들은 추상 메서드로 간주되기 때문에 abstract를 적지 않는다.
    • 기존에는 인터페이스에 일반 메서드를 구현할 수 없었지만, 자바8 버전부터 default 예약어를 통해 일반 메서드 구현이 가능하다.
  • 인터페이스는 static final 필드만 가질 수 있다. 필드를 선언할 때는 public static final이 생략되어있다고 생각하자.
    • public static final을 사용하는 이유는 다음과 같다.
      • 구현 객체의 같은 동작을 보장하기 위한 목적
      • 인터페이스의 변수는 스스로 초기화 될 권한이 없음
      • 아무 인스턴스도 존재하지 않는 시점이기 때문
    • 인터페이스도 추상 클래스와 마찬가지로 new 연산자를 사용하여 객체를 생성할 수 없다.
    • 인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하는 것이 목적이다.
    • 인터페이스는 추상 클래스와 반대로 다중 상속이 가능하다.

[그림 1] 인터페이스에 필드와 메서드를 선언하면 컴파일러가 자동으로 키워드를 붙여 해석한다.

 

클래스와 인터페이스 사이 관계 이해하기

아래 사진에서 보이는 것처럼 클래스끼리, 인터페이스끼리 상속을 할 때는 extends, 클래스가 인터페이스를 상속받을 때implements 키워드를 사용한다.

 

[그림 2] 클래스와 인터페이스 사이 관계

 

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

  • 추상 클래스와 인터페이스는 선언만 있고 구현 내용은 없는 클래스이다. (자바 8부터 인터페이스에서 default method로 구현이 가능하지만 일반적으로 구현이 없다.)
  • 인스턴스화(객체를 생성 X)를 할 수 없다.
  • 추상 클래스를 extends로 상속받은 자식들과 인터페이스를 implements하고 구현한 자식들만 객체를 생성할 수 있다. (결국 자식 클래스가 무언가 반드시 구현하도록 위임해야할 때 사용한다.)

 

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

  • 추상 클래스(단일상속) / 인터페이스(다중상속)
  • 추상 클래스의 목적은 상속을 받아서 기능을 확장시키는 것(부모의 유전자를 물려받는다)
  • 인터페이스의 목적은 구현하는 모든 클래스에 대한 특정한 메서드가 반드시 존재하도록 강제하는 역할(부모로부터 유전자를 물려받는 것이 아니라 사교적으로 필요에 따라 결합하는 관계) 즉, 구현 객체가 같은 동작을 한다는 것을 보장하기 위함.

 

'DevLog' 카테고리의 다른 글

디버그 모드와 릴리즈 모드의 차이점  (0) 2021.03.01
복사했습니다!