• 추상 클래스 vs 인터페이스 :: 마이구미
    Java 2017. 11. 25. 17:17

    이 글은 Java 에서 사용되는 추상클래스와 인터페이스의 차이점을 다룬다.

    Java 를 사용하지 않더라도, 참고하면 도움이 될 것이다.


    Java 에서 추상 클래스와 인터페이스를 많이 헷갈려한다.

    그 이유는 겉으로 보기에는 똑같아 보이기 때문이다.

    하지만 엄연히 다른 목적을 가지고 있다.

    지금부터 차근차근 궁금증을 풀어보자.


    인터페이스는 무엇인가?


    인터페이스는 쉽게 말하면 껍데기라고 말할 수 있고, 설계도 또는 명세라고 생각하면 된다.

    모든 메소드가 추상 메소드이고, 일반 변수를 가질 수 없다. (추상 클래스와 비교해보자)

    그 의미는 인터페이스를 구현한 클래스는 모든 메소드를 강제적으로 구현해야한다.

    선언 시 interface 키워드를 사용한다.


    interface Vehicle {     abstract void run ();

    abstract void move (); }


    추상 클래스는 무엇인가?


    일반적으로 Java 에서 클래스는 2가지로 구분된다.

    일반 클래스와 추상 클래스로 구분되어진다. (여기서 인터페이스는 클래스가 아니라는 것을 기억하고 넘어가자)


    추상 클래스0개 이상의 추상 메소드(아직 구현되지 않은 메소드) 를 가지고, 일반 메소드, 일반 변수 또한 가질 수 있다.

    그렇기에 인터페이스 역할도 하면서, 구현체도 가지고 있는 돌연변이 같은 클래스이다.

    선언 시 키워드는 abstract 키워드를 사용한다.


    abstract class Animal {


    abstract void bark();

    void feed() {

    ..... }


    }


    왜 둘 사이를 헷갈리고 혼란을 초래하는 것인가?


    추상 클래스, 인터페이스 모두 인스턴스화가 될 수 없다.

    그래서 겉만 보기에는 인터페이스와 동일하게 보일 수 있다.


    인터페이스와 추상 클래스는 어떻게 사용할 수 있는가?


    인터페이스를 상속하기 위해서는 implements 키워드를 사용한다.

    추상 클래스를 상속하기 위해서 extends 키워드를 사용한다.


    class Car implements Vehicle {     Car() {}


    void run() {

    ....

    }


    void move() {

    ....

    }

    }


    class Dog extends Animal {

    Dog() {}


    void bark() {

    ....

    }

    }


    위와 같은 키워드를 통해 추상 클래스와 인터페이스의 차이점을 느낄 수 있다.

    인터페이스를 상속받은 경우는 모든 메소드를 구현해줬다.

    반면에 추상 클래스를 상속받은 경우는 일반 메소드가 아닌 추상 메소드만을 구현했다.

    이것이 의미하는 것은 다음과 같다.


    추상 클래스는 키워드 그대로 확장, 상속을 의미함으로써, 물려주는 개념이 된다. (feed 메소드는 물려받았기에 구현할 필요 없다)

    그렇기에 부모-자식 관계인 계층 구조를 나타낸다.

    하지만 인터페이스는 상속 개념이 아닌, 동일한 동작을 위한 구현을 강제화 한다.


    결론적으로, 추상 클래스는 상속 개념, 인터페이스는 그렇지 않다는 것을 이해하면 서로 가지는 목적을 구분짓을 수 있을 것이다.


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


    설계도라고 생각하면 된다.

    하나의 규약, 즉 구체적인 약속 같은 것으로 인해 협업에 필수적이라고 볼 수 있다.

    큰 프로젝트일수록 또는 개발 인원이 많을 경우 인터페이스를 통해 많은 이점을 얻게 된다.


    추상 클래스를 사용하는 이유는 무엇인가?


    상속을 강제하기 위함이다.

    부모 클래스에서 정의만 해놓고, 실제 동작은 자식 클래스에서 하게 된다.

    이러한 추상 클래스의 성격이 잘 반영되어진 것이 팩토리 메소드 패턴(Factory Method Pattern) 이다.

    다음 글에서 다뤄볼 예정이니 참고하면 더욱 이해에 도움이 될 것이다.

    팩토리 메소드 패턴 - https://mygumi.tistory.com/264

    댓글 6

Designed by Tistory.