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

Stormi·2022년 5월 27일
0

JAVA

목록 보기
1/1

추상클래스와 인터페이스는 모두 다른 클래스를 작성하는 데 도움을 주는 목적이 있다.

추상클래스

  • 추상메서드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스
  • 미완성 설계도로 불림
  • 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없음
  • 추상 클래스는 추상 메소드를 0개 이상 가지고 있다는 것을 제외하고는 일반 클래스와 다르지 않다.
  • 추상메소드는 간단하게 말하면 선언부는 있는데 구현부가 없는 메소드를 말한다.

언제 사용하는가?

  • 굉장히 밀접하게 관련된 클래스끼리 코드를 공유해야할 때 사용
  • 추상클래스의 하위 구현체 클래스들이 공통된 필드나 메소드를 많이 공유하고, 접근 제어자가 public이 아닌 경우
  • Non-static 혹은 not-final의 필드로 객체의 상태를 바꿔야하는 경우
abstract class 클래스이름 {
        public abstract void 메소드이름();
}

인터페이스

  • 기본 설계도로 불림
  • 다중상속(구현)이 가능하다. (클래스는 하나만 상속가능)
  • 객체를 만들수 없으며, 생성자를 갖지 않는다.
  • 상수나 추상메소드를 가질 수 있다.
  • Java 8 이후에, default메소드나 static 메소드를 가질 수 있게됨
  • 여기서 말하는 default메소드는 body를 가지는 메서드를 말한다
  • 반드시 override할 필요는 없다. 접근제어자는 public!!(그 default와는 다름)
  • 인터페이스를 써야만 가져오고 싶지않은 속성들은 안가져올 수 있다.
  • 추상메소드는 구현체가 없기때문에 모호한 상속 문제를 피할 수 있다.
  • 인터페이스가 추상클래소보다 좀 더 유연하게 다형성을 적용할 수 있다.

언제 사용하는가?

  • 관련이 없는 클래스들끼리 관계를 맺어줄 때
  • 특정 데이터 타입의 동작을 지정하려고 하지만 해당 동작을 누가 구현하는지는 중요하지 않을 때
  • 다중 상속이 필요한 때
interface 인터페이스이름{
       public static final 상수이름 = 값;
       public abstract void 메소드이름();

}

추상클래스 VS 인터페이스

  • 추상클래스는 일반 클래스와 다르지 않기 때문에 extends 키워드를 사용하고, 인터페이스는 implements 키워드를 사용해서 상속을 구현한다. 왜 이렇게 키워드를 다르게 사용하는 것일까? 차이가 분명히 존재하기 때문이다.

사용의도 차이점

  • 추상클래스는 IS - A 관계이다. "~이다"
  • 인터페이스는 HAS - A 관계이다. "~을 할 수 있는"
  • 이렇게 구분하는 이유는 다중상속의 가능 여부에 따라 용도를 정한것이다. 자바의 특성상 한개의 클래스만 상속이 가능하여 해당 클래스의 구분을 추상클래스 상속을 통해 해결하고, 할 수 있는 기능들을 인터페이스로 구현한다.

상속 : 재사용 + 확장

  • 객체 지향의 상속은 가족 관계의 상속과는 느낌이 다르다. 객체지향의 상속은 재사용과 확장으로 이해해야한다.

  • 객체 지향에서의 상속은 상위 클래스의 특성을 하위 클래스에서 상속하고 거기에 더해 필요한 특성들을 추가한다. 즉, 확장해서 쓸 수 있다. 객체지향에서는 상속이란 확장, 세분화, 슈퍼클래스-서브클래스 개념으로 이해해야한다.

  • 상위 클래스쪽으로 갈수록 추상화 되어있다고 하고, 하위 클래스쪽으로 갈수록 구체화 되어있다고 할 수 있다.

상속 관계에서 중요한 문장 : 하위클래스는 상위 클래스이다.

  • 아버지는 할아버지다.(o)

  • 손자는 아버지다.(o)

  • 포유류는 동물이다.(o)

  • 고래는 포유류이다.(o)

  • 고래는 동물이다.(o)

즉, 상속은 is kind of 관계이다.

  • 객체 지향의 상속은 상위클래스의 특성을 재사용하는 것
  • 객체 지향의 상속은 상위클래스의 특성을 확장하는 것
  • 객체 지향의 상속은 is kind of 관계를 만족해야한다.
  • 이러한 이유들로 자바에서 왜 상속 관계에서 extends를 쓰는지 알 수 있다.

즉, 추상클래스는 이렇게 위에서 말한 상속의 개념처럼 상위클래스는 하위클래스에게 특성을 상속해준다는 것을 적용하는 특징을 갖고있다.

인터페이스 : 구현 클래스 is able to 인터페이스

  • 즉, 방법론이다.
  • "무엇을 할수 있는" 이라는표현
  • 인터페이스는 클래스가 무엇을 할 수 있다라고 하는 기능을 구현하도록 강제하는 특징을 가지고있다.
  • 상위클래스는 물려줄 특성이 풍성할수록 좋고, 인터페이스는 구현을 강제할 메소드의 개수가 적을수록 좋다.

0개의 댓글