Everyday Growing Engineer 2022. 8. 4. 13:00

추상클래스

클래스 내 추상 메소드가 하나 이상 포함되 있으면 추상클래스이다.  추상 클래스는 미완성 설계도에 비유할 수 있습니다.

이러한 추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해줍니다.

public abstract class A {}
  • 추상 클래스는 인스턴스, 즉 객체를 만들 수 없는 클래스 입니다.
  • 추상 메소드는 하위 클래스에서 메소드의 구현을 강제해야 합니다.
  • 추상 메소드를 포함하는 클래스는 반드시 추상 클래스여야 합니다.
  • 상속하는 집합간에는 연간관계가 있습니다.
  • 다중 상속이 불가능합니다.

인터페이스

인터페이스는 모든 메소드가 추상 메소드이다.

  • 모든 멤버 변수는 public static final 이어야 하며, 이를 생략할 수 있습니다.
  • 모든 메소드는 public abstract 이어야 하며, 이를 생략할 수 있습니다.
  • Java 8 부터는 static, default method를 사용할 수 있습니다.
  • 다중상속이 가능합니다.

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

  • 추상 클래스는 추상 클래스를 상속 받아서 기능을 이용하고, 확장시키는데 이용된다. 인터페이스는  함수의 껍데기만 있고, 그 함수의 구현을 강제한다.
  • 추상클래스는 다중상속 불가능. 인터페이스는 다중상속 가능.

자바에서 다중상속을 막은 이유 

더보기

다이아몬드 문제

다중 상속을 지원하게 되면 하나의 클래스가 여러 상위 클래스를 상속 받을 수 있습니다. 이런 특징 때문에 발생하게 되는 문제가 있는데, 바로 '다이아몬드 문제' 입니다.

 

위의 클래스 다이어그램과 같은 상속 구조에서 발생되는 문제가 다이아몬드 문제입니다. 마치 모양이 다이아몬드 모양이라서 붙여진 이름 같습니다. 예를들어 GrandFather이라는 클래스가 myMethod() 라는 이름의 메소드를 가지고 있다고 가정해봅시다. 그리고 FatherA와 FatherB가 각각 오버라이딩하여 구현하였다면, FatherA와 FatherB를 모두 상속받은 Son 클래스 입장에서는 어떤 부모의 myMethod()를 사용해야 할까요? 이로 인하여 충돌이 생기게 됩니다.

 

Son클래스 입장에서는 같은 이름의 myMethod가 두개의 상위 클래스에 모두 정의되어 있기 때문에, 어떤 메소드를 실행해야 될지 알 수가 없습니다. (그리고 위의 코드는 당연히 컴파일 되지 않습니다.)