2019. 11. 3. 02:20

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

추상클래스와 인터페이스를 알아보기 앞서 인터페이스와 추상클래스가 언제, 그리고 왜 쓰이는지 그 목적성에 대해서 분명히 알고 개념을 익힌다면 더욱 공통점과 차이점을 명확하게 할 수 있을 것이다.

추상 클래스


클래스가 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라, 단지 미완성 메서드(추상메서드)들 포함하고 있다는 의미이다. 추상클래스로 인스턴스는 생성할 수 없다. 추상클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.

즉 상속을 강제하기 위한 추상메서드를 하나 이상 가진 클래스를 말한다.

추상클래스는 다음과 같은 특징을 가지고 있다.

  • 공통 구현을 상위 클래스에 뽑아내려고 사용
  • 자신의 생성자로 객체 생성 불가능
  • 하위 클래스를 참조하여 상위 클래스의 객체를 생성
  • 하위 클래스를 제어하기 위해 사용
  • abstract와 final 키워드를 동시에 표기할 수 없다.

 

추상 클래스를 왜 사용하는가


맥락에 따라서 달라질 수 있는 기능들이 있을 때 추상 메소드로 만든다.

추상 메소드들의 공통된 내용을 상위 클래스로 뽑아서 만든 것이 추상 클래스이며 이것을 세부적으로 구현한 부분이 추상 메소드이다. 이 추상 메소드가 하나 이상 가지고 있는 것이 추상 클래스이고 이것들을 상속함으로써 자기가 가진 메소드들을 오버라이딩한다는 것까지는 알겠는데, 그래서. 대체. 왜 사용하는가에 대한 의문.

그것은 바로 코드의 중복과 유지보수의 편의성을 위해서다. 자, 맥락에 따라서 달라질 수 있는 기능이란 무엇을 말할까, 그리고 여기에서 중복을 어떻게 제거하는가.

쉽게 게임에서의 직업, 클래스를 예로 들어보자. 우리는 검사, 마법사라는 직업을 알고있다. 하지만 추후 마검사라는 직업을 추가한다고 할때. 이 직업들의 공통적인 특징인 '직업' 또는 클래스라는 내용으로 추상 클래스를 작성하고 그 하위에 검사와 마법사가 필요한 특징들을 추상 메소드로 구현한다.

  • 검사 extends 클래스
    무기를 휘두르는 메소드
    체력이 높음
  • 마법사 extends 클래스
    무기를 휘두르는 메소드
    마법을 사용할 수 있음
    지능이 높음
  • 마검사의 경우에는 검도 사용할 수 있으며 칼을 휘두르는 메소드 또한 사용할 수 있다. 그리고 마법을 사용할 수도 있을 것이다.
  • 마검사 extends 클래스
    무기를 휘두르는 메소드
    마법을 사용할 수 있음
    체력과 지능이 애매함

여기서 공통분모인 무기를 휘두른다는 메소드는 상위 클래스에 두어서 코드의 중복을 줄이고 그이외에 마법을 사용한다든지 체력 또는 지능이 높다든지하는 경우는 클래스별 특징에 해당하므로 하위 클래스에서 추상메소드로 구현하도록 한다.

이런식으로 기능이나 어떤 출력에 예외를 둘 때와 같이 맥락에 따라서 달라질 때 추상 클래스와 메소드로 추상화, 분류하는 작업을 통해 중복을 줄이고 규모가 큰 프로젝트에서 유지보수를 용이하기 위해서 추상 클래스를 사용하게 된다.

인터페이스


인터페이스는 일종의 추상클래스이다. 인터페이스는 추상클래스처럼 추상메서드를 갖지만 추상클래스 보다 추상화 정도가 높아서 추상클래스와는 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 어떠한 요소도 허용하지 않는다. 추상클래스를 부분적으로만 완성된 '미완성 설계도'라고 한다면, 인터페이스는 구현된 것은 아 무것도 없고 밑그림만 그려져 있는 '기본 설계도'라고 할 수 있다. 인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중상속, 즉 여러개의 인터페이스로부터 상속을 받는 것이 가능 하다. 인터페이스의 특징은 다음과 같다.

  • 일종의 추상 클래스
  • 모든 메서드가 구현된 부분이 없는 추상 메서드 형태로 이루어진 클래스
  • Implements 키워드를 사용
  • 상속의 관계가 없는 클래스간 서로 공통되는 로직을 구현하여 쓸 수 있도록한다.
  • Extends는 하나의 클래스만 상속 가능하나 Interface는 다중 상속이 가능하다.

 

인터페이스를 왜 사용하는가


그렇다면 대체 인터페이스를 언제, 왜 사용하는가. 인터페이스는 협업시에 유용하게 사용할 수 있다.

예를들면 A,B,C 이렇게 엮여서 동작하는 클래스가 있다고 한다면, A,B,C가 모두 클래스가 구현이 되어있어야 오류가 생기지 않고 작동이 된다. 하지만 협업시에 C는 따로 다른 팀에서 작업한다고 했을 때 C가 미완성된 상태에서 A와 B만 가지고 있다면, 이럴 때 인터페이스를 만들어 C를 가리키며 명시적으로 나타내기만 해준다면 C를 별도로 구현하지 않아도 작동이 되는 것이다.

즉 일부로 결합도가 낮은 코드를 만들어 협업과 유지보수가 용이해지도록 만드는 것이다.

일반적으로 부모 클래스의 내부구현을 자식클래스들이 상속받아 공유할 필요가 있으면 추상클래스를 사용하고 공유할 내부 구현이 없다면 더 추상적인 인터페이스를 사용한다. 객체지향 설계에서 말하는 유연한 설계란 기존 코드의 변경이 적고 확장가능한 것을 말하기 때문에, 이를 실천하기 위해서는 추상적인 것을 의존하게 만드는 것으로 가능하다.

이는 의존 대상이 구체적이기 보단 추상적일 수록 더욱 좋다. 그렇기 때문에 추상클래스보다 더 추상적인 인터페이스는 객체지향적인 코딩을 하기에 꼭 필요한 유용한 방법이다.

기존 코드의 변경이 적고 확장 가능한 객체 지향적인 코딩을 하기 위해서 사용한다.

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


그렇다면 굳이 왜 이 둘을 콕 집어서 비교해야할까? 오버라이딩과 오버로딩은 이름이 비슷하기라도 하지, 추상클래스와 인터페이스는 겉보기에도 확연히 다르다. 당연히 이 둘의 개념은 명확히 다르다. 다만 사용하는 것에 있어서 이 둘은 비슷한 점이 있다.

추상 클래스와 인터페이스는 모두, 상속받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메소드를 구현하도록 강제한다. 즉 결국에는 둘다 추상 메소드를 구현하는 일을 하나의 클래스인 셈이다.

공통점

  • 자기 자신이 new를 통해 객체를 생성할 수 없으며, 상속받은 자식만이 객체를 생성할 수 있다.
  • 프로토타입만 있는 메서드를 갖는다.
  • 둘 다 하나의 클래스이며 하위클래스에서 모든 메서드를 구현해야 한다.

 

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


인터페이스 추상클래스
구현 객체의 같은 동작을 보장하기 위함 추상클래스를 상속받아 기능을 이용, 확장하기 위함
다중 상속이 가능하다 다중 상속이 불가능하다
추상메소드만 사용 가능하다 일반메소드와 추상메소드 모두 사용 가능하다
생성자와 일반변수를 가질 수 없다 생성자와 일반변수를 모두 가질 수 있다
메서드 선언만 가능 메서드의 부분적인 구현 가능
상속받은 클래스는 반드시 인터페이스에 있는 메서드를 모두 다 구현해야함 상속받는 클래스는 추상메서드만 구현해도됨
Implements 사용 extends 사용

스스로에게 질문해보기


Q. 추상클래스, 인터페이스 각각 어떤 상황에서 사용하게 되나?


  • hwannny 2020.03.16 03:42

    포스팅 잘 읽었습니다~

    혼자 개발하더라도 인터페이스는 꼭 필요하다고 생각합니다~

    그 이유는 일반적으로 부모 클래스의 내부구현을 자식클래스들이 상속받아 공유할 필요가 있으면 추상클래스를 사용하고 공유할 내부 구현이 없다면 더 추상적인 인터페이스를 사용합니다.

    객체지향 설계에서 말하는 유연한설계란 기존 코드의 변경이 적고 확장가능한 것을 말합니다.

    이를 실천하기 위해선 추상적인것을 의존하게 만드는것으로 가능한대 의존대상이 구체적이기 보단 추상적일 수록 좋습니다.
    왜냐하면 구체적인 클래스는 자주변경되며 이를 의존하는 클래스들 또한 변경을 피할 수 없거든요. 이에 비해 추상 클래스는 변경가능성이 낮고 확장에 용이하죠.

    결론적으로 추상클래스 보다 더 추상적인 인터페이스는 팀원 규모와 상관없이 추상클래스와 동일하게 중요합니다.

    은유  2020.03.16 22:54 신고

    다시 생각해보고 hwanny님의 이야기를 들어보니 제가 너무 극단적으로 표현했던 점이 있네요. 협업시에 인터페이스를 유용하게 사용할 수 있지만 이것이 인터페이스의 전부인 것처럼 설명했던 것 같습니다. 참고해서 수정하도록 하겠습니다. 소중한 의견 감사합니다.