본문 바로가기

Study for Backend/Programming language - Java

[Java기초] 상속

기존 클래스에 기능을 추가하고 재정의하여 새로운 클래스를 정의

다중상속은 불가능

private, default 멤버는 자식클래스에서 접근 불가

 

super

부모클래스와 자식클래스의 멤버이름이 같을 때 구분하는 키워드

 

오버라이딩

부모클래스의 메소드를 자식 클래스에서 재정의하는 것(메소드의 선언부는 부모클래스의 메소드와 동일해야 함)

 

-반환 타입에 한해, 부모클래스의 반환타입으로 변환할 수 있는 타입으로 변경가능

-부모클래스의 메소드보다 접근제어자를 더 좁은 범위로 변경불가

-부모클래스의 메소드보다 더 큰 범위의 예외 선언불가

 

// Java 프로그래밍 - 상속

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;
    }
}


// Student 클래스 - Person 상속, super 사용, 오버라이딩
class Student2 extends Person{
    String name;
    int stdId;

    Student2(String name, int stdId){
        this.name = name;
        super.name = name;
        //super(name, age); // 부모클래스의 생성자 Person 호출

        this.age = age;
        this.stdId = stdId;
    }

    public void printInfo() { //오버라이딩
        System.out.println("Student2.printInfo");
        System.out.println("name: " + name); //부모 클래스로 상속받은 생성자는 null임, 그래서 부모것이 아닌 자기쪽 먼저 참조하도록 Student2 생성자에서 this 적어둠 .
        System.out.println("age: " + age);
        System.out.println("student id: " + stdId);
    }
}


public class Main {

    public static void main(String[] args) {

//      Test code
//      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();

    }
}