상속이란 ?

객체지향 프로그램에서 가장 중요한 부분이다. 객체지향의 개념중에서 가장 중요한 ‘코드의 재사용’을 프로그램으로 구현하는 부분이기 때문이다. 새로운 클래스를 생성할 때 처음부터 새로 작성하는 것이 아니라, 기존의 정의된 클래스로부터 중복되는 부분을 물려받아서 사용할 수 있다. 이렇게 되면 우리는 새로운 클래스에서 추가되는 부분만 고심해서 프로그래밍하면 된다.

장점 - 프로그램 전체를 새로 개발하는 것이 아니므로 프로그램 개발 기간의 단축과 비용의 감소를 가져올 수 있고, 실제 시스템에서 안정적으로 돌아가는 코드 부분을 사용하기 때문에 시스템이 더 안정적이다.

서브클래스(sub class), 자식 클래스(child class), 파생 클래스(derived class) - 새로 작성해서 기존의 코드를 가져다 쓰는 클래스가 상속을 받는 클래스를 말함.

슈퍼클래스(super class), 베이스 클래스(base class), 부모 클래스(parent class) - 기존에 이미 만들어져서 상속해주는 클래스를 말함.

상속은 'is a' 관계로 표현한다.

“Human is a Mammal" (사람은 포유류이다)

포유류의 종류 중에서 사람이라는 하나의 종류로 특성화(구체화)됨을 보여준다.

서브 클래스는 슈퍼 클래스가 가지는 멤버 변수나 메소드를 모두 사용할 수 있다.

즉, 부모의 것은 내 것이다.

object 클래스의 정의 -

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

extends를 쓰지 않은 클래스를 선언해도, 그것은 묵시적으로 extends object를 한것과 같은 의미이다.

public class Employee{

}

이 두 클래스는 같은 의미이다.

public class Employee extends Object{

}

슈퍼 클래스

서브 클래스

프로그램 수행 결과

생성자를 정의하지 않은 경우

생성자 정의 안함

수행됨

매개 변수 없는 생성자

수행됨

매개 변수 있는 생성자

수행됨

매개 변수가 없는

생성자를 정의한 경우

생성자 정의 안함

수행됨

매개 변수 없는 생성자

수행됨

매개 변수 있는 생성자

수행됨

매개 변수가 있는

생성자만 정의한 경우

생성자 정의 안함

에러 발생

매개 변수가 없는 생성자

슈퍼 클래스의 해당 생성자를 호출하지 않으면 에러 발생. super() 메소드 사용

매개 변수가 있는 생성자

슈퍼 클래스의 해당 생성자를 호출하지 않으면 에러 발생. super() 메소드 사용

서브 클래스의 객체를 생성할 때는 반드시 슈퍼 클래스의 생성자를 먼저 실행해야 한다.

슈퍼 클래스에 매개 변수가 있는 생성자만 정의되어 있고, 서브 클래스에 매개 변수가 있는 생성자가 있을 때, 서브 클래스의 super()를 쓰지 않으면 에러가 난다. 슈퍼 클래스의 매개 변수 있는 타입의 생성자는 여러 가지 형태가 있을 수 있어 무엇을 수행할지 알 수 없으므로 자동으로 슈퍼 클래스의 생성자를 실행하지 않는다. 따라서 반드시 super()를 사용해야 한다. 앞의 표에서 보듯이 슈퍼 클래스에 매개 변수가 없는 생성자가 정의되어 있는 경우 서브 클래스의 생성자는 어떤 형태가 나와도 상관이 없다. 따라서 하는 일은 없더라도 프로그램의 안정성을 위해서 매개 변수가 없는 생성자를 정의하는 것이 좋다.

생성자 - 클래스와 이름이 같은 메소드를 말한다.

- 특징

1. 클래스명과 대소문자도 모두 같아야 한다.

2. 클래스의 객체가 생성될 때마다 자동으로 호출된다.

3. 하나의 클래스에 여러 개를 기술할 수 있다.

4. 하나의 클래스에 여러 개의 생성자를 기술하면 객체 생성시 매개 변수의 개수, 매개 변수의 타입이일치하는 생서자를 호출해서 객체를 생성한다.

5. 생성자는 클래스명과 동일한 이름을 가지고 리턴 타입을 기술하지 않으며, 접근제어자는 public을 권장한다.이유) 어느 곳에서든지 객체를 생성할 수 있게 하기 위해서이다. 리턴타입은 기술하지 않지만 암묵적으로 void로 정의한 것으로 취급한다.

class ABC{

public ABC(){

}

}

생성자에서 하는일 - 주로 멤버 변수의 초기화와 메모리 할당을 위해 사용된다. 즉, 객체의 생성에 필수 요소이다. 생성자를 기술하지 않으면 자바 가상머신이 default 생성자를 생성해 준다.

this 레퍼런스 - 클래스에서 자기 자신을 가리킬 때는 this 레퍼런스를 사용한다.

- 용도

1. 매개 변수 값으로 멤버 변수의 값을 설정하는 경우처럼 자신의 클래스 내에 멤버 변수나 메소드를 명확히 해야 할 필요가 있을 때이다.

예) this.width = width;

2. 자신의 클래스 전체를 매개 변수로 전달할 때이다. 주로 이벤트 처리에서 이벤트를 처리하는 메소드가 같은 클래스 내에 있을 때, 또는 다른 클래스의 메소드를 호출할 때 자신의 클래스를 매개 변수로 보내야 할 경우에 사용된다.

동물 시뮬레이션 프로그램을 만들기 위한 상속 트리를 설계해봅시다.

1. 공통적인 속성과 행동이 들어있는 객체를 찾아봅시다.

여기에 있는 여섯 종류의 동물에서 어떤 공통적인 특성을 찾을 수 있나요? 그 과정에서 행동을 추상화 할 수 있습니다(2단계).각 유형은 어떻게 연관될까요? 이 과정에서 상속 트리에서의 관계를 정의할 수 있습니다(4단계~5단계)

2. 공통적인 상태와 행동을 나타내는 클래스를 설계합니다.

이 객체들은 모두 동물이므로 Animal이라는 공통적인 상위클래스를 만들겠습니다. 그리고 그 안에는 모든 동물이 필요로 하는 메소드와 인스턴스 변수를 집어넣어야 겠죠?

3. 특정 하위클래스 유형에만 적용되는 행동(메소드 구현)이 필요한지 결정합니다. Animal 클래스를 보면 각 하위클래스에서 eat()와 makeNoise()를 오버라이드해야 한다는 결정을 내릴 수 있습니다.

4. 공통적인 행동이 필요한 하위클래스를 두 개 이상 찾아서 추상화의 개념을 더 폭넓게 활용할 수 있을지 찾아봅니다. 여러 클래스를 살펴보면 Wolf와 Dog에 공통적인 행동이 있고 Lion, Tiger, Cat에도 공통적인 행동이 있다는 것을 알 수 있습니다.

5. 클래스 계층 구조를 완성해봅시다.

사실 동물에는 이미 계층 구조(hierarchy, 생물 시간에 계, 문, 강, 목, 과, 속 종 같은 생물 분류 체계를 배운 적이 있죠?)가 있으니까 클래스를 설계하는 과정에서도 최대한 활용해보겠습니다. 여기서는 생물 분류체계에서의 과를 활용하여 Feline(고양이과) 클래스와 Canine(개과) 클래스를 만들어서 동물을 조직화하겠습니다.

개과 동물은 무리를 지어서 움직이는 성향이 있다는 점을 감안하면 Canine 클래스에서 공통적인 roam()메소드를 만들 수 있을 것입니다. 또한 고양이과 동물은 같은 종류에 속하는 다른 동물을 피하려는 습성이 있기 때문에 공통적인 roam()메소드를 만들 수 있을 것입니다. Hippo 클래스에서는 그냥 Animal 클래스에 들어있는 일반적인 roam() 메소드를 활용하겠습니다.

일단 지금은 이 정도로 마치고 잠시 후에 다시 이 주제로 돌아오도록 하죠


'객체지향언어' 카테고리의 다른 글

파이썬 2부  (0) 2013.06.10
파이썬 1부  (0) 2013.06.09
삼성 애니프레임.  (0) 2013.05.31
객체지향 - 유스케이스  (0) 2009.08.19

+ Recent posts