[DEV] J-Jay

상속(Inheritance) 본문

Back-end/Java

상속(Inheritance)

J-Jay 2024. 5. 19. 16:38
728x90

상속(Inheritance)

자바에서 상속이란 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소이다.

상속은 상위 클래스와 하위 클래스로 나누어 상위 클래스의 멤버(필드, 메서드, 이너 클래스)를 하위 클래스와 공유하는 것

 

부모와 자식으로 생각하면, 자식은 부모의 유전자를 물려받듯, 하위 클래스는 상위 클래스의 모든 멤버를 상속받게 된다.

하지만, 모든 멤버를 상속받더라도 항상 직접적으로 접근할 수 있는 것은 아니다.

 

상위 클래스의 필드나 메서드의 접근 제한자가 private이면, 같은 패키지일 지라도 하위 클래스는 해당 필드나 메서드에 직접적으로 접근하지 못한다.

 

상위 클래스의 필드나 메서드의 접근 제한자가 default이면, 상위 클래스와 하위 클래스가 다른 패키지일 때 하위 클래스는 해당 필드나 메서드에 직접적으로 접근하지 못한다.

 

이럴 경우, getter와 setter를 이용해 간접적으로 접근해야 한다.

 

자바에서의 상속은 상위 클래스는 여러 하위 클래스를 가질 수 있지만, 하위 클래스는 여러 상위 클래스를 가질 수 없다. 즉, 단일 상속만을 허용한다.

 

상속을 받기 위해서는 extends 키워드를 사용한다.

 

상속의 종류와 사용법

1. Single : A ← B 상속

class Parents {
}

class Child extends Parents {
}

 

2. Multilevel : A ← B ← C, … 형태의 상속

class Grandparents {
}

class Parents extends Grandparents {
}

class Child extends Parents {
}

 

3. Hierarchical : A ← B, A ← C, … 형태의 상속

class Parents {
}

class Child1 extends Parents {
}

class Child2 extends Parents {
}

 

만약, Child 클래스가 Parents 클래스로부터 상속을 받았다면, Child는 다른 상위 클래스에게 중복하여 상속받을 수는 없다.

class Person {
    String name;
    int age;

    void learn() {
        System.out.println("공부하기");
    }

    void walk() {
        System.out.println("걷기");
    }

    void eat() {
        System.out.println("식사하기");
    }
}

class Programmer extends Person {
    void coding() {
    	System.out.println("코딩하기");
    }
}

먼저, Person 클래스를 생성하여 사람의 공통적으로 가질 수 있는 속성과 행위를 정의한 후,

Programmer라는 직업을 가진 사람이 Person 클래스로부터 상속받아 coding 메서드를 추가로 정의했다.

 

이를 실행하면 다음과 같이 programmer라는 객체를 Programmer 클래스에서 생성하고, Person 클래스의 속성과 행위를 실행할 수 있다.

또한, 추가적으로 작성한 coding() 메서드를 통해 Person보다 확장된 기능을 실행할 수 있다.

public class PersonEx {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "홍길동";
        p.age = 20;

        System.out.println("이름: " + p.name);
        System.out.println("나이: " + p.age);
        p.eat();
        p.learn();
        p.walk();

        Programmer programmer = new Programmer();
        programmer.name = "머스크";
        programmer.age = 25;

        System.out.println("이름: " + programmer.name);
        System.out.println("나이: " + programmer.age);
        programmer.eat();
        programmer.learn();
        programmer.walk();
        programmer.coding();
    }
}

 

포함 관계 (Composite)

자바에서 포함(Composite)은 상속과 비슷하게 클래스를 재사용할 수 있는 방법이다. 클래스의 멤버로 다른 클래스 타입의 참조 변수를 선언하는 것이다. 즉, 클래스의 속성 값에 다른 클래스를 선언하여 사용하는 것이다.

// Address 클래스를 속성으로 가지고 사용하고 있다.
public class CompositeEx {
    int number;
    Address address;

    public CompositeEx(int number, Address address){
        this.number = number;
        this.address = address;
    }

    void printInfo() {
        System.out.println(number + ": " + address.city + ", " + address.country);
    }

    public static void main(String[] args) {
        Address address1 = new Address("서울", "대한민국");
        Address address2 = new Address("부산", "대한민국");

        CompositeEx result1 = new CompositeEx(1, address1);
        CompositeEx result2 = new CompositeEx(2, address2);

        result1.printInfo();
        result2.printInfo();
    }
}

    class Address {
        String city;
        String country;

    public Address(String city, String country) {
        this.city = city;
        this.country = country;
    }
}

'Back-end > Java' 카테고리의 다른 글

내부 클래스(Inner Class)  (0) 2024.06.01
다형성(Polymorphism)  (0) 2024.05.19
Java 17 주요변화  (0) 2023.08.31
Java I/O - 2  (0) 2023.05.02
Java I/O - 1  (0) 2023.05.01