본문 바로가기

Computer Science/Java

추상 클래스와 인터페이스

추상 클래스

 

  • 클래스는 일반 클래스(concrete class)와 추상 클래스로 나뉘는데 추상 클래스는 클래스 구현부 내부에 추상 메서드가 하나 이상 포함되거나 abstract로 정의된 경우를 말합니다.
  • 클래스를 설계도라고 한다면 추상 클래스는 미완성 설계도라고 할 수 있습니다. 미완성 설계도란 말 그대로 덜 만들어진 설계도입니다.
  • 클래스가 미완성이라는 것은 단지 미완성 메서드(추상 메서드)를 포함하고 있다는 의미입니다.
  • 미완성 설계도만으로 온전한 상품을 만들 수 없듯이 추상 클래스만으로 객체를 생성할 수 없습니다. 추상 클래스는 상속을 통해 자식 클래스에 의해서만 완성될 수 있습니다. (추상 클래스는 추상 메서드를 선언하여 상속을 통해 자식 클래스에서 완성하도록 유도하는 클래스입니다.)
  • 추상 클래스 자체만으로는 클래스로서의 역할을 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 부모 클래스로서 중요한 의미를 갖습니다.
  • 추상 클래스의 특징
    • 추상 클래스는 필드(멤버 변수), 생성자, 추상 메서드를 가질 수 있습니다.
    • 추상 클래스는 new 연산자를 사용하여 객체를 생성할 수 없습니다.(인스턴스화할 수 없습니다.)
    • 추상 클래스(부모)와 일반 클래스(자식)는 상속의 관계에 놓여 있습니다.
    • 추상 클래스는 새로운 일반 클래스를 위한 부모 클래스의 용도로만 사용됩니다.
    • 일반 클래스들의 필드와 메서드를 통일하여 일반 클래스 작성 시 시간을 절약할 수 있습니다.
    • 추상 클래스는 단일 상속만 가능하며 일반 변수를 가질 수 있습니다.
    • 추상 클래스는 동일한 부모를 가지는 클래스를 묶는 개념으로 상속을 받아서 기능을 확장시키는 것이 목적입니다.
    • 추상 클래스에는 일반 메서드를 구현할 수 있습니다.

 

 

인터페이스

 

  • 인터페이스는 모든 메서드가 추상 메서드인 경우를 말합니다.
  • 인터페이스도 일종의 추상 클래스입니다. 인터페이스는 추상 클래스보다 추상화 정도가 높아서 구현부를 지닌 일반 메서드 또는 필드(멤버 변수)를 가질 수 없습니다. 오직 추상 메서드와 상수만을 구성원으로 가질 수 있습니다.
  • 추상 클래스가 '미완성된 설계도'라고 한다면, 인터페이스는 오직 밑그림만 있는 '기본 설계도'라고 할 수 있습니다.
  • 인터페이스의 특징
    • 인터페이스는 추상 클래스보다 한 단계 더 추상화된 클래스라고 볼 수 있습니다.
      • 인터페이스에 적는 모든 메서드들은 추상 메서드로 간주되기 때문에 public abstract는 생략 가능합니다.
      • 기존에는 인터페이스에 일반 메서드를 구현할 수 없었지만, 자바8 버전부터 default 예약어를 통해 일반 메서드 구현이 가능해졌습니다.
    • 인터페이스는 static final 필드만 가질 수 있습니다. 필드를 선언할 때는 public static final이 생략되어 있다고 생각하면 됩니다.
      • public static final을 사용하는 이유
        1. 구현 객체의 같은 동작을 보장하기 위한 목적
        2. 인터페이스의 변수는 스스로 초기화될 권한이 없음(변수의 값은 static context 내에 할당되어야 하는데, 이때는 아무 인스턴스도 존재하지 않는 시점이기 때문에)
    • 인터페이스도 추상 클래스와 마찬가지로 new 연산자를 사용하여 객체를 생성할 수 없습니다.(인스턴스화할 수 없습니다.)
    • 인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하는 것이 목적입니다.
    • 인터페이스는 추상 클래스와 반대로 다중 상속이 가능합니다.
    • 클래스끼리, 인터페이스끼리 상속을 할 때에는 extends, 클래스가 인터페이스를 상속받을 때에는 implements 키워드를 사용합니다.
  • 인터페이스의 장점
    1. 개발 시간을 단축시킬 수 있습니다.
      • 개발자들이 각각의 부분을 완성할 때까지 기다리지 않고 서로 규약만 정해두어 각자의 부분만 따로 나눠서 작성된 코드를 컴파일할 수 있습니다.
    2. 표준화가 가능합니다.
      • 클래스의 기본 틀을 제공하여 개발자들에게 정형화된 개발을 강요할 수 있습니다.
    3. 서로 관계없는 클래스들에게 관계를 맺어줄 수 있습니다.
      • 코드의 종속성을 줄이고 유지보수성을 높이도록 해줍니다. 즉, 클래스들끼리의 쓸데없는 상속을 줄일 수 있습니다.
    4. 독립적인 프로그래밍이 가능합니다.
      • 클래스와 클래스 간의 직접적인 관계를 인터페이스를 통해 간접적인 방법으로 변경하면 한 클래스의 변경이 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능합니다.
  • 인터페이스 사용 이유
    1. 클래스 간의 결합도를 줄일 수 있고, 이를 통해 유지보수성을 향상시킬 수 있습니다.
    2. 추상 클래스는 필드(멤버 변수)를 가질 수 있어서 코드를 봤을 때 보아야할 것들이 많지만, 인터페이스는 어떤 기능을 하는지 간략하게 볼 수 있기 때문에 코드의 가독성이 높다.

 

 

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

 

  • 추상 클래스와 인터페이스는 선언만 있고 구현 내용은 없는 클래스입니다.
  • new 연산자를 이용하여 객체를 생성할 수 없습니다.(인스턴스화할 수 없습니다.)
  • 추상 클래스를 extends로 상속받은 자식들과 인터페이스를 implements하고 구현한 자식들만 객체를 생성할 수 있습니다.
    (결국 자식 클래스가 무언가 반드시 구현하도록 위임해야할 때 사용합니다.)

 

 

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

 

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

     

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

Call By Value vs Call By Reference  (0) 2021.04.08
JAVA vs C++  (0) 2021.03.27
Java 메모리 - (3) Garbage Collector  (0) 2020.10.21
Java 메모리 - (2) JVM  (0) 2020.10.19
Java 메모리 - (1) Java 메모리 구조  (0) 2020.10.18