프로그래밍 언어/자바

자바 17. 상속, 포함관계

닉네임못짓는사람 2020. 9. 1. 11:38
반응형

이번 글에서는 클래스 간의 관계에 대해서 상속과, 포함관계를 알아보도록 하겠습니다.

상속


상속은 자바에서 제공하는 아주 특별한 기술인데, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것입니다.

이를 통해 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고, 코드를 공통적으로 관리할 수 있습니다.

이러한 특징으로 코드의 재사용성을 높이고, 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여하는 기술입니다.

 

말만으로는 잘 모를 것 같은데, 간단하게 상속을 사용하는 법을 알아보도록 합시다.

public class example{
    public static void main(String[] args){
        Parents p = new Parents();
        Child c = new Child();
    }
}
class Parents{
    Parents(){System.out.println("부모입니다.");}
}
class Child extends Parents{
    Child(){System.out.println("자식입니다.");}
}

상속을 구현하려면, 새로 작성하고자 하는 클래스, 즉 상속을 받을 클래스의 이름 뒤에

상속받고자 하는 클래스의 이름을 'extends'와 함께 써주시기만 하면 됩니다.

이렇게 하면 child클래스에는 내부적으로 parents클래스의 내용이 들어가 있는 것과 마찬가지입니다.

따라서 Parents에서 변수나, 메서드 등을 추가하면 Child에도 동일하게 추가됩니다.

주의해야 할 점은 생성자와 초기화블럭은 상속되지 않으며, 멤버만 상속된다는 점입니다.

반면 Child클래스에서 어떤 코드를 추가해도 Parents에는 일절 영향을 주지 않습니다.

 

그런데 생성자는 자손에게 상속되지 않는다고 했는데, 위의 코드를 보면 Child클래스의 인스턴스를 생성했을 때

Parents클래스의 생성자가 실행된 것을 볼 수 있습니다.

이것은 자식 클래스가 상속을 받게 되면 생성자에 자동으로 부모 클래스의 생성자를 실행하는 super()가 추가되기 때문입니다.

 

자바에서는 이 두 클래스를 서로 상속관계에 있다고 하며, 상속해주는 클래스를 '조상 클래스' 또는 '부모 클래스',

상속받는 클래스를 '자손 클래스' 또는 '자식 클래스'라고 합니다.

 

이런 상속은 1:1로만 되는 것이 아니고 하나의 조상 클래스가 여러 개의 자손 클래스에게 상속을 해줄 수도 있습니다.

예를 들어 아까 만들었던 Parents클래스를 Child1클래스와 Child2클래스에서 상속받는 예제를 작성해봅시다.

public class example{
    public static void main(String[] args){
        Parents p = new Parents();
        Child1 c1 = new Child1();
        Child2 c2 = new Child2();
    }
}
class Parents{
    Parents(){System.out.println("부모입니다.");}
}
class Child1 extends Parents{
    Child1(){
        System.out.println("자식1입니다.");
    }
}
class Child2 extends Parents{
    Child2(){
        System.out.println("자식2입니다.");
    }
}

이렇게 하나의 클래스를 여러 자식 클래스에서 상속받을 수 있습니다.

또한 자식클래스를 부모로 하여 상속받는 또 다른 클래스를 만들 수도 있습니다.

이렇게 다양한 방법으로 여러 클래스들을 상속관계로 묶어서, 편하게 관리할 수 있습니다.

포함관계


상속을 통해서 클래스 간에 관계를 맺고, 코드를 재사용하는 방법에 알아봤습니다.

상속 외에도 이렇게 클래스를 재사용하는 또 다른 방법이 있는데, 클래스 간에 '포함'관계를 맺어주는 것입니다.

이는 한 클래스의 멤버변수로 다른 클래스를 선언하는 것을 뜻합니다.

예를 들어 원을 표현하기 위한 Circle클래스를 정의해봅시다.

class Circle{
    int x; //원점의 x좌표
    int y; //원점의 y좌표
    int r; //반지름
}

이 코드를 그냥 사용해도 되겠지만, 원점의 좌표를 결정하는 클래스를 따로 지정해보도록 합시다.

class Point{
    int x;
    int y;
}

그러면 이제 두 클래스를 다음과 같이 포함 관계로 만들 수 있습니다.

class Circle{
    Point p = new Point();
    int r;
}
class Point{
    int x;
    int y;
}

위와 같이 코드를 변경해 주시면, Circle클래스 내에서 참조변수 p를 사용해 언제든지 x좌표와 y좌표를 정할 수 있습니다.

이렇게 하나의 거대한 클래스를 작성하기보다는 단위별로 여러 개의 클래스를 작성한 뒤, 이를 포함관계로 조합해서

재사용하면 보다 간결하고 손쉽게 클래스를 작성할 수 있을 것입니다.

 

이번 글은 이 정도로 마치고, 다음 글에서 이어서 알아보도록 합시다.

감사합니다.

반응형