[자바의정석]Java - 객체지향(2) #004

상속(Inheritance)
상속
- 기존의 클래스로 새로운 클래스를 작성하는 것(코드의 재사용)
- 두클래스를 부모와 자식으로 관계를 맺어 주는 것.
- class 자식클래스 extends 부모클래스 { //코드내용 }
상속의 특징
- 자손은 조상의 모든 멤버를 상속 받는다. (생성자,초기화블럭 제외)
- 자손의 멤버 개수는 조상보다 적을수 없다 (같거나 많다/ 자신의 멤버+조상의 멤버)
- 자손의 변경은 조상에 영향을 미치지 않는다.
포함 관계
- 클래스의 멤버로 참조변수를선언하는 것

클래스 간의 관계 결정하기
- 상속관계 : A는 B이다
- 포함관계 : A는 B를 가지고있다 // 주로 포함인 경우가 많다
단일 상속
- Java는 단일 상속만을 허용한다.(조상이 하나만 가능)
- 다중상속이면 같은이름의 변수,메소드를 고를수 없다 그래서 단일 상속만 가능하다
- 다중상속의 문제를 해결하면서 비슷한 효과를 내고싶으면 인터페이스를사용하면 된다
Object클래스
- 모든 클래스의 조상이다
- 컴파일러가 자동으로 추가를해준다
- 부모가 없는 클래스는 자동으로 Object 클래스를 상속받게 된다
- Objcet 클래스에 정의된 11개의 메서드를 상속받는다
- ex) toString(),equals(),hashCode() 등등
오버라이딩
Override 오버라이딩
- 상속받은 조상의 메서드를 자신에 맞게 변경하는것
- 선언부 변경불가 내용만 변경가능

- toString() 을 오버라이드해서 코드 간결화

오버라이딩 조건
- 선언부가 조상 클래스의 메서드와 일치해야 한다
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
오버로딩 vs 오버라이딩
- 오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것 (그냥 메소드 이름이 같을 뿐임)
- 오버라이딩 : 상속. 받은 메서드의 내용을 변경하는 것
super
**참조변수 super (this와 비슷함)
- 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재
- 조상의 멤버를 /자신의 멤버와 구별할 때 사용
- ex) 이름이 겹칠때 같은 x 면 조상이 super.x , 자신이 this.x
super() 조상의 생성자
- 생성자의 첫줄에 반드시 생성자를 호출해야 한다.
- 그렇지 않으면 자동으로 컴파일러가 생성자의 첫 줄에 super(); 를 넣어준다
- 조상의 생성자를 호출할 때 사용
- 조상의 멤버는 조상의 생성자를 호출해서 초기화
- 조상에서 생성된 멤버는 자손에서는 super()를 이용해서 초기화


패키지,클래스패스,import
패키지(package)
- 서로 관련된 클래스의 묶음
- 클래스는 클래스 파일(*.class), 패키지는 폴더. 하위 패키지는 하위 폴더
- 클래스의 실제 이름(full name)은 패키지를 포함한다(java.lang.String)
- rt.jar는 클래스들을 압축한 파일(java9에선 사라지고 module개념 으로 바뀜)
패키지의 선언
- 패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
- 같은 소스 파일의 클래스들은 모드 같은 패키지에 속한다
- 패키지 선언이 없으면 이름없는 패키지에 속한다
import문
- 클래스를 사용할 때 패키지 이름을 생략할 수 있다
- 컴파일러에게 클래스가 속한 패키지를 알려준다
- ctrl + shfit + O(영어) 단축키로 자동으로 임포트 시킬수있다
- java.lang 패키지의 클래스는 import 않고도 사용할 수 있다
String,Object,System,Thread
import문 선언
- import 패키지명.클래스명;
- 패키지문과 클래스선언 사이에 선언한다
static import문
- static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.
- ex)import static java.lang.System.out; //system.out을 out만써서 참조가 가능하다.
- 코드를 줄여주는데 도움이 된다
제어자
제어자
- 클래스와 클래스의 멤버에 부가적인 의미를 부여한다
- 접근 제어자 : public ,protected,private,(default)
- 그 외 : static,final,abstract,native,transient,syncronized,volatile,strictfp
- 하나의 대상에 여러제어자를 같이 사용가능 (접근제어자는 하나만!!)
static
- 멤버변수에 붙을때 : 모든 인스턴스가 공통적으로 사용되는 클래스 변수가 된다, 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다,
클래스가 메모리에 로드될 때 생성된다.
- 메서드에 붙을떄: 인스턴스를 생성하지 않고도 호출가능한 메소드가 된다
- static메서드 내에서는 인스턴스 변수 iv 를 사용할수없다
final 마지막의,변경될 수 없는
- 클래스에 붙을때 : 변경될 수 없는,확정될 수없는 클래스가 된다 ex)String,Math 가 final 클래스다
- 메서드에 붙을때 : 변경될 수 없는 메서드 , final 로 지정된 메서드는 오버라이딩 불가능!!
- 변수에 붙을때 : 변수 앞에 붙으면 값을 변경할 수 없는 상수가 된다
abstract 추상의,미완성의
- 미완성된 설계도
- 클래스에 붙을때 : 클래스 내에 추상 메서드가 선언되어 있음을 의미한다
- 메서드에 붙을때 : 선언부만 작성하고 구현부는 작성하지 않은 추상메서드임을 알린다
- 미완성된 메서드를 의미한다 이 메서드를 가지고있으면 그게 추상 클래스이다

접근 제어자
- public : 접근 제한이 전혀없다
- protected : 같은 패키지 내에서 그리고 다른 패키지의 자손 클래스에서 접근이 가능
- (default) : 같은 패키지에서만 접근 가능
- private : 같은 클래스에서만 접근 가능