본문 바로가기
프로그래밍/자바(Java)

[Java] 추상클래스 vs 인터페이스 차이점

by imfireguy 2021. 5. 19.
반응형

@pakata-goh unsplash

추상 클래스는 무엇일까요?

추상 클래스는 일반 클래스와 별로 다를 게 없습니다. 추상 메서드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스 입니다.

그래서 미완성 설계도라고 표현합니다. 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없습니다.

 

class 앞에 "abstract" 예약어를 사용하여 상속을 통해서 구현해야 한다는 것을 알려주고 선언 부만 작성하는 추상 매소드를 선언할 수 있습니다.

 

abstract class 클래스이름 {
	
	public abstract void 매소드이름();
	
}

 

인터페이스는 무엇일까요?

추상 클래스가 미완성 설계도라면 인터페이스는 기본설계도라고 할 수 있습니다.

인터페이스도 추상 클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하고 클래스와 다르게 다중 상속(구현이)이 가능합니다.

interface 인터페이스이름{
	
	public static final 상수이름 = "값";
	public abstract void 매소드이름();
	
}

 

추상 클래스 vs 인터페이스 차이점

추상 클래스와 인터페이스의 공통점은 추상매소드를 사용할 수 있다는 것입니다.

그럼 왜 굳이 2가지로 나눠서 사용할까요? 추상클래스와 인터페이스의 기능들을 살펴보면 추상 클래스가 인터페이스의 역할을 다 할 수 있는데 왜 굳이 인터페이스라는 게 있는 걸까요?

이론적인 차이점을 다 제외하고 두 개로 나눠서 사용하는 가장 큰 차이점은 사용용도라고 생각합니다.

 

1. 사용용도 차이점

이렇게 구분하는 이유는 다중 상속의 가능 여부에 따라 용도를 정한 거 같습니다.

자바의 특성상 한 개의 클래스만 상속이 가능하여 해당 클래스의 구분을 추상 클래스 상속을 통해 해결하고, 할 수 있는 기능들을 인터페이스로 구현합니다.

 

2. 공통된 기능 사용 여부

만약 모든 클래스가 인터페이스를 사용해서 기본 틀을 구성하다면 공통으로 필요한 기능들도 모든 클래스에서 오버 라이딩하여 재정의 해야 하는 번거로움이 있습니다.

이렇게 공통된 기능이 필요하다면 추상 클래스를 이용해서 일반 매소드를 작성하여 자식 클래스에서 사용할 수 있도록 하면 된다. 

이렇게 된다면 추상 클래스만 사용하면 되는 거 아니냐고 할 수 있겠지만 앞에서 언급했듯이 자바는 하나의 클래스만 상속이 가능합니다. 만약 각각의 다른 추상 클래스를 상속하는데 공통된 기능이 필요하다면 해당 기능은 인터페이스로 구현하는 게 편할 거 같습니다

 

추상클래스, 인터페이스 예시

추상클래스와 인터페이스 예시를 한번 구현해 보았습니다.

public abstract class Animal{
	
	public abstract void sound();
	
}

public class Cat extends Animal{
	
	public void sound() {
		System.out.println("cat");
		
	}
	
}

public class Dog extends Animal{

	public void sound() {
		System.out.println("dog");
	}
	
}

public class Main {

	public static void main(String[] args) {
		Dog dog = new Dog();
		Cat cat = new Cat();
		
		dog.sound();
		cat.sound();

	}
	
}

 

 

▼main클래스의 main 메소드 실행 결과 

반응형

댓글