본문 바로가기

STUDY

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

 

요즘 자바를 다시 공부하면서 정리할 게 많아진 것 같다

오늘은 추상클래스와 인터페이스를 정리해야징

 

 

인터페이스 
-  보통 ...able 형식의 네이밍 규칙을 따름 
-  클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용
-  implements 키워드를 사용해 정의된 메소드를 각 클래스의 목적에 맞게 구현
-  모든 변수는 public static final
-  모든 메서드는 public abstract, default, static, private

다중 상속 가능

 


추상 클래스
-  클래스 간의 연관 관계를 구축하는 것에 초점
-  extends 키워드를 사용해 자신의 기능을 하위 클래스로 확장시킴

-  부모 클래스가 가진 기능들을 구현해야할 경우 사용
-  abstract으로 선언한 메소드는 오버라이딩 필수 (자식 클래스에서 반드시 구현해야함)
-  모든 변수, 메서드 선언가능

-  다중 상속 불가능

-  중복 필드를 위해 보통 사용됨

 


공통점
-  인스턴스화 할 수 없다 (new 생성자 사용 x)

-  즉, 상속받아 구현한 구현체의 생성자를 사용

-  추상메소드를 반드시 @override 해야한다

 

 

위 그림과 같이 '탈 것' 이라는 최사위 추상 클래스가 있고, 그 하위 추상클래스인 자동차, 비행기가 있으며 각 추상클래스를 상속받아 구현한 바퀴, 핸들, 날개 서브 클래스가 있다고 가정하자 만약 moveable 메소드를 추가하고 싶다면(여기서 핸들은 움직이지 않는다고 가정) 확장성을 위해 자동차 추상 클래스에 메소드를 추가해야 한다

 

하지만 움직이는 것은 바퀴만 할 수 있으니 이슈가 발생한다(물론 그냥 메소드를 바퀴 서브 클래스에 선언하거나 자동차 클래스에 새로 넣을 moveable 메소드를 선언만 하고 빈칸으로 나둬도 가능은 함) 이러한 이슈를 해결하기 위해 인터페이스를 구현하여 추상화를 이루게 해주면 된다

 

위의 그림을 코드로 표현하면 다음과 같다

 

abstract class Vehicle { }

abstract class Car extends Vehicle { }
abstract class Airplane extends Vehicle { }

interface Flyable {
  void flying();
}

interface moveable {
  void moving();
}

class Handle extends Car { }

class Wheel extends Car implements moveable {
  
  @Override
  public void moving() { }
  
}

class Wing extends Airplane implements Flyable, moveable {
  
  @Override
  public void flying() { }

  @Override
  public void moving() { }

}

 

 

 

끄읏 -!

'STUDY' 카테고리의 다른 글

[JAVA] Static vs Final vs Static Final  (0) 2024.01.09
데이터 파이프라인(Data pipeline)이란  (0) 2024.01.05