middlefitting

[OOP] Java 상속에 관하여 본문

JAVA

[OOP] Java 상속에 관하여

middlefitting 2023. 2. 20. 23:17

상속이란

객체지향 프로그래밍에서 상속이란 기존의 클래스로 새로운 클래스를 작성하는 것을 말합니다.

 

즉 상속을 통해 두 클래스를 부모와 자식의 관계를 맺어줄 수 있습니다.

 

 

 

상속 규칙

상속에 있어서 다음과 같은 규칙들이 존재합니다.

 

 

1. 자손은 생성자와 초기화 블록을 제외한 조상의 모든 멤버를 상속받는다.

 

다음과 같은 코드를 통해 이해할 수 있습니다.

 

public class Parent {
    String house = "Seoul";
}

class Child extends Parent{
    int age = 20;

    void print_variable() {
        System.out.println(house);
        System.out.println(age);
    }
}

class main_logic {
    public static void main(String[] args) {
        Child child = new Child();
        // Seoul\n20
        child.print_variable();
    }
}

상속은 extends라는 명령어를 통해 진행할 수 있는데요,

 

Parent의 자식인 Child 클래스는 Parent의 멤버인 house를 상속받아 사용할 수 있는 것을 확인하실 수 있습니다

 

 

2. 자손의 멤버 개수는 조상보다 적을 수 없다.

 

위의 규칙을 이해하면 당연히 연결되는 규칙으로 볼 수 있습니다.

 

자손은 부모의 멤버를 모두 상속받고, 나아가서 추가적인 멤버를 정의할 수 있기 때문에,

 

부모보다 멤버가 많을수는 있지만 적을수는 없습니다.

 

 

3. 자손의 변경은 조상에 영향을 미치지 않는다.

 

또다른 코드의 예시를 보겠습니다.

public class Parent {
    String house = "Seoul";
}

class Child extends Parent{
    String house;

    void print_variable() {
        System.out.println(house);
    }

    void setHouse(String house) {
        this.house = house;
    }

    void print_parent() {
        System.out.println(super.house);
    }
}

class main_logic {
    public static void main(String[] args) {
        Child child = new Child();
        child.setHouse("Busan");
        // Busan
        child.print_variable();
        // Seoul
        child.print_parent();
    }
}

이처럼 자손에서 조상의 멤버를 재정의해서 값을 변경하여도 부모에는 영향을 미치지 않는 것을 확인할 수 있습니다.

 

하지만 여기서 주의할 내용이 있는데요,

 

public class Parent {
    String house = "Seoul";
}

class Child extends Parent{
//    String house;

    void print_variable() {
        System.out.println(house);
    }

    void setHouse(String house) {
        this.house = house;
    }

    void print_parent() {
        System.out.println(super.house);
    }
}

class main_logic {
    public static void main(String[] args) {
        Child child = new Child();
        child.setHouse("Busan");
        // Busan
        child.print_variable();
        // Busan
        child.print_parent();
    }
}

이렇게 자식에서 재정의하지 않은 멤버을 변경하는 것은 해당 인스턴스에 있어서는 영향을 미친다는 것입니다.

 

멤버를 조상에서 선언한 멤버 하나밖에 없으니 메모리 주소에 하나만 올라갈 것입니다.

 

그래서 해당 같은 방식으로 코드를 작성하시면 원하지 않는 결과를 얻을 수 있습니다.

 

조상에 영향을 미치지 않게 작성하여 super를 통해 조상 내용을 가져오고 싶다면 재정의하시면 되는 것입니다.

 

 

4. 부모는 하나만 가질 수 있다.

 

이것은 Java에서 해당하는 내용인데요, C++에서는 여러 부모를 가질 수 있는 것으로 알고 있습니다.

 

extends 하나만 할 수 있는 내용은 충돌 때문인데요,

 

자바에서는 여러 부모를 가지게 되면 부모에서 동일하게 선언된 멤버들이 존재할 경우

 

어떤 것을 상속받을지 정할 수 없기 때문에 그것을 금지한다 정도로 이해하시고 받아들이시면 될 것 같습니다. 

 

 

 

상속에 대해 알아보았는데요, 상속은 OOP 4대 원칙의 해당하는 내용이면서

 

다형성과 관련이 깊기 때문에 잘 알아두시면 좋을 것 같습니다.

 

 

 

참고자료

자바의 정석 - 남궁성