언어(Language)/Java

[Java] 자바 상속(Inheritance)과 포함 관계(Composite) 개념 정리 및 활용

잇트루 2022. 9. 16. 00:00
반응형

상속(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;
    }
}

 

 

반응형