• 검색 결과가 없습니다.

10장 상속

N/A
N/A
Protected

Academic year: 2022

Share "10장 상속"

Copied!
36
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

10장 상속

이충기

명지대학교

(2)

들어가며

Q: 건설회사는 기존 아파트와 조금 다르거나 추가적인 특징들 을 가진 새 아파트를 지을 때 어떻게 하는가?

A:

(3)

상속

 상속은 새 클래스를 기존 클래스를 확장하여 만드는 것이다.

 새 클래스는 상속을 통하여 기존 클래스에 있는 변수들과 메소드들을 자동적으로 상속받아 이용한다.

 새 클래스는 필요에 따라 새로운 변수들과 메소드들을 추가 한다.

(4)

상속의 목적

 한 클래스를 처음부터 새로 만들려고 하면 필요한 변수 들과 메소드들을 전부 다 새로 만들어야 한다.

 상속을 이용하여 기존 클래스로부터 새 클래스를 만들면 일이 훨씬 수월해 진다. 왜냐하면 기존 클래스의 변수들과 메소드들 중 수정할 필요가 있는 것만 재정의하고 새로 필 요한 변수들과 메소드들만 정의하면 되기 때문이다.

 상속의 주목적은 기존의 소프트웨어를 재사용함으로써 기존 소프트웨어의 설계, 구현 및 시험에 투입된 모든 시간과 노 력을 재활용하는 것이다.

(5)

상속

 상속은 기존 클래스를 확장하여 새로운 클래스를 만드는 것이다.

 기존 클래스는 부모 클래스 혹은 상위클래스(superclass) 라고 부른다.

 새로 만들어진 클래스는 자식 클래스 혹은 하위클래스 (subclass)라고 부른다.

 자식 클래스는 부모 클래스에 정의된 변수들과 메소드들

(6)

상속

 상위 클래스(A)와 하위 클래스(B) 사이에는 “B는 A이다”

라는 IS-A 관계가 성립된다.

 IS-A 관계를 적용하여 클래스들을 상하 관계(혹은 부모/

자식 관계)로 연결하는 것이 상속이다.

(7)

클래스 그림

 상속 관계는 자주 클래스 그림(class diagram)으로 보여 진다. 화살표가 상위 클래스를 가리킨다.

 위에서 “학부생은 학생이다”라는 IS-A 관계가 성립한다.

학생

학부생

(8)

하위 클래스 만들기

public class <하위클래스 이름> extends <상위클래스 이름>

{

새 변수 선언문들

새로 필요하거나 재정의된 메소드들 }

(9)

하위 클래스 만들기

 하위 클래스는 상위클래스로부터 변수들과 메소드들을 자동적으로 상속받는다.

 상속 받은 변수들과 메소드들 중 수정할 필요가 있다면 재정의하여 사용한다.

 새로 필요한 변수들과 메소드들이 있다면 새로 정의하 여 사용한다.

(10)

예: 하위 클래스 만들기

// 학생을 모델한다 public class Student {

protected String name; // 이름 protected int number; // 학번

public Student(String Name, int Number){

setName(Name);

setNumber(Number;) }

public String getName( ) { return name; } public int getNumber( ) { return number; }

public void setName(String Name) { name = Name; }

public void setNumber(int Number) { number = Number; } public String toString( ) {

return ("이름: " + name + ", " + "학번: " + number);

} }

(11)

예: 하위 클래스 만들기

// 학부생을 모델한다

public class Undergraduate extends Student { private String clubName;

public Undergraduate( ) {

super( ); // 부모클래스의 생성자 메소드를 호출한다 clubName = "";

}

public String getClubName( ) { return clubName; }

public void setClubName(String ClubName) { clubName = ClubName; }

public String toString( ) {

return super.toString( ) + ", 동아리 이름: " + getClubName( );

(12)

예: 하위 클래스 만들기

// Driver.java: Undergraduate 객체들을 만들어 시험한다 public class Driver {

public static void main(String[] args) {

Undergraduate student1 = new Undergraduate( );

student1.setName(“선남”);

student1.setNumber(1601);

student1.setClubName(“로봇”);

System.out.println(student1.toString());

} }

Q: 위 프로그램의 출력 결과는?

(13)

메소드 재정의

 하위 클래스는 필요하다면 상속받은 메소드의 정의를 바꿀 수 있다.

 새 메소드는 상위클래스의 메소드와 같은 머리부를 가져야 하나 메소드 몸체는 달라야 한다.

 메소드를 호출하는 객체의 유형이 어느 메소드가 호출되었는지를 결정한다.

(14)

메소드 재정의

 부모 메소드는 super 참조를 사용하여 명확하게 호출할 수 있다.

 한 메소드가 final 메소드로 선언된다면 재정의할 수 없다.

 재정의의 개념은 변수들에도 적용될 수 있다. 그러나 일반적으로 권장되지 않는다.

(15)

메소드 다중 정의 vs 재정의

 메소드 다중 정의는 같은 클래스 안에 같은 이름을 가지나 다른 머리부를 갖는 여러 메소드들이 있다는 것을 의미한다.

 메소드 재정의는 같은 머리부를 갖는 두 메소드를 다룬다.

한 메소드는 부모 클래스에 있고 다른 메소드는 자식 클래스에 있다.

 메소드 다중 정의는 우리가 비슷한 연산을 다른 데이터에 대해 다르게 정의하게 한다.

 메소드 재정의는 우리가 비슷한 연산을 다른 객체 유형에 대해 다르게 정의하게 한다.

(16)

클래스 계층

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

 부모 자식 관계를 확장시켜 계층 구조로 만든 것이 클래스 계층이다.

 같은 부모 클래스의 두 자식 클래스들은 형제들(자매들)이라고 부른다.

 클래스들의 공통적인 특징들은 클래스 계층의 가능한 위에 놓여져야 한다.

(17)

예: 클래스 계층도

교직원

교원 직원

전임 교원 시간 강사 계약 직원

(18)

Object 클래스

 Object 클래스는 모든 클래스의 최상위 클래스이다.

 이 클래스는 java.lang 패키지에 정의되어 있다.

 모든 클래스는 Object 클래스로부터 상속 받는다.

 Object 클래스는 몇 개의 유용한 메소드들을 가지고 있다.

예: public boolean equals(Object o) public String toString()

 한 클래스 내에 toString( ) 메소드를 정의하면 Object 클래스가 제공하는 toString( ) 메소드를 재정의하는 것이다.

 위의 메소드들이 어떤 객체에서도 호출되도록 한다.

(19)

생성자 메소드와 상속

 하위 클래스는 자신만의 생성자 메소드를 가진다.

 하위 클래스의 생성자 메소드 내에서 첫 번째 문이 상위 클래스의 생성자 메소드를 호출한다. 그렇지 않다면, 자바는 super( )를 첫 번째 문으로 넣는다.

따라서 상위 클래스의 기본 생성자 메소드가 처음에 호출된다.

 이 규칙의 예외: this( . . . )를 통해 다른 생성자 메소드를 호출한다면super( )에 대한 호출을 연기한다.

 상위 클래스의 다른 생성자 메소드를 호출하기 위해서 그 메소드를 직접 호출한다.

예: super(Name)

(20)

상속과 범위

 변수나 메소드의 범위는 변수나 메소드가 의미를 가지는 코드의 블록이다.

 상속으로 말미암아 이 범위가 상위 클래스 혹은 그 이상으로 확장될 수 있다.

(21)

상속과 범위

 변수

- 자바는 먼저 변수가 나온 메소드를 조사한다. 지역 변수 혹은 매개 변수인지를 확인한다.

- 다음으로 현 클래스의 변수인지를 확인한다.

- 다음으로 상위클래스의 변수인지를 확인한다.

- 자바는 더 이상 확인할 상위 클래스가 없을 때까지 상속 계층 구조를 올라가면서 확인한다.

 메소드

- 메소드가 클래스 내에 정의된 메소드인지를 확인한다.

- 다음으로 상위 클래스에서 정의된 메소드인지를 확인한다.

(22)

범위 명시

 변수나 메소드가 두 가지의 범위 규칙 중 하나를 따르라고 명시할 수 있다.

- super 예약어

상위 클래스의 변수나 메소드를 나타내는 예약어 예: super.setName( )

- this 예약어

현 객체의 메소드나 변수를 나타내는 예약어 예: this.setName( )

(23)

예: 상속과 범위

super(xxx) // 상위 클래스의 생성자 메소드를 호출한다 super.xxx // 상위 클래스의 변수 xxx 를 나타낸다

super.xxx( ) // 상위 클래스의 메소드 xxx 를 호출한다

this(xxx) // 현 클래스의 생성자 메소드를 호출한다 this.xxx // 현 클래스의 변수 xxx 를 나타낸다

this.xxx( ) // 현 클래스의 메소드 xxx 를 호출한다

주: 다음과 같이 할 수 없다

(24)

접근 수정자

 접근 수정자는 클래스, 변수, 메소드 앞에 위치하여 그러한 것들이 이용될 수 있는 접근의 범위를 나타낸다.

 public 으로 선언된 변수들과 메소드들은 프로그램 내에서 어디서나 이용할 수 있다.

 private 로 선언된 변수들과 메소드들은 정의된 클래스 내에서만 이용할 수 있다.

 protected로 선언된 변수들과 메소드들은 자식 클래스들 혹은 자손 클래스들 내에서 이용할 수 있다.

(25)

접근 수정자의 접근성

항상 접근 수정자를 명시하라

접근가능성 public protected private package

모든 클래스 가능 불가능 불가능 불가능

하위 클래스 가능 가능 불가능 불가능

현 클래스 가능 가능 가능 가능

패키지 가능 가능 불가능 가능

(26)

예제 프로그램 작성

문제: 회사 직원들의 봉급을 계산하는 프로그램을 작성해 보자.

이 회사의 직원 중에는 매니저가 있고 매니저 중에는 임원이 있다.

모든 직원은 이름이 있고 봉급을 받는다. 매니저는 봉급 외에 보너스를 받 는다. 임원은 봉급과 보너스 외에 스톡 옵션을 받는다.

직원, 매니저와 임원의 초봉은 각각 100,000원, 200,000원과 400,000원이다.

매니저와 임원의 보너스는 각각 50,000원과 100,000원이다.

임원의 스톡 옵션은 100,000원 상당의 주식이다.

또한 직급에 따라 매년 봉급 인상률이 다르다.

직원, 매니저와 임원의 봉급 인상률은 각각 30%, 20%와 10%이다.

(27)

필요한 클래스들

직원, 매니저와 임원을 모델하는 클래스와

전체 프로그램을 제어하는 클래스가 필요하다.

클래스 목적

Employee 직원을 모델한다

Manager 매니저를 모델한다

Executive 임원을 모델한다

Driver 다른 클래스들을 시험하는 주 클래스

(28)

클래스 계층도

Employee

Executive

Manager

(29)

Employee 클래스 설계

 변수들

- name: 이름 - salary: 봉급

 메소드들

- 생성자 메소드

- getName: 이름을 알려 준다

- raiseSalary: 인상율에 따라 봉급을 인상한다

(30)

Manager 클래스 설계

 변수들

- bonus: 보너스

 메소드들

- 생성자 메소드

- raiseSalary: 인상율에 따라 봉급을 인상한다

(31)

Executive 클래스 설계

 변수들

- stock_option: 스톡 옵션

 메소드들

- 생성자 메소드

- raiseSalary: 인상율에 따라 봉급을 인상한다

(32)

Employee 클래스 구현

// 직원을 모델한다

public class Employee {

protected String name; // 이름 protected double salary; // 봉급

public Employee(String name, double salary) { this.name = name;

this.salary = salary;

}

public String getName() { return name;

}

public void raiseSalary() { salary *= 1.3;

}

(33)

Manager 클래스 구현

// 매니저를 모델한다

public class Manager extends Employee { protected double bonus; // 보너스

public Manager (String n, double s, double b) { super(n, a);

bonus = b;

}

public void raiseSalary() { // 재정의 salary *= 1.2;

(34)

Executive 클래스 구현

// 임원을 모델한다

public class Executive extends Manager { private double stock_option; // 스톡 옵션

public Executive (String n, double s, double b, double so) {

super(n, s, b);

stock_option = so;

}

public void raiseSalary() { // 재정의 salary = salary * 1.1;

}

(35)

Driver 프로그램

class InheritanceTest {

public static void main(String[] args) {

Employee emp = new Employee("홍길동“, 100000.0);

Manager mng = new Manager("강감찬“, 200000.0, 50000.0);

Executive exc = new Executive(“이순신”, 400000.0, 100000.0, 100000.0);

emp.raiseSalary();

mng.raiseSalary();

exc. raiseSalary();

System.out.println(emp.getName() + " " + emp.salary);

System.out.println(mng.getName() + " " + mng.salary + " " + mng.bonus);

System.out.println(exc.getName() + " " + exc.salary

+ " " + exc.bonus + " " + exc.stock_option);

(36)

요약

 상속

 하위 클래스 만들기

 메소드 재정의

 클래스 계층

 상속과 범위

 접근 수정자

 예제 프로그램 작성

참조

관련 문서

이때 단순한 움직임보다는 파동의 간섭현상을 통해 관찰 가능한 여러 모습을 이용하여 더욱 규칙적인 물의 움직임을 생성한다.. 위상이 같은 두 파동이 만나

제안하는 기법은 2종 이상의 감성에 대한 다중 클래스 분류 문제에 대하여, 이진 분류 모델의 연속적인 결합을 통해 단계 적 분류 모델을 구성함으로써 복잡도 높은 특징

본 연구에서는 하나의 대기부품이 여러 개의 주요부품 의 기능을 동시에 대신 수행할 수 있는 다기능 대기부품을 갖는 병렬시스템을 고려한다. 이 시스템을 구성하 고

총체적인 이해의 측면을 제시해 주는 마이크로어레이와 같은 분석 기술이 있는 반면, 정량적인 이해의 측면을 제시해 주는 TaqMan assay 등과 같은 기술이 있다. 이 두

지금까지의 논의는 디자인 사고의 원리가 서로 다른 종류의 사고방식을 통해 개념을 종합해 확장하는 데 있다는 것을 의미한다. 그러나 디자인 영역이 자신의 전문성을

소크라테스는 여기서 대화자에게 “(X는) 무엇인가?”에 대한 답변으로 서 정의를 요구한다. 이때 정의는 이름을 그것이 지칭하는 사물의 참된 실재에 걸맞게끔 만들어주는

- 다중 도메인 기반의 입력 데이터를 Topological-derivative 기반 Segmentation 을 수행하기 위해 본 연구에서는 다음 그림과 같은 구조를 갖는 알고리즘 설계.. 먼저 입력된

 package 접근 수정자는 기본 접근 수정자로서 해당 클래스, 메소드 나 변수가 같은 패키지 내의 모든 클래스에서 접근 가능하다는 것 을