1. 상속을 사용하는 방법 




2. 상속은 언제, 왜 사용할까?


1) 객체 지향 프로그래밍에서 상속 기법을 사용하는 이유: 소스의 재활용

* 재활용되는 소스가 많아진다면 그만큼 개발자의 편의성과 생산성은 증가 


2) 순서 



3) 예시 

* '종합병원 업무 전산화' 프로그램을 만든다고 가정하자.


(1) 객체의 추상화

- 사용자에 따른 직업을 표현하기 위한 객체가 필요하다. 

- 그 결과 '의사' 객체, '간호사' 객체, '환자' 객체로 정리 




(2) 공통점 추출




(3) 공통 객체 생성

- 3개의 객체로부터 뽑은 공통 객체



(4) is-a, has-a 법칙 검증




(5) 상속 적용



3. 상속의 장점 


1) 코드를 재활용함으로써 간소화된 클래스 구조 

2) 클래스의 기능 테스트에 대한 생산성 및 정확성 증가

- 상속하지 않았다면 3개의 객체를 확인하기 위해서는 3번의 테스트가 필요하다. 


3) 클래스의 수정추가에 대한 유연성 및 확장성 증가 

- 부모 클래스의 메소드만 수정하면 자식 클래스의 메소드들은 자동 수정이 된다. 

- 또한 상속받을 수 있는 새로운 클래스를 쉽게 추가할 수 있다. 



4. 상속에서 지켜야 하는 규칙


1) 자식 클래스는 단 하나의 부모 클래스로부터 상속받을 수 있다. (다중 상속 금지)

2) 상속받는 자식 클래스는 다른 클래스의 부모가 될 수 있다.

3) 부모 클래스에 자식 클래스와 동일한 이름의 변수나 메소드가 있다면 자식 클래스의 것이 우선이다. 

4) 부모 클래스 속성과 메소드 중에서도 접근 제어자에 의해서 상속의 범위가 달라진다. 

5) 제어자 중에서 static 메소드나 속성도 상속 가능하다. 



5. 다중 상속 vs 단일 상속


1) 다중 상속: 자식 클래스가 여러 개의 부모 클래스로부터 상속을 받는 것을 의미 


2) 자바에서는 다중 상속을 제공하지 않음

- 자바에서 자식 클래스는 무조건 하나의 부모 클래스에서만 상속 받을 수 있다. 


3) 일대 다(多)의 관계 또는 1:n의 관계

- 부모 클래스는 여러 개의 자식 클래스에게 상속해줄 수 있다. 

- 자식 클래스는 또 다른 클래스의 부모 클래스가 될 수 있다. 




6. 클래스의 조상, Object 클래스


1) 자바의 최상위 클래스는 Object이며 모든 클래스들은 Object 클래스를 상속받음

2) extends 키워드를 선언하지 않아도 자바로 개발된 모든 클래스들은 최상위 클래스인 Object를 기본적으로 상속


3) 트리(Tree) 구조, 계층 구조(Hierarchy structure)

- 하나의 뿌리에서 여러 개의 가지 (branch)를 치는 형상 


4) Object 클래스에 선언된 메소드와 설명








7. 상속 예제 


# class PersonValue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package hospital;
 
import java.util.Scanner;
 
public class PersonValue {
    private int age;
    private String name;
    Scanner sc;
    
    public PersonValue() {
        sc = new Scanner(System.in);
    }
    
    public void setInfo() {
        System.out.print("이름: ");
        name = sc.nextLine();
        System.out.print("나이: ");
        age = sc.nextInt();
    }
}
cs



# class DoctorValue, NurseValue, PatientValue

1
2
3
4
5
6
7
8
9
10
11
12
package hospital;
 
public class DoctorValue extends PersonValue {
    public DoctorValue() {
        System.out.println(">>Doctor");
        this.setInfo();
    }
    
    public void treat() {
        System.out.println("treat");
    }
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
package hospital;
 
public class NurseValue extends PersonValue {
    public NurseValue() {
        System.out.println(">>Nurse");
        this.setInfo();
    }
    
    public void care() {
        System.out.println("care");
    }
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
package hospital;
 
public class PatientValue extends PersonValue{
    public PatientValue() {
        System.out.println(">>Patient");
        this.setInfo();
    }
    
    public void getTreat() {
        System.out.println("getTreat");
    }
}
cs



# class HospitalExample / main()

1
2
3
4
5
6
7
8
9
10
11
package hospital;
 
public class HospitalExmaple {
    public static void main(String[] args) {
 
        DoctorValue doctor = new DoctorValue();
        NurseValue nurse = new NurseValue();
        PatientValue patient = new PatientValue();
        
    }
}
cs