학과 자바 강의시간에 추상클래스와 인터페이스에 대해서 배웠다. 프로젝트를 진행하면서 본 개념을 이용했지만, 막상 이해도는 무지한 느낌이었다.

그러던 중 인턴 활동과 개인 공부를 통해 이들의 필요성을 깨달았다. 두 개념을 왜 사용하는지, 어떤 점이 좋은지, 차이점이 존재하는 이유 등을 직접 코드를 작성해보면서 느낀 것이다.

그 후로 나는 ‘이 개념을 직접 깨달았으니까 완벽히 안다.’라고 생각하고 있었다. 하지만 이 생각은 큰 착각이었고, 처참하게도 면접 때 본 개념에 대한 질문을 받으니 설명을 제대로 못 했다. :( 그래서 이참에 머릿속의 생각을 정리하는 겸, 두 개념에 대해 작성해본다.

추상메소드(Abstract Method)란?

선언부만 있고 구현부가 없는 메소드를 의미한다. 즉, 중괄호({})로 묶인 body 부분을 작성하지 않은 것을 말한다. 선언할 때에는 abstract 한정자를 사용하여 선언해야 한다.

public abstract void 메소드명();

추상클래스(Abstract Class)

일반적으로 추상메소드가 하나 이상 포함되는 경우를 의미한다.

추상클래스는 상속(extends)을 통하여 구현한다. 자바에서는 단일 상속만을 지원하기 때문에 단 하나의 클래스만 상속받을 수 있다. 상속의 개념은 부모클래스의 속성과 메소드를 자식클래스가 물려받는 것이다. 따라서 상속받은 클래스는 선언된 추상메소드를 반드시 구현해야 한다.

인턴 활동을 하면서 추상클래스의 필요성을 알게 되었다.

예를 들면 여러 클래스가 4개의 공통 기능과 1개의 다른 기능을 포함해야 한다. 1개의 다른 기능 때문에 모든 클래스에 똑같은 코드를 작성하는 것은 비효율적이다. 이 경우 5개의 기능을 추상클래스를 통해 작성하는 것이다.

public abstract class 추상클래스명 {

    public void 공통기능1() { System.out.println("첫 번째 공통기능입니다."); }
    public void 공통기능2() { System.out.println("두 번째 공통기능입니다."); }
    public void 공통기능3() { System.out.println("세 번째 공통기능입니다."); }
    public void 공통기능4() { System.out.println("네 번째 공통기능입니다."); }

    public abstract void 다른기능();

}

4개의 공통 기능은 일반 메소드로 작성하고 1개의 다른 기능은 추상메소드로 구현한다. 그러면 이 추상클래스를 extends 하여 추상메소드만 다르게 구현함으로써 효율적인 코드를 작성할 수 있게 된다.

인터페이스(Interface)

일반적으로 모든 메소드가 추상메소드인 경우를 의미한다.

인터페이스는 포함(implements)를 통하여 구현한다. 단일 상속만을 지원하는 자바의 단점을 보완하기 위하여 사용한다. 즉, implements를 구현하는 부분에서 extends를 사용하여 다중 상속을 가능하게 하는 것이다. 인터페이스를 포함한 클래스는 인터페이스의 모든 메소드를 반드시 구현해야 한다.

지난 방학에 C로 된 자료구조 Java로 바꾸기 를 진행하면서 인터페이스의 필요성을 알게 되었다.

예를 들면 스택(stack)을 구현하는데 배열(array)를 이용할 수도 있고 연결 리스트(linked list)를 이용할 수도 있다. 하지만 구현하는 방법만 다를 뿐, 스택에 필요한 추상 데이터 타입(abstract data type: ADT)은 동일하다.

isEmpty(); // 스택이 비어 있는지를 검사한다.
isFull(); // 스택이 가득 찼는가를 검사한다.
push(e); // 스택의 맨 위에 요소 e를 추가한다.
pop(); // 스택의 맨 위에 있는 요소를 삭제한다.
peek(); // 스택의 맨 위에 있는 요소를 반환한다.

이 경우 인터페이스를 이용해 스택의 추상 데이터 타입을 정의하는 것이다. 그리고 이를 implements 하여 모든 메소드의 body 부분을 구현 방법에 알맞게 작성한다. 직접 사용해보면서 느낀 건 코드를 관리하는 게 보다 편리했다.

ps. 우선은 간단한 개념과 경험을 통해 느낀 점을 정리하였다. 추후에 알게 되는 내용과 지식은 계속 업데이트할 예정이다. [2016-02-26 추가]