티스토리 뷰

Web/JAVA

[JAVA] 자바의 상속

Aaron 2019. 8. 8. 18:25
반응형


#. 상속(Inheritance)


> 상속

  - 기본 클래스를 확장하여 새로운 클래스를 정의 (부모 클래스의 보든 변수와 메서드를 자식 클래스가 물려받음)

  - 상속을 통해 소스코드의 재사용성이 보장되며, 가독성이 높아짐


  - 기본 클래스 (Base Class)

    ㄴ 상위 클래스 (Super Class)

    ㄴ 부모 클래스 (Parent Class)

1
2
3
4
5
6
7
8
class Employee {
        String name;
        int number;
        int age;
        String title;
        String dept;
        String grade;
}
cs


  - 상속된 클래스 = 확장된 클래스 (Extended Class)

    ㄴ 파생 클래스

    ㄴ  하위 클래스 (Sub Class)

    ㄴ 자식 클래스(Child Class)

1
2
3
4
5
class Manager extends Employee {
    String jobOfManage;
    String boss;
    String Employee[] employeeList;
}
cs


> is a ~ 관계

  - 공통된 기능을 가지고 있다고 모두 상속할 수 없음

  - 부모 클래스와 자식 클래스의 관계가 일반화와 특별화의 관계, "is a~" 관계에 있어야 함

     (논리적으로 "is a ~" 관계가 성립되어야 상속 가능)

  - 부적절한 상속은 소스코드에 대한 분석과 개발을 어렵게 만듦

     


> 예약어 extends

  - 상속 = 부모로부터 물려받은 공통적인 특징 + 자식 클래스에서만 가지는 추가적인 특징

  - 예약어 extends 사용

    ㄴ Inheritance 를 사용하지 않고 extends를 사용하는 이유, 상속은 추가적인 것들을 확장한다는 의미가 중요


> 단일 상속 (Single inheritance)

  - 개발의 편의성과 가독성을 위해 문법적으로 단일상속만을 허용

  - 단일 상속이란 하나의 클래스는 오직 하나의 부모 클래스만 상속할 수 있다는 의미

  - 다중 상속을 허용 시 중복되는 변수와 메서드가 상속되는 문제 발생 

     => 자바에서는 문법적으로 단일상속만을 허용하여 이런 문제들을 근본적으로 차단


> 상속과 생성자

  - 상속된 자식 클래스 객체가 생성될 때 부모 클래스의 생성자도 자동으로 호출되어 수행되면서 개체 초기화가 이루어짐

  - 부모 클래스에 기본 생성자가 없다면, 매개변수가 없는 기본 생성자 호출

     하지만, 부모 클래스에 매개변수가 있는 생성자를 정의했다면 기본 생성자가 자동으로 제공되지 않고, 자식 클래스 또한 부모 클래스에 기본 생성자가 없기 때문에 자동으로 부모 클래스가 자동으로 호출되지 않고 컴파일이 제대로 되지 않음


> 부모 생성자 super()

  - this() 생성자 호출

    ㄴ 클래스 안에서 Overloading 된 또 다른 생성자를 호출하기 위해 사용

  - super() 생성자 호출

    ㄴ 부모 클래스의 생성자를 명시적으로 호출할 때 사용 

    ㄴ 부모 클래스의 생성자가 Overloading 되어 여러 개 존재하는 경우 특정 생성자를 호출하기 위해 사용

    ㄴ super 생성자 호출은 반드시 첫 라인에 위치해야 함 -> 부모 클래스의 생성자가 항상 자식 클래스의 생성자보다 먼저 수행되어야 하므로

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Shape {
    int x = 0;
    int y = 0;
    
    Shape() {
        this(00);
    }
    Shape(int x, int y) {    // 매개변수가 있는 생성자
        this.x = x;
        this.y = y;
    }
}
 
class Circle extends Shape {
    int radius;
    Circle(int x, int y, int radius) {
        super(x, y);    // 부모클래스의 두 번째 생성자를 명시적으로 호출 
                        // 이 코드가 없다면 부모 클래스의 기본 생성자가 호출
        this.radius = radius;
    }
    public void draw() {
        System.out.println(x + y + radius);
    }
}
 
class Test {
    public static void main(String args[]) {
        Circle cir = new Circle(10030050);
        cir.draw();
    }
}
cs




출처 : SW Expert Academy


반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday