[Java의 정석]Chapter7.객체지향 프로그래밍2(01~04)

Hello_Wendy·2022년 4월 21일
0

자바의 정석

목록 보기
48/61
post-thumbnail

Chapter 7. 객체지향 프로그래밍 2

01. 상속

  • 상속 : 기존의 클래스를 재사용하여 새로운 클래스를 작성
  • 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고, 코드를 공통적으로 관리할 수 있어 코드의 추가 및 변경이 용이
  • 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여
  • 상속 구현 방법 : 클래스 이름 뒤 상속받고자 하는 클래스의 이름을 키워드 'extends'와 함께 써 주면 됨
<새로 작성하려는 클래스 이름이 Child이고 상속받고자 하는 기존의 클래스 이름이 Parent 일 때>
class Parent { }
class Child extends Parent { 
	//Child는 자손클래스, Parent는 조상클래스
}
  • 두 클래스는 서로 상속 관계에 있다고 하며, 상속해주는 클래스를 '조상클래스', 상속 받는 클래스를 '자손클래스'라고 함
  • 자손 클래스는 조상 클래스의 모든 멤버를 상속받기 때문에, Child클래스는 Parent클래스의 멤버들을 포함
  • 만일 Parent클래스에 age라는 정수형 변수를 멤버변수로 추가하면, 자손 클래스는 조상의 멤버를 모두 상속받기 때문에, Child클래스는 자동적으로 age라는 멤버변수가 추가된 것과 같은 효과
class Parent {
	int age;
}
class Child extends Parent{ }
  • 자손인 Child클래스에 새로운 멤버로 play() 메서드 추가하면
class Paretn {
	int age;
}
class Child extends Parent {
	void play() {
    	System.out.println("놀자~");
    }
}
  • Child클래스에 새로운 코드가 추가되어도 조상인 Parent클래스는 아무런 영향 없음

  • 자손 클래스는 조상 클래스의 모든 멤버를 상속 받으므로 항상 조상 클래스보다 같거나 많은 멤버를 가짐. 즉, 상속에 상속을 거듭할수록 상속받는 클래스의 멤버 개수는 점점 늘어나게 됨

  • 상속을 받는다는 것은 조상 클래스의 확장(extend)한다는 의미로 해석할 수도 있으며, 상속의 키워드가 extend인 이유

    • 자손 클래스는 조상클래스의 모든 멤버를 상속 받음
      (단, 생성자와 초기화 블럭은 상속되지 않음)
    • 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많음

02. 상속 예제

▶ Tv클래스로부타 상속받고 기능을 추가하여 smartTv클래스를 작성
▶ 멤버변수 caption은 캡션기능의 상태(on/off)를 저장하기 위한 boolean형 변수
▶ displayCaption(String text)은 매개변수로 넘겨받은 문자열(text)을 캡션이 켜져 있는 경우(caption의 값이 true인 경우)에만 화면에 출력
▶ 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버도 함께 생성되기 때문에 따로 조상 클래스의 인스턴스를 생성하지 않고도 조상 클래스의 멤버들을 사용 가능

03. 클래스 간의 관계 - 포함관계

  • 상속이외에도 클래스를 재사용 하는 또 다른 방법으로 '포함(composite)'
  • 포함(composite) : 클래스 간의 포함관계를 맺어주는 것이며, 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것
(Circle)을 표현하기 위한 Circle클래스와 좌표상의 한 점을 다루기 위한 Point클래스를 아래와 같이 작성함

class Circle {
	int x; //원점의 x좌표
    int y; //원점의 y좌표
    int r; //반지름(radius)
}

class Point {
	int x; //x좌표
    int y; //y좌표
}

Point클래스를 재사용해서 Circle클래스를 작성한다면 다음과 같이 할 수 있을 것

class Circle {
	int x; //원점의 x좌표
    int y; //원점의 y좌표
    int r; //반지름(radius)
} 

▼▼▼▼▼▼▼포함관계▼▼▼▼▼▼▼

class Circle {
	Point c = new Point(); //원점
    int r;
}
    
▼▼▼▼▼▼▼상속관계▼▼▼▼▼▼▼    

class Circle extends Point {
	int r;
}
  • 이와 같이 한 클래스를 작성하는데 다른 클래스를 멤버변수로 선언하여 포함시키는 것은 좋은 생각임
  • 하나의 거대한 클래스를 작성하는 것보다 단위별로 여러 개의 클래스를 작성한 다음, 이 단위 클래스들을 포함관계로 재사용하면 보다 간결하고 손쉽게 클래스를 작성 가능
  • 또한 작성된 단위 클래스들은 다른 클래스를 작성하는데 재사용 가능
class Car {
	Engine e = new Engine(); //엔진
    Door[] d = new Door[4]; //문, 문의 개수를 넷으로 가정하고 배열로 처리

04. 클래스 간의 관계 결정하기

  • 클래스를 작성하는데 상속관계를 맺어 줄 것인지 포함관계를 맺어 줄 것인지 결정하는 것이 혼란스러울 수도 있음
  • 포함시키거나 상속받로고 하는것이 결과적으로 큰 차이가 없어 보일 때
    -'~은 ~이다(is-a)'와 '~은 ~을 가지고 있다(has-a)'를 넣어서 문장을 만들어 보면 클래스 간의 관계가 명확해짐

원(Circle)은 점(Point)이다. - Circle is a Point.
원(Circle)은 점(Point)을 가지고 있다. - Circle has a Point.
→원은 원점(Point)과 반지름으로 구성되므로 두 문장을 비교해 보면 포함관계가 더 옳음

SportsCar는 Car이다
상속관계

📌 상속 : ~은 ~이다(is-a).
📌 포함 : ~은 ~을 가지고 있다(has-a).

profile
안녕 나의 새로운 세상

0개의 댓글