[자바/기초] 상속(Inheritance)

정의

- 기존 클래스에 기능 추가 및 재정의하여 새로운 클래스를 정의한다.

    - 부모클래스(상위 클래스, 기초 클래스)는 상속 대상이 되는 기존 클래스를 의미.

    - 자식클래스(하위 클래스, 파생 클래스)는 기존 클래스를 상속하는 클래스를 의미.

- 특정 클래스가 가지는 속성과 기능을 다른 클래스가 사용할 수 있게 한다.

- 부모 클래스의 필드와 메소드가 상속되며, 생성자와 초기화 블록은 상속되지 않는다.

특징

[상속의 형태]
[상속의 형태]

- 단일 상속만 지원하므로, 다중 상속은 불가능하다.

- 부모 클래스의 속성과 기능을 자식 클래스에서 자유롭게 사용할 수 있다.

- 생성자와 초기화 블록의 경우 상속되지 않는다.

- 부모 클래스의 private, default 멤버는 자식 클래스에서 접근이 불가능하다.
  단, 동일한 패키지의 자식 클래스인 경우, 부모 클래스의 default 멤버에 접근이 가능하다.

- 클래스의 속성이나 기능을 다른 클래스에서 재사용할 수 있다.

- 중복 코드를 제거해서 가독성과 유지보수성이 높아지며, 개발 기간을 단축할 수 있다.

기본 사용 방법

- 두 클래스 사이의 상속관계를 "extends" 키워드를 이용하여 나타낸다.

public class 자식 클래스 extends 부모 클래스 {
    // 필드
    // 생성자
    // 메소드
}

- 클래스의 속성이나 기능을 다른 클래스에서 재사용할 수 있다.

- 중복 코드를 제거해서 가독성과 유지보수성이 높아지며, 개발 기간을 단축할 수 있다.

super 키워드와 super()

super

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

- 인스턴스의 주소가 저장되어 있으며, 숨겨진 채로 존재한다.

- static 메서드에서는 사용이 불가능하다.

super()

- 부모 클래스의 생성자를 호출할 때 사용된다.

- 생성자 첫 문장에서만 사용이 가능하다.

오버라이딩 (Overriding)

- 부모 클래스의 메소드를 자식 클래스에서 재정의하여 사용하는 것을 말한다.

- 오버로딩 조건

    - 메소드의 이름, 리턴 타입, 매개변수가 동일하여야 한다.

    - static, final, private 키워드가 지정된 메서드는 오버라이딩 할 수 없다.

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

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

예제

// Person 클래스 - 사람
class Person {
    String name;
    int age;
    
    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 클래스 - 학생
class Student extends Person {
	String name;
    int studentId;
    
    Student(String name, int age, int studentId) {
        super(name, age);    // Person 클래스의 생성자를 호출하여 Person 클래스 변수 초기화.
        
        this.name = name;    // Student 클래스의 name 변수
        super.name = name;    // Person 클래스의 name 변수
        this.age = age;    // Person 클래스의 age 변수
        this.studentId = studentId;    // Student 클래스의 studentId 변수
	}
    
    // 오버라이딩
    public void printinfo() {
        System.out.println("Student.printinfo");
        System.out.println("name : " + name);
        System.out.println("age : " + age);
        System.out.println("studentId : " + studentId);
    }
}

public class Main {
	public static void main(String[] args) {
        System.out.println("=======================");
        Student student = new Student("홍길동", 67, 1);
        student.printinfo();
    }    
}

⊙ 참고 문헌

  1. 이병승, 「초보 개발자를 위한 자바:한 권으로 배우는 자바 마스터 가이드 북」, 영진닷컴, 2024, p398 - 458
  2. 마종현, 「제로베이스 백엔드 취업 파트타임 스쿨 5기:Part 01. Java 기초-Chapter 01. Java 프로그래밍-08.상속」, 제로베이스, 2024, https://zero-base.co.kr/