공부하는 블로그

Java | Abstract Class & Interface 본문

Java

Java | Abstract Class & Interface

치킨닮은닭 2020. 5. 14. 01:14

Abstract Class?

 추상 클래스(Abstract Class)는 하나 이상의 추상 메서드를 포함하는 클래스이다. 여기서 추상 메서드란 정의만 내려진 채 내용이 없는 메서드이다. 즉, 기능(로직)은 없이 뼈대(결과값과 매개변수의 자료형)만 있는 메서드이다. 이러한 추상 메서드는 추상 클래스를 상속 받은 서브 클래스에서 구현된다.

 

 자바에서 추상 클래스와 추상 메소드를 선언하기 위해서는 접근제어자 뒤에 abstract를 붙여주면 된다.

Interface?

 인터페이스(Interface)는 추상 메서드로만 구성되어 있으며 추상 클래스와 마찬가지로 인터페이스에서 선언된 추상 메서드는 서브 클래스에서 구현된다. 자바에서 예약어로 class 대신 interface를 사용하며 extends 대신 implement로 서브 클래스에서 상속 받을 수 있다.

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

 위의 설명만 보면 추상 클래스와 인터페이스는 예약어를 제외하면 차이가 전혀 없어 보인다. 눈에 보이는 문법적인 차이부터 설명하자면  추상 클래스는 다중 상속이 불가능하며 멤버로 추상 메서드 뿐만 아니라 변수나 일반 메서드도 가질 수 있지만 인터페이스는 다중 상속이 가능하며 멤버로 오로지 추상 메서드만 가질 수 있다.

 

 문법적인 차이도 있지만 사용 목적에 따른 차이도 존재한다. 상속은 슈퍼 클래스의 기능을 서브 클래스에서 이용하거나 확장하기 위함이고 인터페이스는 구현한 객체들에 대해서 동일한 동작을 약속하기 위해 존재한다.

 

 핸드폰을 예시로 이해 해보자.

 

출처 gongbu-ing.tistory.com

 Phone 클래스는 call(), message()라는 일반 메서드와 ai()라는 추상 메서드를 가진 추상클래스이다.

public abstract class Phone {
	
    public void call() {
    	System.out.println("따르릉따르릉");
    }
    
    public void message() {
    	System.out.println("카톡 카톡");
    }
    
    public abstract void ai();
    
}

 모든 서브 클래스는 call(), message()가 동일하게 작동는 반면에 ai()는 Galaxy에서는 빅스비로, iPhone에서는 시리로, V50에서는 구글로 각각 다르게 작동될 수 있도록 슈퍼 클래스에서 정의하지 않고 추상 메서드로 남겨두었다. 

public class Galaxy extends Phone {

    public void ai() {
    	System.out.println("빅스비");
    }
    
}
public class IPhone extends Phone {

    public void ai() {
    	System.out.println("시리");
    }
    
}
public class V50 extends Phone {

    public void ai() {
    	System.out.println("구글");
    }
    
}

 여기서 결제 기능을 추가하기 위해 pay()라는 추상 메소드를 가진 Payment라는 인터페이스를 만들어주자. 

public interface Payment {

	public void pay();

}

 Payment는 Galaxy에 장착되어 삼성페이를, V50에 장착되어 LG페이 기능을 수행한다. iPhone은 아쉽게도 한국에서 애플페이가 제공되지 않으므로 기능이 빠졌다.

public class Galaxy extends Phone implements Payment{

    public void ai() {
    	System.out.println("빅스비");
    }
    
    public void pay() {
    	System.out.println("삼성페이");
    }
    
}
public class V50 extends Phone implements Payment{

    public void ai() {
    	System.out.println("구글");
    }
    
    public void pay() {
    	System.out.println("LG페이");
    }
    
}

 여기서 Phone과는 공통 분모가 없는 전혀 다른 클래스인 Credit Card가 pay() 기능을 가지고 싶어한다. 이 때 Payment 인터페이스를 장착시켜 신용카드 결제 기능을 구현시키기도 한다.

 

 부족한 머리로 나름의 정리를 해보자면 추상 클래스는 서브 클래스들 간의 공통 분모를 추상화 시킨 클래스이다. 반면에 인터페이스는 공통 분모를 기준으로 추상화를 시킨다기 보다는 기능을 장착시킨다(?)는 느낌이다. 내가 쓰고도 뭔말인지 잘 이해가 가진 않는다..

추상 클래스와 인터페이스를 왜 사용할까?

 그냥 바로 서브 클래스에서 메소드를 만들면 될텐데 개발자들은 왜 굳이 추상 클래스와 인터페이스로 뼈대를 따로 만들어 주는 것일까? A와 B가 함께 프로그램을 개발한다고 가정해보자. B는 A가 개발한 기능을 이용하여 프로그램을 진행해야 한다. 그렇다면 B는 A가 개발을 완료할 때까지 구경만 하고 있어야 할까? 이럴 때 인터페이스를 이용하면 제공자(A) 쪽에서 미 구현되어 있어도 사용자(B) 쪽에서 인터페이스 명과 메서드 명만 알고 있어도 개발 진행이 가능하게 된다.

 

 즉, 인터페이스는 '개발자들 사이에 규약, 어떠한 메소드를 사용할 것인가에 대한 명세서'라고 볼 수 있다.


Reference

 

· 생활 코딩 : 인터페이스 사용 이유 - https://www.youtube.com/watch?v=Pvjss79v_qw

· 추상클래스와 인터페이스의 차이? - https://www.youtube.com/watch?v=VuJHRyIq-w0

· 추상클래스와 인터페이스 이해, 캐스팅에 대해 - https://www.youtube.com/watch?v=Ky-CvCQp-qs

· https://sungwoon.tistory.com/59

Comments