본문 바로가기 메뉴 바로가기

티스토리 뷰

반응형

OOP - 포함, 상속, 오버라이딩

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클래스가 가지는 멤버는 다 가지게 된다.(private멤버와 생성자는 제외, 생성자는 상속의 대상이 아니다, private에 대해서는 다음 단원(접근제어자)에서 다시 설명한다. )

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 클래스이다”;

   }

}

 

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(…)는 상위클래스의 생성자를 의미한다. */

}

}


출처 : https://coffee-mark.tumblr.com/post/61451064222/oop-%ED%8F%AC%ED%95%A8-%EC%83%81%EC%86%8D-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9


위 본문 외에도 객체지향관련 ( 자바기준 ) 자료들이 있음.

반응형

'면접공부해요' 카테고리의 다른 글

객체지향 OOP에 대한 정리  (0) 2018.04.26
C++과 C#의 차이점?  (0) 2018.04.26
단편화/멀티코어  (0) 2018.04.19
상속 오버라이딩 함수 vs 가상 함수  (0) 2018.04.19
C++/소멸자에 virtual을 쓰는 이유  (0) 2018.04.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함