Java 클래스 상속

LIM JAEHO·2022년 6월 30일
0

Java 학습

목록 보기
11/19

inheritance 상속

기존 클래스에 기능을 추가 및 재정의해 새로운 클래스를 정의하는 행위를 상속이라고 한다.
이 때 기존 클래스를 부모 클래스, 새로 정의된 클래스를 자식 클래스 라고 한다.

class 부모클래스명 {
	...
}
class 자식클래스명 extends 부모클래스명 {
	...
}

상속 규칙

  • 부모클래스의 필드와 메서드가 상속된다.
  • 생성자와 초기화 블럭은 상속되지 않는다.
  • 부모는 무조건 하나다. (하나의 자식클래스가 여러 명의 부모에게 상속받을 수 없다.)
  • 필드와 메서드의 접근제어자가 private, default 이면 자식 클래스에서 접근할 수 없다.

super 와 super()

this 와 비슷한 역할을 한다.

  • super
    부모 클래스를 가리킨다.
    보통 부모-자식 간의 멤버 이름이 같을 때 이를 구분하기 위해 사용한다.
  • super()
    부모 클래스의 생성자함수를 호출한다.

Overriding 오버라이딩

부모 클래스의 메서드를 자식 클래스에서 재정의하는 행위를 말한다.
기존에 배운 Overloading 과는 다르다.

  • 메서드의 선언부는 부모 클래스의 선언부와 동일하게 정의한다.
  • 반환 타입도 부모클래스의 반환 타입과 동일하게 정의한다.
  • 단, 반환 타입에 한해 부모 클래스의 반환 타입으로 형변환할 수 있는 타입으로는 변경 가능하다.
  • 부모 클래스의 메서드보다 접근제어자를 좁게 설정할 수 없다.
  • 부모 클래스의 메서드보다 더 큰 범위의 예외 선언이 불가능하다.

예제

package test;

class Person {
    String name;
    int age;
    public int pubInt;
    private int privInt;

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

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

/* 접근 제어자 Test */
class Student1 extends Person {
    Student1(){
        pubInt = 1;
        // privInt = 1;		// error
    }
}

/* super 와 Overriding */
class Student2 extends Person {

    String name;
    int stdId;

    Student2(String name, int age, int stdId){
        /* super */
        super(name, age);
        // super.name = name;		// 부모와 함께
        // this.age = age;			// 부모와 함께

        this.name = name;		// 자식만
        this.stdId = stdId;		// 자식만
    }

    /* Overriding */
    public void 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) {
        /* 접근제어자 출력 */
        Student1 s1 = new Student1();
        System.out.println("=====접근제어자 출력=====");
        s1.printInfo();			// =====접근제어자 출력=====
                                // name : null
                                // age : 0
                                // pubInt : 1
                                // privInt : 0        
        
        s1.name = "a";
        s1.age = 25;
        System.out.println("=====접근제어자 출력=====");
        s1.printInfo();			// =====접근제어자 출력=====
                                // name : a
                                // age : 25
                                // pubInt : 1
                                // privInt : 0

        /* super, super(), Overriding */
        System.out.println("=====super super() 출력=====");
        Student2 s2 = new Student2("b", 26, 1);
        s2.printInfo();			// =====super super() 출력=====
                                // name : b
                                // age : 26
                                // stdId : 1
    }
}

0개의 댓글