- 기존의 클래스로 새로운 클래스를 작성하는 것 (코드의 재사용)
- 두 클래스를 부모와 자식으로 관계를 맺어주는 것
class 자식클래스 extends 부모클래스 {
// ... 키워드
}
class Parent{}
class Child extends Parent {
// 자식 ↔상속관계↔ 부모
}
● 자손은 조상의 모든 멤버를 상속받는다.(생성자,초기화블럭 제외)=>부모의 부모 상속
● 자손의 멤버 개수는 조상보다 적을 수 없다.(같거나 많다.)
class Parent {
int age; // 멤버 1개
}
class Child extends Parent { // 멤버 1개}
// 자신의 멤버는 0개 상속받은 멤버는 1개
● 자손의 변경은 조상에 영향을 미치지않는다.
class Parent{
int age; // 멤버1개
}
class Child extends Parent {
void play() {
System.out.println("놀자~");
// 자신멤버 1개 상속받은멤버1개 => 2개의 멤버를 갖게된다.
}
}
포함(composite)이란?
- 클래스의 멤버로 참조변수를 선언하는 것
- 작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.
상속관계 ' ~은 ~이다 (is-a)'
포함관계 ' ~은 ~을 가지고 있다. (has-a)'
class Point{
int x;
int y;
}
class Circle { // 포함
Point c = new Point();
int r;
}
class Circle extends Point { // 상속
int r;
}
- 두개의 문장을 만들면 상속관계인지 포함관계인지 알 수 있다.
원(Circle)은 점(Point)이다. - Circle is a Point.
원(Circle)은 점(Point)을 가지고 있다 - Circle has a Point.
class TvDVD extends Tv, DVD { // 에러! 조상은 하나만 허용된다.
//...
}
- 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
- 모든클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
toString(), .equals(Object obj) ,hashCode(), ....
class Tv { // 부모X}
class SmartTv extends Tv { //부모O}
▼컴파일러 했을때 자동으로 추가된다.
class Tv extends Object {}
class SmartTv extends Tv {}
Object ▲ Tv ▲ SmartTv
class Point{ // 2차원 자표
int x;
int y;
String getLocation(){
return " x :" + x + ", y : "+ y;
}
}
▼ 컴파일러 했을때 결과
class Point3D extends Point {
int z;
String getLocation(){ // 조상의 getLocation을 오버라이딩 , 내용만 변경가능
return " x :" + x + ", y : "+ y, z : " +z;
}
}
- 선언부가 조상 클래스의 메서드와 일치해야 한다.
- 접근제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
오버로딩 - 기존에 없는 새로운 메서드를 정의하는것(new) ▶ 이름이 같은
오버라이딩 - 상속받은 메서드의 내용을 변경하는것 (change, modify) ▶ 이름변경
class Parent {
void parentMethod(){}
}
class Child extends Parent {
void parentMethod(){} // 오버라이딩
void parentMethod(int i){} // 오버로딩
void childMethod(){} //메서드 정의
void childMethod(int i){} // 오버로딩
void childMethod(){} // 중복정의, 에러
}
- 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재
// static메서드내에 사용불가- 조상의 멤버를 자신의 멤버와 구별할 때 사용 // 조상멤버.자신멤버구별
Point3D(int x, int y, int z) {
super(x,y); // 조상클래스의 생성자 Point(int x, int y)를 호출
this.z = z; // 자신의 멤버를 초기화
}
제일 중요한 부분! ★★★★★
추가조건 - 생성자의 첫 줄에 반드시 생성자를 호출해야한다. (this,super호출해야한다.)
그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입
class Point {
int x;
int y;
Point(){
this.(0,0);
}
Point(int x, int y){
this.x = x;
this.y = y;
}
}
▶ 컴파일을 시작하면
class Point extends Object{
int x;
int y;
Point(){
this.(0,0); // ok
}
Point(int x, int y){
super(); // Object(); , ok
this.x = x;
this.y = y;
}
}