Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발자이야기

Java interface vs abstract(추상클래스) 차이 본문

JAVA

Java interface vs abstract(추상클래스) 차이

개발자가되고싶어 2021. 8. 11. 18:48
interface vs abstract 차이

 

인터페이스? 추상클래스?

우린 위의 두개가 무엇인지 어느정도는 알고있습니다. 해당 포스팅까지 찾아오신 분이라면 쓰는방법은 알고 계실거라 생각됩니다. 하지만 왜? 어떻게 두개를 구분해서 써야하는거지? 인터페이스는 음.. 다중상속이 되고 추상 메소드를 가지고 있다. 추상클래스는 음.. 다중상속이 되지 않고 추상 메소드를 가지고 있다.. 뭐야.. 그럼 다중상속이 되는 인터페이스를 쓰면되겠네..!?

 

인터페이스

인터페이스는 설계의 기초 틀을 잡아 놓는 역할을 한다고 생각하면 됩니다.

public interface 인터페이스 {
    int oh = 1; //상수
    String method(); //추상메소드
    default void method2() { //default 메소드
        System.out.println("default 메소드!");
    }
}

위처럼 인터페이스의 기존 틀을 잡아놓고 사용할 수 있습니다. default 메소드는 java8 에서 추가된 인터페이스 내에서 구현이 가능한 메소드 입니다. 그리고 추상메소드의 경우 앞에 abstract가 왜 안붙냐 라고 생각하실 수도 있습니다. 인터페이스에서는 abstract 키워드가 생략됩니다.

간단한 구성요소를 살펴보았습니다.. 잠시 후 예제를 통하여 좀더 깊게 알아보겠습니다.

 

추상클래스

추상클래스는 여러개의 클래스에서 공통된 기능을 추출하여 모아놓는 역할을 합니다. 

public abstract class 추상클래스 {
    int oh; //필드
    void method1(){ //메소드
        System.out.println("method");
    }
    public abstract void method2(); //추상메소드
}

추상 클래스는 위처럼 메소드를 두어 공통적인 기능을 구현할 수 있습니다. 그리고 추상메소드를 명시해 두어 자식 클래스에서 구현을 강제할 수도 있습니다. 위의 코드에서 자식 클래스에 구현이 강제되는 것은 method2() 메소드 입니다.

 

여기까지 간단히 인터페이스와 추상클래스의 구성요소를 살펴보았습니다. 하지만 저희는 두가지를 어떻게 구분지어 사용해야 하는가를 알 필요가 있습니다.

이제 예시를 통해 알아봅시다.

 

예시

예시를 통하여 상황을 하나 살펴보려 합니다.

학교에는 선생님이 있습니다. 선생님은 수업을 가르치며, 한 반의 담임 선생일 수 있고 시간제 강사일 수도 있습니다. 또한 학생들을 지도 합니다. 

 

위의 예시를 한번 코드로 풀어봅시다.

 

선생님들의 공통점(abstract class)

선생님은 공통적으로 학생들을 지도합니다. 그리고 학생들을 가르치기도 합니다. 하지만 어떤 과목을 가르치는지는 알수가 없습니다. 어떤 과목을 가르치는지 알수가 없으니 구현 클래스에 구현을 위임합시다.

우리는 선생님들의 공통점이 무엇인지 알았습니다. 이제 공통점을 추상클래스로 구현해주면 됩니다.

public abstract class Teacher {
    public void guide() {
        System.out.println("학생들을 지도한다.");
    }
    public abstract void teach();
}

public class MathTeacher extends Teacher {
    @Override
    public void teach() {
        System.out.println("수학선생님");
    }
}

어떠한 선생님 이라도 선생님은 학생들을 지도할 수 있습니다. 그리고 각자의 대표 과목을 가지고 있습니다. 이처럼 공통적인 행동을 하는 것은 추상 클래스에 구현하여 공통으로 사용하면 됩니다. 그리고 공통된 정확한 정보가 구현 클래스에서 알 수 있는것이라면 구현을 위임하면 됩니다.

 

선생님들이 할 수도 있는것(interface)

이제 선생님들이 할 수도 있는것을 살펴보겠습니다.

위의 설명한 예시에서 선생님들은 한 반의 담임 선생일수도 있으며 시간제 강사일수도 있다고 설명했습니다.

 

1. 담임선생님

담임선생님은 한 반을 이끌어가야 할 책임이 있습니다. 학생들이 등교했는지를 체크해야 할 의무가 있습니다.

//담임선생님의 역할을 구현하지 않고 정의 해 놓는다.
public interface ClassTeach {
    void classTeach();
    void attendance();
}

public class MathTeacher extends Teacher implements ClassTeach {
    @Override
    public void teach() {
        System.out.println("수학선생님");
    }

    @Override
    public void classTeach() {
        System.out.println("3반 담임선생님");
    }

    @Override
    public void attendance() {
        System.out.println("학생들이 등교를 했는지 출석부를 부른다.");
    }
}

2. 시간제강사

시간제 강사는 학교에 계속 머무르지 않습니다. 자신의 수업시간일 때만 학교에 머무르면 됩니다.

public class ScienceTeacher extends Teacher implements PartTimeTeacher {
    @Override
    public void teach() {
        System.out.println("과학선생님");
    }

    @Override
    public void teachingTime() {
        System.out.println("1시~4시 까지만 강의");
    }
}

코드로의 설명은 이정도만 하려 합니다. 코드가 난잡해 지면 읽기가 힘들고 분석하기 힘들것이라 생각합니다.

위의 예시에서 결국 차이점은 무엇일까요?

모든 선생님 class에서 공통적으로 사용할 수 있는가? 선택적으로 구현을 해야하는 것인가?

두개의 차이점이 있습니다. 선생님은 무조건 적으로 학생을 가르쳐야 하는 공통점이 있으므로 공통화 시킬 수 있어 추상클래스로 만들며 이제 무조건적이 아닌 선택적 구현이 필요한 것을 인터페이스로 정의를 해놓는 것 입니다.

 

위의 내용은 충분히 억지스러울 수 있습니다. 시간제 강사도 학생의 출석을 부를수 있을 수 있을 수 있습니다. 최대한 짧게 표현하기 위함이니 양해 부탁드립니다.

'JAVA' 카테고리의 다른 글

Java Thread  (0) 2021.08.16
Java String vs StringBuffer vs StringBuilder  (0) 2021.08.12
Java 메모리 관리 stack 과 heap  (0) 2021.08.05
java Hashmap vs Hashtable  (0) 2021.08.03
java ArrayList, LinkedList  (0) 2021.07.30