본문 바로가기

백엔드 기술/Java

추상 클래스와 인터페이스 차이

[추상 클래스] ( is a kind of ~ // ex. 사자 is a kind of 동물)

여러 자식들이 가지고 있는 공통된 속성을 뽑아서 하나의 클래스를 만들어 놓은 것.
하위 클래스에서도 상속을 통해 이 추상 클래스를 상속받아 객체를 구체화 한다.

1. 단일 상속을 지원
2. 변수를 가질 수 있다.

3. 하나 이상의 추상 메서드가 존재해야 한다.
4. 자식 클래스에서 상속을 통해 추상 메서드를 구현.

// 추상 클래스 // 
abstract class Animal {
	public String kind;
	public abstract void sound();
}

// 추상 클래스 상속 //
class Dog extends Animal { // Animal 클래스로부터 상속
	public Dog() {
		this.kind = "포유류";
	}

	public void sound() { // 메서드 오버라이딩 -> 구현부 완성
		System.out.println("멍멍");
	}
}

// 추상 클래스 상속 //
class Cat extends Animal { // Animal 클래스로부터 상속
	public Cat() {
		this.kind = "포유류";
	}

	public void sound() { // 메서드 오버라이딩 -> 구현부 완성
		System.out.println("야옹");
	}
}

class DogExample {       
    public static void main(String[] args) throws Exception {
       Animal dog = new Dog();
       dog.sound();

       Cat cat = new Cat();
       cat.sound();
    }
 }

// 출력값
멍멍
야옹

추상 클래스 Animal의 추상 메서드 sound()를 상속 클래스에서 오버라이딩 하고 있음.
이렇듯 추상 클래스를 사용하면,
하위 클래스에서 오버라이딩을 통해 각각 상황에 맞는 메서드 구현이 가능하다.


[인터페이스]
추상 클래스를 설계가 모두 끝나지 않은 미완성 설계도라면,
인터페이스는 그보다 높은 추상성을 가지는 가장 기초적인 기본 설계도.
오로지 상수와 추상 메서드만 가질 수 있고 이것을 다른 객체가 구현한다.
> 매개체 관점

1. 다중 상속을 지원.
2. 변수는 final 상수만 가질 수 있음.
3. 모든 메서드는 시그니처만 존재한다.
4. 구현 클래스는 인터페이스에 선언된 모든 메서드를 오버라이딩 한다.

interface Animal { // 인터페이스 선언. public abstract 생략 가능.
	public abstract void cry();
} 

interface Pet {
	void play();
}

class Dog implements Animal, Pet { // Animal과 Pet 인터페이스 다중 구현
    public void cry(){ // 메서드 오버라이딩
        System.out.println("멍멍!"); 
    }

    public void play(){ // 메서드 오버라이딩
        System.out.println("원반 던지기");
    }
}

class Cat implements Animal, Pet { // Animal과 Pet 인터페이스 다중 구현
    public void cry(){
        System.out.println("야옹~!");
    }

    public void play(){
        System.out.println("쥐 잡기");
    }
}

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

        dog.cry();
        dog.play();
        cat.cry();
        cat.play();
    }
}

// 출력값
멍멍!
원반 던지기
야옹~!
쥐 잡기

인터페이스 Animal, Pet을 Dog, Cat 클래스에서 구현하여 사용하고 있음.

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

1. 다중 상속, 다중 구현 가능 유무
인터페이스 : 가능
추상 클래스 : 불가

2. 가질 수 있는 변수 종류
인터페이스 : 상수(final static)만 가능.
추상 클래스 : 제한 없음.

3. 상속, 구현 키워드 (extends or implements)
인터페이스 : implements
추상 클래스 : extends

4. 목적
인터페이스 : 구현하는 객체들이 같은 동작을 보장하기 위함
추상 클래스 : 상속을 통해 자식 클래스에서 완성하도록 유도하는 클래스.

[결론]
추상 클래스는 부모 클래스를 상속 받아 추상 메서드의 오버라이딩을 통해
부모 클래스의 기능을 하위 클래스로 확장하는 느낌이지만,
인터페이스는 다중 구현이 가능하므로
인터페이스의 추상 메서드를 각 클래스의 기능 목적에 맞게 기능을 구현하는 느낌이다.

  추상 클래스 인터페이스
사용 키워드 abstract interface
사용 가능 변수 제한 없음 ONLY static final (상수)
사용 가능 접근 제어자 제한 없음 (public, private, protected, default) public
사용 가능 메서드 제한 없음 abstract method, default method,
static method, private method
상속 키워드 extends implements
다중 상속 가능 여부 불가능 가능
(클래스에 다중 구현, 인터페이스 끼리 다중 상속)
공통점 1. 추상 메서드를 가지고 있어야 한다
2. 인스턴스화 할 수 없다. (new 생성자 사용 불가)
3. 추상 클래스 혹은 인터페이스를 상속 받아 구현한 구현체의 인스턴스를 사용해야 한다.
4. 추상 클래스와 인터페이스를 상속, 구현한 클래스는 추상 메서드를 구현해야 한다.