🐾 상속
extends: 동일한 클래스(추상클래스 포함) 또는 인터페이스끼리
예> A extends B : A,B 둘다 클래스
예> C extends D : C,D 둘다 인터페이스
implements : 인터페이스를 상속받은 클래스
예> A implements B : A는 클래스이고, B는 인터페이스
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
- 클래스 형태 : 변수, 메서드 등등
공통적이면서, 세부적인 내용을 자식클래스에서 재정의 할 필요가 없는 경우- 추상클래스 형태 : 추상메서드, 더불어 변수, 메서드
공통적이면서, 세부적인 내용을 자식클래스입장에서 구현하고자 할때
공통적이면서, 세부적인 내용을 자식클래스에서 재정의 할 필요가 없는 경우- 인터페이스 형태 : 추상메서드, 상수
공통적이면서, 세부적인 내용을 자식클래스입장에서 구현하고자 할때
🍺 추상클래스?
- 미완성 설계도. 미완성 메서드를 갖고 있는 클래스
(반제품이라고 보면됨. 완성품X)abstract class Player { // 추상클래스 abstract void play(int pos); // 추상메서드(몸통 { }이 없는 미완성 메서드) abstract viod srop(); // 추상메서드 }
- 다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가
Player p = new Player(); // 에러. 추상클래스의 인스턴스 생성 불가
- 상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능
- 일반메서드가 추상메서드를 호출 가능(호출할때 선언부 필요)
class AudioPlayer extends Player { void play(int pos) {/*내용 생략*/} // 추상메서드를 구현 viod srop() {/*내용 생략*/} // 추상메서드를 구현(추상 메서드 몸통 만들기) } AudioPlayer ap = new AudioPlayer(); // OK!
🍺 추상메서드
- 미완성 메서드. 구현부(몸통, { })가 없는 메서드
abstract(제어자) 리턴타입 메서드이름();
- 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우
- 추상클래스를 상속받는 자손클래스에서 추상메서드의 구현부를 완성해야한다.
abstract class Player { // 추상클래스 abstract void play(int pos); // 추상메서드 abstract viod srop(); // 추상메서드 } class AudioPlayer extends Player { // 2개 구현. 완전 클래스 void play(int pos) {/*내용 생략*/} // 추상메서드를 구현 viod srop() {/*내용 생략*/} // 추상메서드를 구현 } abstract class AbstarctPlayer extends Player { 1개만 구현(미완성). abstract안써주면 에러. void play(int pos) {/*내용 생략*/} }
🍺추상클래스의 작성
- 여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나
기존 클래스의 공통 부분을 뽑아서 추상클래스를 만든다.- 추상화(불명확) <-> 구체화(명확)
-> 추상화된 코드는 구체화된 코드보다 유연. 변경에 유리.GregorianCalender cal = new GregorianCalender(); // 구체적 Calendar cal = Calendar.getInstance(); // 추상적
🍺 인터페이스?
- 추상 메서드의 집합
- 더 추상적
- 추상메서드와 상수만을 멤버로 가질 수 있다.
- 구현된 것이 전혀 없는 설계도. 껍데기(모든 멤버가 public)
interface 인터페이스이름 { public static final 타입 상수이름 = 값; // 상수 public abstract 메서드이름(매개변수목록); // 추상메서드 } // 예외 없으므로 public/ static/ final/ abstract 생략 가능
👉추상 클래스와 인터페이스의 차이점?
-> 인터페이스는 iv를 가질 수 없다.
🍺 인터페이스의 상속
- 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상이 아님)
- 다중 상속이 가능(추상메서드는 충돌해도 문제 없음)
ex> interface Fightable extends Movable, Attackable { }
🍺 인터페이스의 구현
- 인터페이스에 정의된 추상 메서드를 완성하는 것
(추상클래스 완성과 동일)- 'extends' 대신 'implements'를 사용
- 일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 함
class 클래스이름 implements 인터페이스이름 { // 인터페이스에 정의된 추상메서드를 모두 구현해야 함. }
🍺 인터페이스를 이용한 다형성
- 인터페이스도 구현 클래스의 부모? YES
- 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능
- 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
🍺 인터페이스의 장점
- 두 대상(객체)간의 '연결,대화,소통'을 돕는 '중간 역할'을 한다.
ex) 자판기로 예를들면, 클라이언트 -> 자판기의 겉(껍데기) -> 자판기 기계(내부)- 선언(설계)(껍데기)과 구현(알맹이)을 분리시킬 수 있게 한다.
- 개발 시간 단축
- 변경에 유리한 유연한 설계 가능
- 표준화가 가능
- 서로 관계없는 클래스들을 관계를 맺어줄 수 있다.
🍻출처
책 : 자바의 정석