Post

상속 (Inheritance)

1. 상속 (Inheritance)

  • 기존 클래스에 기능 추가 및 재정의 하여 새로운 클래스를 정의
    • 부모 클래스 : 상속 대상이 되는 기존 클래스 (상위 클래스, 기초 클래스)
    • 자식 클래스 : 기존 클래스를 상속하는 클래스 (하위 클래스, 파생 클래스)
  • 부모 클래스의 필드와 메소드가 상속됨 (Generator, 초기화 블록은 상속이 안됨)

Untitled

  • 다중 상속은 불가능
  • private, default 멤버는 자식 클래스에서 접근 불가

    ⇒ default의 경우, 내부 패키지의 자식 클래스는 가능

Untitled 1

2. super, super()

  • super
    • 부모 클래스와 자식 클래스의 멤버 이름이 같을 때 구분하는 키워드
  • super()
    • 부모 클래스의 생성자 호출

3. 오버라이딩 (Overriding)

  • 부모 클래스의 메소드를 자식 클래스에서 재정의
  • 오버라이딩 조건
    • 메소드의 선언부는 부모 클래스의 메소드와 동일
    • 반환 타입에 한해, 부모 클래스의 반환 타입으로 변환할 수 있는 타입으로 변경 가능
    • 부모 클래스의 메소드보다 접근제어자를 더 좁은 범위로 변경 불가
    • 부모 클래스의 메소드보다 더 큰 범위의 예외 선언 불가

(실습 : 상속 및 오버라이딩)

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Java 프로그래밍 - 클래스와 객체_1

class Person {
    String name;
    int age;
    public int a1;
    private int a2;

    Person() {}
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void printInfo() {
        System.out.println("Person.printInfo");
        System.out.println("name : " + name);
        System.out.println("age: " + age);
    }
}

// Student 클래스 - Person 상속, 접근제어자 확인
class Student extends Person {
    Student() {
        a1 = 1;
//        a2 = 1; // Person의 a2가 private 이므로 Person 클래스 내에서만 접근 가능
    }
}

// Student2 클래스 - Person 상속, super 사용, 접근제어자 확인
class Student2 extends Person {
    String name;
    int stdId;
    Student2(String name, int age, int stdId) {
        this.name = name;
//        super.name = name;
//        super(name, age);
        this.age = age;
        this.stdId = stdId;
    }

    public void printInfo() {
        System.out.println("Student2.printInfo");
        System.out.println("name : " + name);
        System.out.println("age: " + age);
        System.out.println("stdId : " + stdId);

    }
}
public class Main {
    public static void main(String[] args) {
//        1. 상속
        System.out.println("=========");
        Student s1 = new Student();
        s1.name = "a";
        s1.age = 25;
        s1.printInfo();

//        2. super, super(), 오버라이딩
        System.out.println("==========");
        Student2 s2 = new Student2("b",32,1);
        s2.printInfo();
    }
}

Untitled 2

(실습 2 : Student2의 name이 null이 나오는 이유)

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class Person {
    String name;
    int age;
    public int a1;
    private int a2;

    Person() {}
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void printInfo() {
        System.out.println("Person.printInfo");
        System.out.println("name : " + name);
        System.out.println("age: " + age);
    }
}

// Student2 클래스 - Person 상속, super 사용, 접근제어자 확인
class Student2 extends Person {
    String name;
    int stdId;
    Student2(String name, int age, int stdId) {
//       this.name = name;
//        super.name = name;
        super(name, age);
        this.age = age;
        this.stdId = stdId;
    }

    public void printInfo() {
        System.out.println("Student2.printInfo");
        System.out.println("name : " + name);
        System.out.println("age: " + age);
        System.out.println("stdId : " + stdId);
    }
}

public class Main {
    public static void main(String[] args) {

//        2. super, super(), 오버라이딩
        System.out.println("==========");
        Student2 s2 = new Student2("b",32,1);
        s2.printInfo();
    }
}

Untitled 3

  • Student2의 super(name, age)에 의해 Person(부모 클래스)의 name에 값이 들어간다
  • 이로 인해 Student2의 name은 따로 값이 들어가지 않았기에 null값이 나온다
This post is licensed under CC BY 4.0 by the author.