- 기존의 클래스로 새로운 클래스를 작성하는 것.(코드의 재사용)
- 두 클래스를 부모와 자식으로 관계를 맺어주는 것.
class Parent {}
class Child extends Parent {}
Child 클래스와 Parent 클래스는 상속관계다.
- 자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외)
- 자손의 멤버 개수는 조상보다 적을 수 없다.(같거나 많다.)
- 자손의 변경은 조상에 영향을 미치지 않는다.
Point3D p = new Point3D();
class Point {
int x;
int y;
}
class Point3D {
int x;
int y;
int z;
}
------------------------------
class Point3D extends Point {
int z;
}
위의 경우 Point클래스에서 x값이 바뀌어도 Point3D는 영향을 받지 않지만, 밑의 경우에는 Point클래스의 값들이 변경된 것에 영향을 받는다.
포함(composite)이란?
- 클래스의 멤버로 참조변수를 선언하는 것
- 작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만든다.
class Circle { Point c = new Point(); int r; }
Circle이 Point를 포함 관계
상속관계
- '~은 ~이다(is-a)'
포함관계- '~은 ~을 가지고 있다.(has-a)'
class Circle {
Point c = new Point();
int r;
}
원은 점을 가지고 있다.
class Circle extends Point{
int r;
}
원은 점이다.
대부분 포함을 많이 사용한다. 상속은 꼭 필요할때만 사용한다.
프로그래밍 = 설계(90%) + 코딩(10%)
Java는 단일상속만을 허용한다.(C++은 다중상속 허용)
class TvDVD extends Tv, DVD { // 에러 조상은 하나만 허용된다. //... }
다중을 쓰고싶다면, 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
class TvDVD extend TV {
DVD dvd = new DVD();
void play() {
dvd.play();
}
void stop() {
dvd.stop();
}
}
- 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
- 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
(toString(), equals(Object obj), hashCode(), ...
상속받는 조상의 메서드를 자신에 맞게 변경하는 것
class Point { int x; int y; String getLocation() { return "x :" + x + ", y :" + y; } } class Point3D extend Point { int z; String getLocation() { // 오버라이딩 return "x :" + x + ", y :" + y + ", z :" + z; } // 선언부 변경 불가. 내용만 변경가능. 구현부 {} }
- 선언부가 조상 클래스의 메서드와 일치해야 한다.
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
- 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재
- 조상의 멤버를 자신의 멤버와 구별할 때 사용
class Ex7 {
public static void main(String args[]) {
Child c = new Child();
c.method();
}
}
class Parent {int x = 10; // super.x}
class Child extends Parent {
int x = 20; // this.x
void method() {
System.out.println("x=" + x);
System.out.println("this.x=" + this.x);
System.out.println("super.x=" + super.x);
}
}
x = 20
this.x = 20
super.x = 10
class Parent2 {int x = 10; // super.x}
class Child2 extends Parent2 {
void method() {
System.out.println("x=" + x);
System.out.println("this.x=" + this.x);
System.out.println("super.x=" + super.x);
}
}
x = 10
this.x = 10
super.x = 10
- 조상의 생성자를 호출할 때 사용
- 조상의 멤버는 조상의 생성자를 호출해서 초기화
class Point {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class Point3D extends Point {
int z;
Point3D(int x, int y, int z) {
this.x = x; // 조상의 멤버를 초기화. 이렇게 하면 안된다.
this.y = y;
this.z = z;
}
}
-----------------------------------
Point3D(int x, int y, int z) {
super(x, y); // 조상클래스의 생성자 Point(int x, int y)를 호출
this.z = z; // 자신의 멤버를 초기화
}
조상님껀 조상님이 초기화하세요.
생성자의 첫줄에 반드시 생성자를 호출해야 한다.(중요)
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);
}
Point(int x, int y) {
super(); // Object();
this.x = x;
this.y = y;
}
}