21.01.06-31일차

되자개발자·2021년 3월 10일
0

기록하기

목록 보기
31/46
post-thumbnail

🐾 상속
extends: 동일한 클래스(추상클래스 포함) 또는 인터페이스끼리
예> A extends B : A,B 둘다 클래스
예> C extends D : C,D 둘다 인터페이스
implements : 인터페이스를 상속받은 클래스
예> A implements B : A는 클래스이고, B는 인터페이스
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

  • 클래스 형태 : 변수, 메서드 등등
    공통적이면서, 세부적인 내용을 자식클래스에서 재정의 할 필요가 없는 경우
  • 추상클래스 형태 : 추상메서드, 더불어 변수, 메서드
    공통적이면서, 세부적인 내용을 자식클래스입장에서 구현하고자 할때
    공통적이면서, 세부적인 내용을 자식클래스에서 재정의 할 필요가 없는 경우
  • 인터페이스 형태 : 추상메서드, 상수
    공통적이면서, 세부적인 내용을 자식클래스입장에서 구현하고자 할때

🍕 추상클래스(abstract class)

🍺 추상클래스?

  • 미완성 설계도. 미완성 메서드를 갖고 있는 클래스
    (반제품이라고 보면됨. 완성품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(); // 추상적

🍕 인터페이스(interface)

🍺 인터페이스?

  • 추상 메서드의 집합
  • 더 추상적
  • 추상메서드와 상수만을 멤버로 가질 수 있다.
  • 구현된 것이 전혀 없는 설계도. 껍데기(모든 멤버가 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) 자판기로 예를들면, 클라이언트 -> 자판기의 겉(껍데기) -> 자판기 기계(내부)
  • 선언(설계)(껍데기)과 구현(알맹이)을 분리시킬 수 있게 한다.
  • 개발 시간 단축
  • 변경에 유리한 유연한 설계 가능
  • 표준화가 가능
  • 서로 관계없는 클래스들을 관계를 맺어줄 수 있다.

🍻출처

책 : 자바의 정석

profile
열심히가 되는 길♨_♨

0개의 댓글