미누에요
[Java] 인터페이스(Interface)와 추상 클래스(abstract class) 의 차이 본문
추상 클래스(abstract class)
추상 메서드(abstract method)가 포함된 클래스
추상 메서드가 하나라도 포함되면, 그 클래스는 추상 클래스로 선언해야한다.
- 다중 상속이 불가능하다
- 추상 메소드 외에 일반 메소드, 생성자, 필드를 가질 수 있다.
- "상속 관계"에 초점이 맞춰져있다.
- 객체를 생성할 수 없다.
- 추상 클래스를 추상 클래스에 상속할수도 있다.
import java.util.Stack;
abstract class Animal{ // 추상 클래스 Animal
public Animal(){}
public void eat(){
System.out.println("I am eating now");
}
abstract public void cry();
}
class Cat extends Animal{
public void cry(){
System.out.println("meow");
}
}
public class test {
public static void main(String[] args) {
Cat cat = new Cat();
cat.eat();
cat.cry();
}
}
실행 결과
위 예시 코드를 보면, 추상 클래스인 Animal은 abstract public void cry()라는 추상 메서드를 가지고 있다.
그 외에도 생성자 Animal()을 포함하며, 일반 메서드인 public void eat()도 있다.
참고로, 추상 메서드는 함수의 몸체를 구현하지 않는다.
이러한 Animal 를 상속받은 클래스는 Animal이 가지고 있던 추상 메서드를 무조건 재정의해야한다.
Cat 클래스에서 cry() 를 구현한 것을 확인할 수 있다.
인터페이스(Interface)
클래스가 구현해야 할 부분을 선언해두는 형태이다.
상수, 추상 메서드, default 메서드, private 메서드, static 메서드가 포함될 수 있다.
- 모든 변수는 public static final로 선언해야한다.
- 다중 구현(impliments)을 할 수 있다.
- 인터페이스끼리는 다중 상속(extends)을 지원한다.
- 상속 관계에 얽매이지 않고 특정 기능을 추가할 때 사용
interface PhoneInterface{
public static final int TIMEOUT = 10000;
public abstract void sendCall();
public abstract void recieveCall();
public default void printLogo(){
System.out.println("**Phone**");
};
}
인터페이스는 위처럼 사용한다.
개인적으로, 위의 설명들을 모두 보고도 인터페이스와 추상 클래스의 개념이 너무 헷갈렸다.
개념이 헷갈린다기 보단, 위 두 개념을 도대체 어떤 때에 사용하길래 이렇게 두 가지 개념으로 나누어져 있는건지 궁금해졌다.
그렇게 인터넷 자료들을 엄청나게 뒤져보다가, 한 게시물을 보고 단번에 이해가 되는 경험을 하였다.
그러니 부디 인터페이스와 추상 클래스의 차이에 대해 궁금증을 품고 있다면 이 글을 참고하길 바란다.
☕ 인터페이스 vs 추상클래스 용도 차이점 - 완벽 이해
인터페이스 vs 추상클래스 비교 이 글을 찾아보는 독자분들은 아마도 이미 인터페이스와 추상클래스 개념을 학습한 뒤에 이 둘에 대하여 차이의 모호함 때문에 방문 했겠지만, 그래도 다시한번
inpa.tistory.com
위 게시물에서, 굉장히 이해하기 좋은 자료를 참조하겠다.
인터페이스 : 상속 관계에 상관없이 특정 기능을 추가할 수 있다.
추상 클래스 : 상속 관계 중심이기 때문에 추상클래스에 추가한 내용을 자식 클래스가 모두 구현해야한다.
위 내용을 기억하자.
만약, 위와 같은 그림에서 swim이라는 기능을 추가하려고 한다면, 어떤 곳에 추가하겠는가 ?
아마 People과 whale에 swim()을 추가하고 싶을 것이다.
만약 추상 클래스를 사용한다면, Creature에 swim() 추상 메서드를 넣게 되면 모든 자식 클래스들이 swim()을 구현해야 한다,
혹은 Animal 클래스에만 swim()을 구현하면, Parrot, Tiger까지 수영을 할 수 있게된다.
혹은 Fish 클래스에 swim() 추상 메서드를 넣으면, 자식 클래스인 Whale만 swim() 을 구현하게 된다.
이러한 상황에서 추상 클래스를 사용하면 안되는 이유는 , 추상 클래스가 상속 중심으로 움직이기 때문이다.
우리가 현재 swim()을 추가해주고 싶은 People과 Whale은 굳이 따지자면 형제 관계이기 때문에 추상 클래스로는 줄 수 없는 것이다.
이럴 때, 인터페이스를 사용한다.
인터페이스는 상속에 아무런 영향을 받지 않는다.
따라서 위 상속구조에서 People과 Whale만 swim() 기능을 추가할 수 있게되는 것이다.
이러한 차이점을 이해했다면, 추상 클래스와 인터페이스의 차이점을 잘 이해한 것이라고 생각한다.
'Java' 카테고리의 다른 글
[Java] 컬렉션(Collection)과 제네릭(Generic), Wrapper 클래스 (0) | 2024.05.20 |
---|---|
[Java] 상속(inheritance) (0) | 2024.05.10 |
[Java] 메서드 오버라이딩(method overriding) (0) | 2024.05.10 |
[Java] final의 사용, final 변수, final 메서드, final 클래스, 인자로의 final (0) | 2024.05.10 |
[Java] static 메서드 (0) | 2024.05.10 |