on
자바의 정석3-1 상속(Inheritance)과 포함(composite)
자바의 정석3-1 상속(Inheritance)과 포함(composite)
상속: 두 클래스를 부모와 자식으로 관계를 맺어주는 것.
- 기존의 클래스로 새로운 클래스를 작성하는 것(코드의 재사용)
- 자손은 조상(부모의 부모)의 모든 멤버를 상속받는다.(생성자, 제외)
- 자손의 멤버 개수는 조상보다 적을 수 없다.(같거나 많다.)
- 자손의 변경은 조상에 영향을 미치지 않는다.
기본 구조
class 자식클래스 extends 부모클래스 { // … }
class Parent { int age; //멤버 1개 } class Child extends Parent { // … //자신의 멤버 0개, 상속받은 멤버 1개 -> 멤버 1개 }
자손의 멤버 개수는 조상보다 적을 수 없다.(같거나 큼)
class Parent { int age; // 멤버 1개 } class Child extends Parent { void play( ) { System.our.println(“놀자!”); // 새로운 멤버 추가해도 Parent에 영향 미치지 xx -> 자신의 멤버 1개, 상속받은 멤버 1개 -> 총 멤버 2개 } }
자손의 변경은 조상에 영향을 미치지 않음
class Point { // 2차원 좌표의 한 점을 나타내기 위한 클래스
int x;
int y;
}
class Point3D {
int x ;
int y ;
int z ;
} class Point3D extends Point {
int z;
} 3 차원 좌표의 한 점을 만드는 point3D 클래스 (상속 xx)
Point 클래스와 관계를 받지 않기 때문에 Point 클래스의 변경에 영향을 받지 않음 3 차원 좌표의 한 점을 만드는 point3D 클래스 (상속받음)
Point 클래스에게 상속받기 때문에 Point 클래스의 변경에 영향을 받음 멤버변수 3 개 ( x, y, z ) 멤버변수 3 개 ( 상속받은 멤버(x,y) + 자신의 멤버 (z) )
예제 부모클래스 Tv와 자식 클래스 SmartTv 클래스
public class Inherit { public static void main(String[] args) { SmartTv stv = new SmartTv(); stv.channel = 10; // Tv 클래스로부터 상속받은 멤버 stv.channelUp(); // Tv 클래스로부터 상속받은 멤버 System.out.println(stv.channel); // 11 stv.displayCaption("Helo, Java"); stv.caption = true; // 캡션(자막)기능을 켠다. stv.displayCaption("Hello, World"); // Hello, World } } // 부모 클래스 멤버 5개(2개 변수와 3개의 메서드) class Tv { //부모 클래스 멤버 5개 boolean power; // 전원상태(on/off) int channel; // 채널 void power() { power = !power; } void channelUp() { ++channel; } void channelDown() { --channel; } } // 자식 클래스 멤버 7개(2개 + 5개) class SmartTv extends Tv { // SmartTv는 Tv에 캡션(자막)을 보여주는 기능을 제공 boolean caption; // 캡션상태(on/off) void displayCaption(String text) { if(caption) { // 캡션 상태가 on(true)일 때만 text를 보여준다. System.out.println(text); } } }
포함 관계
포함(composite): 클래스의 멤버로 참조변수를 선언하는 것
작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.
1번 클래스 생성, 2번 클래스 안에 1번 클래스의 객체 생성, 1번 클래스의 메서드를 사용하는 것
class Point { // 2차원 좌표의 한 점을 나타내기 위한 클래스
int x;
int y;
}
class Point3D {
int x ;
int y ;
int r;
} class Circle {
Point c = new Point (); // 원점
int r ; // 반지름
} Circle 클래스이 Point 클래스를 포함 (Point c = new Point( )) 저장공간 3 개 (x, y, r) 저장공간 3 개 (r, 참조변수 c 가 x 와 y 의 주소값 가리킴 )
class Car {
Engine e = new Engine (); // 엔진
Door [] d = new Door [4]; // 문, 문의 개수를 넷으로 가정하고 배열로 처리함
}
-> Car 클래스가 Engine 클래스와 Door 객체 배열을 포함!(복잡도가 줄어듦)
클래스 간의 관계 결정하기
상속관계 ‘~은 ~이다. (is – a)’
포함관계 ‘~은 ~을 가지고 있다. (has – a)’
A와 B를 넣어서 자연스러운 것으로 관계를 정립함!(A는 B이다, A는 B를 가지고 있다.)
-> 보통 대부분은 상속보다는 포함!, 상속은 여러 가지 제약이 많기 때문에 꼭 필요할 때만!
class Circle {
Point c = new Point ();
int r ;
} class Circle extends Point {
int r;
} 원 (Circle) 은 점 (Point) 를 가지고 있다 . ( 포함 ) Circle 은 Point클래스를 상속받음
예제 1) Point 클래스 생성, Circle 클래스 생성하고 상속을 사용
public class Inherit2 { public static void main(String[] args) { Circle c = new Circle(); // 참조변수의 초기화 c.x = 1; c.y = 2; c.r = 3; System.out.println("c.x = " + c.x); System.out.println("c.y = " + c.y); System.out.println("c.r = " + c.r); } } class Point { int x; int y; } class Circle extends Point { //상속 int r; }
예제 2) Point 클래스 생성, Circle 클래스 생성하고 포함을 사용
public class Inherit2 { public static void main(String[] args) { Circle c = new Circle(); c.p.x = 1; c.p.y = 2; c.r = 3; System.out.println("c.p.x = " + c.p.x); System.out.println("c.p.y = " + c.p.y); System.out.println("c.r = " + c.r); } } class Point { int x; int y; } class Circle { // 포함 Point p = new Point(); int r; } //class Circle { // 포함(생성자를 선언해서 그 안에서 초기화 해도됨)위의 코드와 같음 // Point p; // int r; // // Circle() { // p = new Point(); // } //}
단일 상속(Single Inheritance)
- Java는 단일상속만을 허용한다.(C++은 다중상속 허용)
- 하나의 부모만 상속 허용 예) class TvDVD extends Tv, DVD
- 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
Object 클래스: 모든 클래스의 조상
- 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
- 컴파일러가 자동적으로 추가해줌
- 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다. (toString( ), equals(Object obj), hashCode( ), …
class Point {
int x ;
int y ;
} class Point extends Object {
int x ;
int y ;
}
-> 자동으로 컴파일러가 Object 클래스를 추가해줌
-> Object로부터 상속받은 toString( )메서드를 사용할 수 있다.
Circle c = new Circle();
System.out.println(c.toString());
System.out.println(c);
<출력값>
inherit.Circle@1c4af82c
inherit.Circle@1c4af82c
-> c.toString( )을 호출하거나 참조변수c를 출력하는 것은 같음
from http://everysmallstep.tistory.com/76 by ccl(A) rewrite - 2022-01-01 03:02:14