Java 상속

실제 세계는 수만가지의 객체로 구성되어 있다. 그리고 객체들은 상위의 객체와 하위의 객체를 갖게 된다.

자바의 프로그램 역시 수많은 객체 들의 상호 작용으로 이루어 진다. 따라서 자바의 객체도 상위 객체와 하위 객체를 갖는다.

하위 객체는 상위 객체를 상속받는다.

  • 상속
  • 사용 예제




상속

여기서의 상속은 ‘자식이 부모의 재산은 상속받는다.’ 의 그 상속과 의미로 이해하면 된다.

좀 더 구체적으로 설명을 한다면, 자식 객체는 부모의 객체의 모든 멤버(메소드, 변수)를 자신의 것 처럼 사용할 수 있다.가 된다.

아래의 서로 다른 세가지의 객체가 있다.

세가지의 객체

  • 선생님 : 이름, 나이, 교과 과목, 키를 멤버 변수로 갖고, 공부를 하고 아이들을 가르치고 밥을 먹고 걷는 등의 동작을 하는 멤버 함수를 갖는다.
  • 학생 : 이름, 나이, 학급, 키를 멤버 변수로 갖고, 공부를 하고 학원을 가고 밥을 먹고 걷는 등의 동작을 하는 멤버 함수를 갖는다.
  • 직장인 : 이름, 나이, 해당 부서, 키를 멤버 변수로 갖고, 일을 하고 출근을 하고 밥을 먹고 걷는 등의 동작을 하는 멤버 함수를 갖는다.


세 객체는 분명히 다른 객체이다. 하지만 몇가지의 공통된 특징을 갖는다.

  • 이름
  • 나이
  • 밥을 먹는다
  • 걷는다

그렇다면, 위의 특징을 모두 갖고 있는 인간이라는 객체를 생성해보자.

상속의 개념

인간이라는 공통된 객체를 만들고 인간의 속성을 갖는 객체(선생님, 학생, 직장인 등등)가 인간 객체를 상속받은 후 세부적인 객체를 정의하면 된다. 인간의 기능을 제외한 객체의 특정 기능만을 정의하면 된다.

이때 인간 객체를 상위 객체, 선생님, 학생, 직장인을 하위 객체라고 부른다.

그리고 하위 객체 (선생님, 학생, 직장인)는 상위 객체(인간)를 _상속 받는다._라고 한다.


중간 정리

특정 객체(B)들의 공통 분모를 하나로 묶어 또 다른 객체(A)를 생성한다.

그리고 B객체들은 A객체를 상속받고, A객체에 있는 모든 멤버를 사용하면 된다.




상속의 사용

상속을 정의하는 것은 아주 간단하다. 하위 객체의 선언부 이름 옆에 extends 상위 객체 이름 만 명시해주면 된다.

상속의 사용 예제를 보면 금방 이해할 수 있다.

Human.java

public class Human {
  //인간이 갖는 특징을 객체화 한다.
  public int age;
  public double height;
  public String name;

  public void eat(){
    System.out.println("밥을 먹는다.");
  }
  public void walk(){
    System.out.println("걷는다.");
  }

}

Worker.java

public class Worker extends Human{
  //직장인은 인간이기 때문에
  //인간 객체를 상속한다.
  public String part;

  public void doWork(){
    System.out.println("일을 합니다.");
  }
  public void goWork(){
    System.out.println("출근을 합니다.");
  }
}

Teacher.java

public class Teacher extends Human{
  //선생님은 인간이기 때문에
  //인간 객체를 상속한다.
  public String gwamok;	//교과 과목

  public void doStudy(){
    System.out.println("공부를 합니다.");
  }

  public void teach(){
    System.out.println("아이들을 가르칩니다.");
  }
}

Student.java

public class Student extends Human{
  //학생은 인간이기 때문에
  //인간 객체를 상속한다.
  int ban;	//학급

  void doStudy(){
    System.out.println("공부를 시작합니다!!");
  }
  void goSchool(){
    System.out.println("학교에 가겠습니다!");
  }
}

위의 객체들을 사용하는 방법은 그냥 일반 객체를 사용하는 방법과 같다.

Main.java

public class Main {
  public static void main(String[] args) {
    //Human을 상속받는 Student 객체 생성
    Student student = new Student();

    //상속받은 상위 객체 Human의 멤버를 사용할 수 있다.
    student.name = "나학생";
    student.age = 25;
    student.height = 178.8;

    student.eat();
    student.walk();

    //자신의 객체 Student의 멤버를 사용한다.
    student.ban = 3;
    student.doStudy();
    student.goSchool();

    //-----------------------------------

    //Human을 상속받는 Worker 객체 생성
    Worker worker = new Worker();

    //상속받은 상위 객체 Human 의 멤버를 사용할 수 있다.
    worker.name = "나직장";
    worker.age = 35;
    worker.height = 172.3;
    worker.eat();
    worker.walk();

    //자신의 객체 Worker 의 멤버를 사용한다.
    worker.part = "개발부";
    worker.doWork();
    worker.goWork();

    //-----------------------------------

    //Human을 상속받는 Teacher 객체 생성
    Teacher teacher = new Teacher();

    //상속받은 상위 객체 Human의 멤버를 사용할 수 있다.
    teacher.name = "나선생";
    teacher.age = 40;
    teacher.height = 163;
    teacher.eat();
    teacher.walk();

    //자신의 객체 Teacher 멤버를 사용한다.
    teacher.gwamok = "국어";
    teacher.teach();
    teacher.doStudy();
  }
}

객체의 사용 구조

메인에서 사용된 세 객체는 각각 다음과 같은 구조로 이루어져 있다. Human 객체를 바탕으로 세부적인 객체의 멤버들이 다르게 정의되어 있다.




물론 Human 도 객체이기 때문에 독립적으로 사용이 가능하다.

public class Main {
  public static void main(String[] args) {
    //인간 객체 생성
    Human human = new Human();

    human.name = "나인간";
    human.age = 34;
    human.height = 166.3;

    human.eat();
    human.walk();
  }
}

인간도 객체이기 때문에 인간이라는 객체를 생성하는 것이 가능하다. 하지만 Human은 상위 클래스이기 때문에 하위 클래스 Student, Worker, Teacher의 멤버에는 접근할 수 없다.

인간 객체




정리

여러개의 객체들이 공통된 분모를 갖는다면 하나의 공통 객체를 정의하고 다른 객체들이 이를 상속하기만 하면 된다.

  • 장미, 들국화, 코스모스 등은 꽃이라는 공통 상위 객체를 가질 수 있다.
  • 아이폰6, 갤럭시 노트3, V30 등은 스마트폰이라는 상위 객체를 가질 수 있다.

상속을 사용하였을때 객체 코드를 간결하고 명확하게 작성할 수 있다.

Comments