ch7-1 상속(Inheritance)
- 기존의 클래스로 새로운 클래스를 작성 하는것.(코드의 재사용)
- 두 클래스를 부모와 자식으로 관계를 맺어주는 것.
class 자식클래스 extends 부모클래스 {
//. . .
}
- 자손은 조상(부모의 부모)의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외)
- 자손의 멤버 개수는 조사보다 적을 수 없다.(같거나 많다)
- 자손의 변경은 조상에 영향을 미치지 않는다.
ch7-3 포함 관계
포함(composite)이란?
ch7-4 클래스 간의 관계 결정하기
상속관계 '~은 ~이다.(is-a)'
포함관계 '~은 ~을 가지고 있다.(has-a)'
ch7-5 단일 상속(Single Inheritance)
- Java는 단일상속만을 허용한다.(C++은 다중상속 허용)
- 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
ch7-6 Object클래스 - 모든 클래스의 조상
- 부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.
- 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
toString(), equals(Object obj), hashCode(), ...
상속계층도의 최상위
ch7-7 (메서드)오버라이딩(overriding)
- override: 덮어쓰다
- 상속받은 조상의 "메서드"를 자신에 맞게 변현하는 것
ch7-8 오버라이딩의 조건
- 선언부가 조상 클래스의 메서드와 일치해야 한다.
String getLocation() { //선언부(반환타입, 메서드이름, 매개변수 목록)
}
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
ch7-9 오버로딩 vs 오버라이딩
- 오버로딩(overloading) 기존에 없는 새로운 메서드를 정의하는 것(new)
- 오버라이딩(overriding) 상속받은 메서드의 내용을 변경하는 것(change, modify)
ch7-10 참조변수 super
- 참조변수 this(lv, iv 구별)와 비슷
- 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재
(static 메서드 내에 사용불가)
- 조상의 멤버를 자신의 멤버와 구별할 때 사용
ch7-11 super() - 조상의 생성자
- 조상의 생성자를 호출할 때 사용
- 조상의 멤버는 조상의 생성자를 호출해서 초기화
- "생성자의 첫 줄에 반드시 생성자를 호출해야 한다."
(그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입)
ch7-12 패키지(package)
- 서로 관련된 클래스의 묶음
- 클래스는 클래스 파일(*.class), 패키지는 폴더. 하위 패키지는 하위 폴더
- 클래스의 실제 이름(full name)은 패키지를 포함.(java.lang.String)
rt.jar는 클래스들을 압축한 파일(JDK설치경로\jre\lib에 위치)
ch7-13 패키지의 선언
- 패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
- 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.
- 패키지 선언이 없으면 이름없는(unnamed) 패키지에 속하게 된다.
ch7-14 클래스 패스(classpath)
- 클래스 파일(*.class)의 위치를 알려주는 경로(path)
- 환경변수 classpath로 관리하며, 경로간의 구분자는 ';'를 사용
- classpath(환경변수)에 패키지의 루트를 등록해줘야 함.
ch7-15 import문
- 클래스를 사용할 때 패키지이름을 생략할 수 있다.
- 컴파일러에게 클래스가 속한 패키지를 알려준다.
- 이클립스 단축키 ctrl+shift+o
- java.lang패키지의 클래스는 import하지 않고도 사용할 수 있다.
(String, Object, System, Thread ...)
- import문을 선언하는 방법은 다음과 같다.
import 패키지명.클래스명; //ctrl+shift+o
또는
import 패키지명.*; //모든 클래스
- import문은 패키지문과 클래스선언의 사이에 선언한다.
- import문은 컴파일 시에 처리되므로 프로그램의 성능에 영향없음.
ch7-16 static import문
- static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.
ch7-17 제어자(modifier)
- 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
접근 제어자 : public, protected, (default), private
(4개 중 1개만 붙일 수 있다.)
그 외 : static, final, abstract, ...
- 하나의 대상에 여러 제어자를 같이 사용가능(접근 제어자는 하나만!)
ch7-18 static - 클래스의, 공통적인
- 멤버변수, 메서드, 복잡초기화에 붙일 수 있음.
ch7-19 final - 마지막의, 변경될 수 없는
- 클래스, 메서드, 멤버변수, 지역변수에 붙일 수 있음.
클래스: 변경될 수 없는 클래스. 확장될 수 없는 클래스가 됨.
--> 다른 클래스의 조상이 될 수 없다.(상속계층도의 최하위(String, Math))
메서드: 변경될 수 없는 메서드.
final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
멤버변수,지역변수: 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 됨.
ch7-20 abstract - 추상의, 미완성의
- 클래스, 메서드에 붙일 수 있다.
클래스: 클래스 내에 추상 메서드가 선언되어 있음을 의미.
메서드: 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알림
(미완성 클래스 -> 미완성 설계도 -> 제품 생성 불가)
(추상 클래스는 인스턴스 생성 불가)
==> 상속을 통해 메서드를 완성 시켜야 함.
==> 추상클래스를 상속받아서 완전한클래스(구상클래스)를 만든 후에 객체 생성 가능.
ch 7-21 접근제어자(access modifier)
private : 같은 클래스 내에서만 접근 가능
(default) : 같은 패키지 내에서만 접근이 가능
protected : 같은 패키지, 다른 패키지의 자손클래스에서 접근 가능
public : 접근 제한이 전혀 없다
(public > protected > (default) > private)
ch7-22 캡슐화와 접근 제어자
접근 제어자를 사용하는 이유
-> 외부로부터 데이터를 보호하기 위해서
-> 직접접은은 막고, 메스드를 통한 간적접근 허용(getter/setter)
->외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서
ch7-23 다형성(polymorphism)
- 여러 가지 형태를 가질 수 있는 능력
- 조상 타입 참조 변수로 자손 타입 객체를 다루는 것
- 장점 2가지가 있음
SmartTv s = new SmartTv(); //참조변수와 인스턴스의 타입이 일치
Tv t = new SmartTv(); //조상타입 참조변수로 자손타입 인스턴스 참조
- 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없다.
Tv t = new SmartTv(); //OK. 허용
SmartTv s = new Tv(); //에러. 허용안됨.
--> 실제 사용 할 수 있는 기능보다 리모컨 버튼 개수가 더 많으면 안된다.
Q. 참조변수의 타입은 인스턴스의 타입과 반드시 일치해야 하나요?
A. 아니오. 보통 일치하지만, 아닐 수도 있다.--> 다형성
Q. 참조변수가 조상타입일 때와 자손타입일 때의 차이?
A. 사용할 수 있는 멤버의 개수가 달라짐.
Q. 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 있나요?
A. 아니오. 허용되지 않는다.
ch7-24 참조변수의 형변환
- Only 사용할 수 있는 멤버의 개수를 조절하는 것
(주소값, 객체 등은 변하지 않음)
- 조상 자손 관계의 참조변수는 서로 형변환 가능
(형제관계는 형변환 불가)
FireEngine f = new FireEngine();
Car c = (Car)f; //OK. 조상인 Car타입으로 형변환(생략가능)
FireEngine f2 = (FireEngine)c; //OK. 자손인 FireEngine타입으로 형변환
f2.water()
//[아래 주석 확인 필요]
//컴파일은OK. But 형변환 실행 에러!!
//실제로 가리키는 객체Car()에 water()가 없음!!
Ambulance a = (Ambulance)f; //에러. 형제간 형변환 불가
- 리모콘을 변경함으로써 사용 할 수 있는 멤버의 개수를 늘였다 줄였다 할 수 있다.
==>f(5개) -> c(4개) -> f2(5개)
==>참조변수간의 형변환
ch7-26 instanceof 연산자
- 참조변수의 형변환 가능여부 확인에 사용. 가능하면 true 반환.
- 확인
(형번환 해도 되는지, instanceof 사용)
- 형변환
(instanceof에서 자기자신과 조상은 전부 true가 나오지만
실제 가리키는 객체가 맞는지 확인해야함!)
Q. 참조변수의 형변환은 왜 하나요?
A. 참조변수(리모콘)을 변경함으로써 사용할 수 있는 멤버의 갯수를 조절하기 위해서
Q. instanceof연산자는 언제 사용하나요?
A. 참조변수를 형변환하기 전에 형변환 가능여부를 확인할 때
다형성의 장점
- 다형적 매개변수
- 하나의 배열로 여러종류 객체 다루기
다형성
- Tv t = new SmartTv(); // 조상 참조변수로 자손 객체 다루기
- 참조변수의 형변환 -> 리모콘 바꾸기(사용가능한 멤버개수 조절)
- instanceof연산자 -> 형변환 가능여부 확인
ch7-27 매개변수의 다형성
- 참조형 매개변수는 메서드 호출시,
자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
ch7-29 여러 종류의 객체를 배열로 다루기
- 조상 타입의 배열에 자손들의 객체를 담을 수 있다.
ch7-31 추상 클래스(abstract class)
- 미완성 설계도. 미완성 메서드를 갖고 있는 클래스
(추상 메서드 : 몸통{}이 없는 미완성 메서드)
==> 추상 메서드가 있으면 추상 클래스.
- 다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가.
- 상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능
(추상메서드 몸통{} 만들기 --> 구현)
ch7-32 추상 메서드(abstract method)
-
미완성 메서드. 구현부(몸통{})가 없는 메서드
//주석을 통해 어떤 기능을 구행할 목적으로 작성했는지 설명
abstract 리턴타입 메서드이름();
-
꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우
-
추상메서드 호출 가능(호출할 때는 선언부만 필요)
ch7-34 추상클래스의 작성
- 여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나
기존 클래스의 공통 부분을 뽑아서 추상클래스를 만든다.
- 추상화 <--> 구체화
- 추상화된 코드는 구체화된 코드보다 유연하다. 변경에 유리
ch7-35 인터페이스(interface)
- 결론: 추상 메서드의 집합
(프로그래밍 관점)
- 구현된 것이 전혀 없는 설계도. 껍데기(모든 멤버가 public)
interface 인터페이스이름 {
public static final 타입 상수이름 = 값; //상수
public abstract 메서드이름(매개변수목록); //추상메서드
} //모든 인터페이스 멤버는 public, 모든 메서드는 추상메서드
//메서드: public, abstract 생략 가능!!
//상수: public, static, final 생략 가능!!
ch7-36 인터페이스의 상속
- 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상 아님)
- 다중 상속이 가능(추상메서드는 충돌해도 문제 없음)
ch7-37 인터페이스의 구현
- 인터페이스에 정의된 추상 메서드를 완성하는 것
(인터페이스: 미완성 설계도 --> 구현)
class 클래스이름 implements 인터페이스이름 {
//인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
}
(implement뜻: 구현)
- 일부만 구현하는 경우, 클래스 앞에 abstract를 붙어야 함.
Q. 인터페이스란?
A. 추상메서드의 집합
Q. 인터페이스의 구현이란?
A. 인터페이스의 추상메서드 몸통{}만들기(미완성 설계도 완성하기)
Q. 추상 클래스와 인터페이스의 공통점은?
A. 추상 메서드를 가지고 있다.(미완성 설계도)
Q. 추상 클래스와 인터페이스의 차이점은?
A. 인터페이스는 iv를 가질 수 없다.
ch7-38 인터페이스를 이용한 다형성
- 인터페이스도 구현 클래스의 부모? --> Yes
- 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능
- 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
ch7-39 인터페이스의 장점
- 두 대상(객체)간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다.
- 선언(설계)와 구현을 분리시킬 수 있게 한다.
(선언-껍데기, 구현-알맹이)
- 변경에 유리, 유연한 코드
- 개발 시간을 단축할 수 있다.
- 변경에 유리한 유연한 설계가 가능하다.
- 표준화가 가능하다.
- 서로 관계없는 클래스들을 관계를 맺어줄 수 있다.
ch7-40 디폴트 메서드와 static 메서드
- 인터페이스에 디폴트 메서드, static메서드 추가 가능.(JDK1.8부터)
- 인터페이스에 새로운 메서드(추상 메서드)를 추가하기 어려움.
해결책--> 디폴트 메서드(default method)
- 디폴트 메서드는 인스턴스 메서드(인터페이스 원칙 위반)
- 디폴트 메서드가 기존의 메서드와 충돌할 때의 해결책
- 여러 인터페이스의 디폴트 메서드 간의 충돌
- 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야 한다.
- 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
- 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
--> 그냥 직접 오버라이딩 하면 해결
하루 30분씩 6, 7장 번갈아서 요약한 것을 봐라!!