본문 바로가기
Java

Java - Abstract Class와 Interface의 차이

by 오늘부터개발시작 2022. 8. 4.

Java를 처음 접했을 때 Abstract Class의 차이와 Interface의 차이도 모르긴 했지만 더 중요한건 이 귀찮은 구조를 왜 써야하는지에 대한 의문이었다. 모든 답변은 객체 지향 관점에서 개발하기 위해서 라고 할 수 있겠다. 지금도 완전히 객체 지향적인 개발이란게 무엇인지 잘 모르겠지만 이론적인 측면에서 좋은 구조를 만들기 위해서는 추상화가 중요하다는 사실만은 머릿속에 들어있다. 오늘은 추상 클래스와 인터페이스의 차이에 대해서 알아보도록하겠다. 

 

Abstract Class

먼저 추상 클래스에 대해서 알아보도록 하겠다. 추상클래스는 class 내부에 추상 메소드가 하나 이상 포함되거나 class 앞에 abstract라는 표시가 있는 클래스이다. abstract 클래스는 상속해서 사용하기 위해 만들어진 클래스이다. 공통으로 사용할 수 있는 메소드를 추상클래스에 만들어놓고 반복을 줄일 수 있고 구조를 강제할 수 있다. 예시를 들어보도록하겠다.

 

public abstract class Human {
	public abstract void eat();
}

 

Human이라는 추상 클래스가 있다. 모든 인간은 먹기 때문에 eat이라는 추상메소드는 Human 클래스를 상속한 모든 클래스는 반드시 구현해야한다. 아래 Doctor와 Laywer 클래스는 eat 메소드를 구현하고 있다. 

 

public class Doctor extends Human {
	@Override
    public void eat() {
    	System.out.println("Eat Steak");
    }
}

 

public class Lawyer extends Human {
	@Override
    public void eat() {
    	System.out.println("Eat Fish");
    }
}

 

이 뿐만 아니라 추상 클래스는 A - B - C 라는 프로세스에서 B만 클래스에 따라 달리하고 싶을 때도 사용할 수 있다. 아래와 같은 추상 클래스를 만들면 된다. 아래 처럼 먹기 전, 후의 과정인 구매, POO는 구현을 추상 클래스에 해놓고 eat만 상속 받은 클래스에서 구현하게 할 수 있다.

 

public abstract class Human {
    private void buy() {
    	System.out.println("Buy");
    }
    
    private void poo() {
    	System.out.println("Poo");
    }
    
    public abstract void eat();
    
    public void eatProcess() {
    	buy();
        eat();
        poo();
    }
}

 

Interface

인터페이스는 추상 클래스보다 더 추상적인 클래스라고 볼 수 있다. 인터페이스에서는 로직을 구현할 수 없고 단지 구조만 강제하고 싶을 떄 주로 사용한다. 자바8부터는 default라는 예약어를 사용해 로직을 구현이 가능해졌지만 그렇게 사용하는 예제는 찾아보기 힘든 것 같다. 인터페이스를 implement한 모든 클래스는 반드시 인터페이스의 구조를 따라가야한다. 인터페이스를 제공함으로써 불필요한 구조로 코드를 작성하지 않도록 가이드하는 역할도 할 수 있다.

 

인터페이스의 특징은 new 키워드로 객체를 생성할 수 없고 상속받은 클래스만 new로 객체를 생성할 수 있다. 인터페이스는 다른 클래스들과 다르게 다중 상속이 가능한데, implement를 사용해서 여러 인터페이스를 상속받을 수 있다. 참고로 인터페이스 끼리 상속할 때는 extends 키워드를 사용한다. 

 

 

추상 클래스와 인터페이스의 차이점을 정리해보면 추상 클래스는 상속을 받아서 기능을 확장하는 목적이 있고 인터페이스는 확장이 아닌 정해진 구조를 따라 개발하도록하는 가이드 역할이 크다. 

'Java' 카테고리의 다른 글

Java - Stream에 대해서  (0) 2022.08.09
Java - Wrapper Class란  (0) 2022.08.08
Java - String pool  (0) 2022.08.03
Java - 가비지 컬렉션(Garbage Collection)이란?  (0) 2022.08.02
Java - 컴파일 과정  (0) 2022.08.01