상속(Inheritance)
상속은 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것을 말한다. 두 클래스는 조상(부모), 자손(자식) 관계를 형성(계층화)한다. 이때 생성자와 private 멤버는 제외되며, 단일 상속만 가능하고, 자손의 멤버 개수는 조상보다 적을 수 없다. (같거나 많음)
따라서
모든 클래스는 Object 클래스를 상속받아서 만들어진다.
모든 클래스는 Object 클래스의 자손이므로 생략된다.
상속 문법)
상속 문법으로는 extends를 붙여 쓴다. extends는 자바 상속용 키워드이다.
- class Parent [extends Object] { } // extends Object 생략
- class Child1 extends Parent { }
- class Child2 extends Parent { }
- class GrandChild extends Child1 { }
메소드 재정의(Method Overriding)
부모 클래스의 메소드를 자식 클래스에 재정의할 수 있다. 일명 '덮어쓰기'라 할 수 있다. 그러나 여기에는 조건이 있는데, 첫 번째로 메소드의 선언부가 동일해야 하며, 두 번째로 상속받은 메소드의 내용을 새 클래스에 맞게 변경해야 한다는 것이다.
void method1() => 선언부
----------------------------------
{
... => 정의부(body, 몸통)
}
메소드 재정의 요소
1. Annotation(어노테이션)
어노테이션은 컴파일러에게 주는 명령어, 컴파일 되는 주석이다.
@Override : 이 메소드는 재정의된 메소드임을 알려주는 목적의 주석
2. toString() 메소드
Object 클래스의 메소드를 재정의할 때 인스턴스를 출력할 경우 사용한다.
=> '패키지.클래스명@16진수고유넘버' 형태로 출력
3. super
super는 부모 클래스를 지칭하는 대명사와 같은 의미를 가진다. 부모 클래스의 멤버와 자식 클래스의 멤버를 구분하거나 이름이 같은 멤버를 구분하는 데 사용한다.
=> 'super.멤버' 형태로 출력
super()는 부모 클래스의 생성자를 호출할 때 사용한다. 자식 클래스의 생성자에서만 사용 가능하며, 자식 클래스 생성자의 맨 첫 줄에 위치해야 한다.
예제)
public class PointTest {
public static void main(String[] args) {
Point p1 = new Point();
Point3d p31 = new Point3d();
p1.x = 10;
p1.y = 20;
p1.color = "red";
//p1.showPoint();
System.out.println(p1); // x: 10, y: 20
//p1.z = 44;
p31.x = 30;
p31.y = 50;
p31.z = 25;
p31.color = "blue";
// p31.showPoint();
System.out.println(p31); // x: 30, y: 50, z: 25
System.out.println(p1.pattern); // 어떤 모양
p1.pattern = "물결";
System.out.println(p1.pattern); // 물결
System.out.println(p31.pattern); // null
p31.pattern = "구름";
System.out.println(p31.pattern); // 구름
p31.showPattern(); // 부모의 pattern : 어떤 모양 /n pattern : 구름
}
}
class Point { // 2D 그래프용 점 객체
int x;
int y;
String color;
String pattern = "어떤 모양";
public Point(){}
public Point(int x, int y){
this.x = x;
this.y = y;
}
void showPoint(){
System.out.println("x : " + x + ", y : " + y
+ ", color : " + color);
}
@Override
public String toString() {
return "x: " + x + ", y: " + y;
}
}
class Point3d extends Point {
int z;
String pattern;
public Point3d(){
// super(); // 생략 가능
}
public Point3d(int x, int y, int z) {
super(x, y); // x와 y는 부모클래스에서 초기화.
this.z = z; // 부모클래스에 없는 변수만 처리.
}
@Override // Annotation(어노테이션)
void showPoint() {
System.out.println("x : " + x + ", y : " + y
+ ", z : " + z + ", color : " + color);
}
@Override
public String toString() {
return super.toString() + ", z: " + z;
}
public void showPattern(){
System.out.println("부모의 pattern : " + super.pattern);
System.out.println("pattern : " + pattern);
}
}