
class 자식클래스 extends 부모클래스{
// ...
}
class Parent {
int age;
}
class child extends Parent { } // 멤버 0개로 보이지만 상속받았으므로 한 개는 무조건 있는 것
class Parent {
int age;
}
class child extends Parent {
void play() {
System.out.println("!!!!!"); // 새로운 멤버 추가시 자손 클래스는 상속받은 멤버, 추가된 자신의 멤버 총 두 개이고 부모는 여전히 한개의 멤버를 갖고 있다.
}
}
포함(Composite)이란?
- 클래스의 멤버로 참조변수를 선언하는 것
- 클래스의 관계
- 상속
- 포함
class Car {
Engine e = new Engine(); //엔진
Door[] d = new Door[4]; //문, 문의 개수를 넷으로 가정하고 배열로 처리했다.
}
// 엔진과 문의 클래스를 만들고 자동차 클래스에 포함시킨 것
상속과 포함 두 경우 모두 저장 공간 개수는 동일하고 구조만 다르다.
//1 포함
class Circle {
Point c = new Point();
int r;
}
//2 상속
class Circle extends Point {
int r;
}
1번과 2번 중 자연스러운 것은 2번! -> 이 경우는 포함 관계이다.
class TvDVD extends Tv, DVD { //에러 조상은 하나만 허용됨
// ...
}
//여러개의 상속을 받을 시 충돌 위험이 있기 때문에 Java는 다중 상속을 허용하지 않는다.
Object 클래스 - 모든 클래스의 조상
- 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
- 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
class Point {
int x;
int y;
String getLocation() {
return "x : " + x + ", y : " + y;
}
}
class Point3D extends Point {
int z;
String getLocation() { // Point의 메서드 getLocation()을 오버라이딩한 것 선언부는 변경이 불가하고 구현부만 변경 가능하다.
return "x : " + x + ", y : " + y + ", z : " + z;
}
}
오버라이딩의 조건
- 선언부가 조상 클래스의 메서드와 일치해야 한다.
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
class Parent {
void parentMethod() throws IOException, SQLException {
...
}
}
class Child extends Parent {
void parentMethod() throws IOException { // 예외를 지금처럼 더 적은 수로 선언하는 건 가능하지만 조상보다 많이 선언할 수는 없다
...
}
}
오버로딩 vs. 오버라이딩
- 오버로딩 : 기존에 없는 (이름이 같은) 새로운 메서드를 정의하는 것 (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() {} // 중복 정의(에러!!!)
}