2014. 11. 9. 16:53ㆍBasic/etc
1. 클래스의 재활용
기존의 클래스를 재활용하는 방법에는 "상속"과 "포함"이 있다.
사람이라는 클래스가 있다고 하자. 현재 우리가 필요로 하는 클래스는 학생이라는 클래스인데 학생클래스는 사람클래스가 가지는 모든 멤버를 가져야 한다고 한다면 복사를 해서 사용한다. 여기서 코드의 중복이 생겨나고 사람클래스의 변경이 생기면 학생 클래스도 수정해야 하므로 유지보수에 비용이 들어갈 수 있다. ===> 상속과 포함을 사용함으로써 이런 코드의 중복을 방지하고 코드를 변경하고 싶으면 한 군데만 변경하면 나머지 모든 클래스의 코드가 변경되니 프로그램의 생산성이나 유지보수에 도움이 됨.
Person
{
int age;
}
① 포함
Student클래스는 멤버 변수로 Person데이타 변수를 가진다.
class Student
{
Person p;
}
Student s = new Student();
s.p = new Person();
s.p.age = 20;
② 상속
Student가 Person클래스를 상속받으면 Person클래스가 가지는 멤버는 다 가지게 된다.(생성자는 제외, 생성자는 상속의 대상이 아니다 : 상속되지는 않지만 자식클래스의 생성자에서는 부모의 생성자를 호출해야 한다)
class Student extends Person
{
}
Student s = new Student();
s.age = 20;
③ 언제 상속? 언제 포함?
자동차라는 클래스가 있는데 버스 클래스가 필요하면? 상속
엔진클래스가 있는데 자동차가 클래스가 필요하면? 포함
동물 클래스가 있는데 포유류 클래스가 필요하면? 상속
화장실 클래스가 있는데 건물 클래스가 필요하면? 포함
포함과 상속중 어떤것을 사용해도 상관없다면?
"포함"을 사용한다. 자바는 다중상속이 안되니 이 경우 상속은 나중을 위해 아껴두자!
=> 객체지향 프로그래밍에 있어서 상속이 핵심 기능 가운데 하나이긴 하지만 행동을 재사용하는 데 있어서 무조건 최선의 방법이 아니라는 점에 주의해야 합니다. 처음에는 상속을 쓰기 마련이고, 그 방법이 가장 좋은 디자인 방법이 될 수도 있지만, 디자인 패턴을 공부하다 보면 다른 강력하면서도 유연한 방법을 익힐 수 있을 겁니다. - [출처]Head First Java 에서 -
~는 ~ 이다. 가 성립하면 상속관계.
~는 ~을 가진다. 관계가 성립되면 포함관계.
※ 사실 자바의 모든 클래스는 무조건 Object라는 클래스를 상속받아서 정의하여야 한다.
class Person
{
}
이라고 정의 하면 컴파일시 컴파일러에 의해 다음과 같은 코드가 추가되어 컴파일 된다.
class Person extends Object
{
}
다른 클래스를 상속받고 있으면 extends Object는 추가되지 않는다.
class Student extends Person
{
}
이라고 정의하면 Person이 Object를 상속받았으므로 extends Object는 필요없게 된다.
2. 오버라이딩(overriding)
클래스는 상속을 받으면 조상이 가지는 모든 멤버를 동일하게 가진다고 했다. 여기서 멤버는 멤버변수와 멤버메서드를 말한다.
멤버메서드의 경우 조상클래스와 이름은 동일한 상태에서 (이름, 매개변수, 리턴타입 동일) 내용(구현부)만 변경해서 같은 이름의 메서드를 만들 수 있다. 이렇게 하위 클래스에서 조상클래스의 메서드와 같은 이름에 다른 내용을 가지게 만드는 것을 메서드 오버라이딩 이라 한다.
class Person
{
void move()
{
System.out.println("person move");
}
}
class Student extends Person
{
void move()
{
System.out.println(" 수정!수정!수정했다.....");
}
//toString() 메서드는 Object클래스가 가지고 있으므로 이것도 오버라이딩!
public String toString()
{
return "난 Student 클래스이다";
}
}
※ Student 클래스안에서 Person의 move()메서드를 호출하고 싶으면 super키워드를 사용하여 super.move()이라고 호출하면 된다.(super 키워드는 상위클래스를 가르키는 변수이다)
3. 상속의 이해
Student 클래스가 Person 클래스를 상속받게 되면, Student 클래스의 생성자 내부에서 Person 클래스(상위클래스)의 생성자를 가장 먼저 호출하게 된다. 그래서 하위클래스가 상위클래스의 멤버를 가지게 된다. 상위 클래스의 생성자가 디폴트생성자(기본생성자)는 호출을 명시하지 않아도 컴파일시 자동으로 만들어진다. 하지만 상위클래스가 디폴트생성자를 가지지 않으면 하위클래스 생성자 내에 직접 명시해야 한다.
class Data
{
int x;
Data(int x) // 기본생성자가 아니다. 기본생성자가 없다
{
this.x = x;
}
}
class Sub extends Data
{
Sub(int x)
{
super(x);
/* super 키워드는 상위클래스를 가르키는 변수이다. Super(...)는 상위클래스의 생성자를 의미한다. */
}
}
[출처] [24] OOP - 포함, 상속, 오버라이딩 (JAVA 개발자) |작성자 zeroDay
'Basic > etc' 카테고리의 다른 글
추상클래스와 인터페이스 (0) | 2014.11.09 |
---|---|
접근제어자와 캡슐화 (0) | 2014.11.09 |
객체지향? 추상화? (0) | 2014.11.09 |
다형성 (0) | 2014.11.09 |
오버로드? 오버라이딩? (0) | 2014.11.06 |