[Java] 추상 클래스와 인터페이스
좋은 프로그램은 "제약이 있는 프로그램" 이다
추상 클래스
동물과 같이 부모 클래스를 제공하지만 실제 생성되면 안되는 클래스를 추상 클래스라고 한다.
상속을 목적으로 사용되고 부모 클래스 역할을 담당한다.
추상 클래스는 일반 클래스랑은 같은데 new 키워드로 생성이 안된다.
추상 메서드
부모 클래스를 상속 받는 자식 클래스가 반드시 구현해야 하는 메서드를 부모 클래스에 정의
추상 메서드가 하나라도 존재하는 클래스는 추상 클래스로 선언해야한다.
추상 메서드는 기존 메서드와 완전히 같지만, 메서드 바디가 없고, 자식 클래스가 메서드를 반드시 오버라이딩 해야한다는 제약이 추가된 것이다.
정리: 추상 클래스는 인스턴스 생성 불가능. 추상 메서드는 추상 클래스 내부에 구현되어야함. 추상 클래스를 상속받은 자식 클래스는 반드시 추상 클래스 내부에 존재하는 메서드를 구현해야함. 구현 하지 않으면 자식 클래스도 마친가지로 추상 클래스로 변경되어야 함.
순수 추상 클래스 : 모든 메서드가 추상 메서드인 추상 클래스
모든 메서드가 추상인 순수 추상 클래스는 실행하는 로직을 전혀 가지고 있지 않음
다형성을 위한 껍데기 역할을 하는 것 뿐임
순수 추상 클래스를 상속 받은 자식은 모든 메서드를 오버라이딩 해야한다.
컴파일 단계에서 오류를 확인할 수 있기 때문에 좋음.
위에서 설명했듯이 좋은 프로그램은 제약이 있는 프로그램이기 때문에.
순수 추상 클래스는 인터페이스로 느껴진다. 자바는 순수 추상 클래스를 더 편리하게 사용할 수 있도록 인터페이스 라는 개념을 제공한다.
순수 추상 클래스라는 것은 결론적으로 존재하지 않는다. 자바에서는 인터페이스를 제공하기 때문.
인터페이스
인터페이스는 앞서 설명한 순수 추상 클래스와 동일하다.
인터페이스의 모든 메서드는 자동으로 앞에 public abstract가 포함된다.
인터페이스는 멤버 변수를 사용 할 수 있다. 하지만 변수는 public static final이 모두 포함 되어 있다고 간주한다.
결론적으로 인터페이스에서 변수 선언은 상수 정도 정의가 가능하고 나머지는 추천되지 않는다.
클래스 상속 관계는 uml에서 실선을 사용하지만, 인터페이스 구현은 uml에서 점선을 사용한다..
인터페이스 내부 메서드에 public abstract달면 알아서 회색으로 글자 나옴.
자동으로 붙여주고 있다는 뜻.
인터페이스를 사용해야하는 이유?
모든 메서드가 추상인 경우 순수 추상 클래스나 인터페이스나 별반 다르지 않다.
왜 굳이 인터페이스를 사용해야 할까?
제약
인터페이스는 결론적으로 제약을 걸기위해 생성 되었기 때문이다.
인터페이스를 구현하는 구현체는 반드시 내부 메서드를 구현해야하는 강제성이 생긴다.
추상 클래스에는 추상 메서드가 아닌 메서드를 끼워넣을 수 있기 때문에 안정성이 떨어진다.
추상 메서드가 아닌 메서드를 끼워 넣으면 결국 순수 추상 클래스가 아니게 됨
그냥 다형성을 위한 목적으로 추상 클래스를 만들었는데 누군가가 추상 메서드가 아닌 구현된 메서드를 추상 클래스 내부에서 구현해버리면 순수 추상 클래스의 의미가 퇴색된다.
추상 클래스 보다 더욱더 강력한 규약이다.
다중 상속
자바의 인터페이스는 추상 클래스와 다르게 다중 상속을 지원한다.
인터페이스 - 다중 구현
자바가 다중 상속을 지원하지 않는 이유
두개를 상속하게 되면 상위에서 만약 같은 메서드를 사용시 어떤 부모의 메서드를 호출할지 모르게 되는 다이아몬드 문제가 생기게 되어 자바 에서는 다중 상속을 지원하지 않음
인터페이스는 다중 구현을 했을때 서로 다른 인터페이스에 동일한 메서드가 있어도 상관없음