백엔드/JAVA_이론공부

JAVA_상속

반 불혹 2022. 9. 18. 20:58

상속

상속이란 기존의 클래스를 재활용 해서 새로운 클래스를 만드는 것이다. 

우리가 숱하게 클래스니, 생성자니 하면서 클래스를 잔뜩 만들면서 자바를 공부 했는데, 종종 "이거 다 일일히 써야되나?" 했을거다.

적어도 유사한 기능, 같은 변수 등등을 가진 클래스들은 복붙 말고 더 간편한게 있지 않을까?

그래서 상속이 나왔다.

상속은 기준이 되는 클래스(상위 클래스)의 맴버를 상속받는 클래스(하위 클래스)와 공유하는것을 의미한다.

 

클래스 상속의 예시, Person 클래스를 상속받은 하위클래스들 (출처 : 코드스테이츠)

 

 위의 그림에서 볼 수 있듯이, 밑의 하위 클래스는 상위 클래스 Person의 맴버(이름, 나이, 배움, 걷기, 먹기) 를 그대로 가져온 상태다.

여기서, 프로그래머는 회사이름, 코딩을 추가한 상태인것이고, 댄서는 그룹이름, 춤추기, 가수는 밴드이름, 노래하기가 추가된 것이다.

위에서 Person에서 담겨진 이름, 나이, 배움, 걷기, 먹기는 모두 공통적으로 들어 있는데, 이는 Person의 맴버를 상속해 왓기 때문이다.

쉽게 말해서 Person 클래스를 복붙(상속)해 와서 밀요한 변수, 매서드를 추가한 형태랑 같다.

이를 Person클래스로부터 확장되었다 라고 하며, 확장된 클래스는 하위 클래스이다.

상위 클래스를 가져와서 입맛대로 맴버를 추가한 형태이기 때문에, 하위 클래스의 맴버 수는 상위 클래스의 맴버의 갯수와 같거나 더 많다!

 

코드 예시

public class Person {
    public static void main(String[] args) {
        Person_EX p = new Person_EX();
        p.name = "kim coding";
        p.age =24;
        p.learn();
        p.eat();
        p.walk();
        System.out.println(p.name);

        Programer pg = new Programer();
        pg.name = "hacker parck";
        pg.age =26;
        pg.learn();
        pg.eat();
        pg.coding();
        System.out.println(pg.name);

    }
}
class Person_EX{
    String name;
    int age;
    void learn(){
        System.out.println("study");
    }
    void walk(){
        System.out.println("walk");
    }
    void eat(){
        System.out.println("eat");
    }

}



class Programer extends Person_EX{
    String companyName;

    void coding(){
        System.out.println("coding");
    }
}

class Dancer extends Person_EX{
    String groupName;

    void dancing(){
        System.out.println("dance");
    }
}

class Singer  extends Person_EX{
    String bandName;

    void singing(){
        System.out.println("sining");
    }
    void playGuitar(){
        System.out.println("playing");
    }
}
// 출력
study     // p의 출력, Person_EX의 맴버만 사용
eat
walk
kim coding
study     // pg의 출력, Person_EX의 출력과 Programer의 coding메서드 사용
eat
coding
hacker parck

위의 코드를 보면, Person_EX 클래스가 선언되어 있는데, 후속해서 선언된 클래스에는 extends 라는 키워드가 붙은 상태로 선언되어있는것을 알 수 있다. 

클래스를 상속 할 때는 (상속받을 클래스 명) extends 상위 클래스명(상속할 클래스 명) 으로 선언한다.

이 상속받은 클래스(하위 클래스)들은 이제 Person_EX(상위 클래스)의 맴버를 모두 가지고 있는 상태가 된다. 

여기서 companyName, GroupName, bandName 과 이런저런 메서드를 추가한 상태인 것이다.

위의 p는 Person_EX를 그대로 가져와서 해당 클래스의 맴버를 이용한 출력을 보여준다. 

아래의 pg는 Person_EX의 맴버 뿐 아니라, Programger 클래스의 coding메서드까지 출력 한다.

-> 이로써, Person_EX에 coding을 추가한 Programger 클래스를 선언하고, 출력한 것이다!

 

***부가설명

JAVA는 다중 상속을 허용하지 않는다. 위의 예시처럼, 하나의 상위 클래스만 상속 받을 수 있다.

다중상속은 하나의 하위 클래스가 복수의 상위클래스를 상속받는것을 말한다. 

 

죽음의 다이아몬드라고 불리는 다중 상속 구조 (출처 : 해시넷 위키)

 

위의 사진에서 자식클래스로 burn()이라는 메소르들 사용했을 때 위의 CDBurner, DvDBurner, DigitalRecode 이 세개의 어느 객체에 접근 할지 모르는 상황이 생기기 때문에, JAVA에서는 다중상속을 사용하지 않는다.

 

포함관계

포함은 상속처럼 클래스를 재사용 할 수 있는 방법으로 클래스의 맴버(변수, 메서드)로 다른 클래스 타입의 참조변수를 선언하는 것이다.

이게 뭔말이냐고? 코드를 보면서 이해하면 쉽다.

코드 예시 

public class Employee {
    int id;
    String name;
    Address address;

    public Employee(int id, String name, Address address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    void showInfo() {
        System.out.println(id + " " + name);
        System.out.println(address.city+ " " + address.country);
    }

    public static void main(String[] args) {
        Address address1 = new Address("서울", "한국");
        Address address2 = new Address("도쿄", "일본");

        Employee e = new Employee(1, "김코딩", address1);
        Employee e2 = new Employee(2, "박해커", address2);

        e.showInfo();
        e2.showInfo();
    }
}

class Address {
    String city, country;

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

// 출력값
1 김코딩
서울 한국
2 박해커
도쿄 일본

먼저 코드 아랫 부분의 class Address부분을 보는 것이 이해가 빠르다. 

해당 클래스는 city, country 변수를 매개변수가 있는 생성자를 통해서 입력값을 넣어주는 클래스이다. (city, country에 값을 저장 해주는 클래스)

중간쯤에 보면,  Address address1 = new Address("서울", "한국"); 코드로 서울, 한국을 입력값으로 받아서 저장한 상태이다. 

그리고 맨 위쪽 Employee 클래스를 보면, Address 클래스의 값을 마치 변수처럼 가져온 것을 볼 수 있다. 

이후, e.showInfo(); 함수로 id, 이름, 주거지가 나오는것을 알 수 있다.

여기서 주목해야 하는것은 Address 클래스의 맴버(변수, city, country) 를 참조변수 형태로 Employee 클래스로 가져온 것이다.

이렇게 되면 마치 Employee 클래스가 Address 클래스를 상속받은 것과 "비슷"한 효과를 낸다.(Address의 맴버를 그대로 가져왔으니)

이를 "Employee 클래스가 Address 클래스를 포함한다." 라고 말할 수 있다.

위의 포함의 예시는 사실 상속보다 많이 쓰인다고 한다. 아마 필요한 변수만 쏙쏙 만들어서 넣을 수있으니까 그런것 같다. 

부가적으로, 포함을 사용해서 JAVA에서는 사용하지 못하는 다중 상속의 효과도 볼 수 있다.

'백엔드 > JAVA_이론공부' 카테고리의 다른 글

JAVA_super, super()  (0) 2022.09.18
JAVA_메서드 오버라이딩  (0) 2022.09.18
JAVA_내부 클래스  (0) 2022.09.18
JAVA_this(), this  (0) 2022.09.18
JAVA_생성자  (0) 2022.09.18