abstract(추상) & interface(인터페이스)
자바에서 abstract라는 용어를 들어본 적이 있을 것이다.
추상클래스, 추상메서드에 적용되는 용어인데 예시를 하나 들어보자.
public class Animal {
public void sound(){
System.out.println("동물 울음 소리");
}
}
애니멀이라는 부모 클래스를 만들어놓고 자식으로 Dog라는 클래스를 만들어서 sound()를 오버라이딩 하려고 한다.
public class Dog extends Animal {
@Override
public void sound(){
System.out.println("멍멍");
}
}
근데 만약에 여기서 sound()를 실수로 오버라이딩 하지 않았다면?
부모인 Animal의 메서드인 sound()가 실행되게 된다.
이런 실수를 방지하고 Animal이라는 객체를 생성하지 못하도록 추상 클래스를 사용한다.
public abstract class Animal {
public abstract void sound();
}
위는 Animal이라는 클래스를 추상 클래스로 만들고 sound() 메서드를 추상 메서드로 만들었다.
메서드를 추상으로 만들면 Animal을 상속받는 모든 자식들은 sound를 오버라이딩 해줘야한다!!!
또한 Animal이라는 객체를 직접적으로 생성하지 못하도록 막아준다.
만약에 추상 메서드를 하나라도 만들면 클래스는 추상 클래스가 돼야 한다.
근데 모든 메서드가 abstract면 ??
해당 클래스를 순수 추상 클래스라고 정의하는데, 이걸 편하게 사용하기 위해 인터페이스라는 개념이 등장한다.
public abstract class AbstractAnimal {
public abstract void sound();
public abstract void move();
}
위와 같은 순수 추상 클래스를 아래의 인터페이스로 바꿀 수 있다.
인터페이스는 class가 아니라 interface라는 키워드를 사용한다.
public interface InterfaceAnimal {
void sound();
void move();
}
또한 추상 메서드에 있는 public abstract을 생략할 수 있다.
기존에 순수 추상 클래스는 아래 3가지 특징을 가졌다.
- 인스턴스를 생성할 수 없다.
- 상속시 모든 메서드를 오버라이드 해야한다.
- 주로 다형성을 위해 사용된다.
그런데 여기서 인터페이스는 추가 특징을 가진다.
- 인터페이스의 메서드는 모두 public abstract다.
- 근데 편의상 생략할 수 있으며, 생략이 권장된다.
- 인터페이스는 다중 구현(다중 상속)을 지원한다!!
또한 인터페이스에서 멤버 변수에는 static, public, final이 전부 포함되었다고 간주한다.
public interface Animal{
(public static final 생략)int MY_POINT = 3.32;
}
인터페이스는 구현이라는 키워드를 사용한다. 클래스는 extends를 사용했다면 인터페이스는 implements라는 키워드를 사용한다.
public class Book implements Item{
@Override
public void read() {
System.out.println("이것은 책입니다.");
}
}
왜 그러면 순수 추상 클래스를 사용하지 않고 인터페이스를 사용할까?
1. 제약 조건
인터페이스를 만드는 이유는 인터페이스를 구현하는 곳에서 모든 메서드를 구현해라! 라고 제약을 주는 것이다.
즉 하나의 기능도 빠지지 않도록 하기 위해서 사용한다.
2. 다중 구현
자바에서 클래스 상속은 하나만 가능하다. 즉 순수 추상 클래스를 사용하면 하나의 상속만 가능하지만 인터페이스를 사용할 경우 여러 개의 인터페이스를 구현할 수 있다. 즉 다양한 기능을 하나의 클래스에 섞을 수 있다는 특징이 존재!!