본문 바로가기

JAVA

Java_7강

  상속(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);
    }
}

'JAVA' 카테고리의 다른 글

Java_9강  (0) 2022.09.25
Java_8강  (0) 2022.09.23
Java_6강  (0) 2022.09.22
Java_5강(MVC 패턴 예제)  (0) 2022.09.20
Java_4강  (0) 2022.09.19