JAVA_27_상속과 포함

21252 단어 JavaJava

상속 inheritence

  • 기존의 클래스로 코드를 재사용하여 새 클래스를 작성하는 것
  • 두 클래스를 부모-자식의 관계로 맺어주는 것
  • 상속관계 : 부모클래스-자식클래스의 관계
class 자식클래스명 extends 부모클래스명 {
	...
    	...
}
  • 자손은 조상(부모, 부모의 부모..)의 모든 멤버를 상속받는다. 단 ✨생성자와 초기화블럭 제외
  • 자손의 멤버 개수 >= 조상의 멤버 개수
  • 자손Child ⊃ 조상Parent
  • 자손의 변경 -> 조상에 영향X
  • 조상의 변경 -> 자손도 변경O

class Tv {
	boolean power;	// 전원on/off, 초기화 false(off)인 상태
	int channel;	// 채널
	
	void power() {
		power = !power;	//**홀수번 호출: true(켜진 상태)
	}
	void channelUp() {++channel;}	// 앞이든 뒤든 단독이므로 상관없다.    
	void channelDown() {--channel;}
}

class SmartTv extends Tv{	// Tv클래스(부모)를 상속받는 SmartTv클래스(자식)
	boolean caption;		// 자막on/off, 초기화 false(off)인 상태
	void displayCaption(String text) {
		if(caption) {		// 자막이 on(true)일 때 매개변수로 받은 text를 출력
			System.out.println(text);
		}
		else {			// 자막 off(false)일 때 nothing 출력
			System.out.println("nothing");
		}
	}
}


public class Ex7_01 {

	public static void main(String[] args) {
		// 상속
		SmartTv stv = new SmartTv();
		stv.channel = 10;
		stv.channelUp();	// 인스턴스메소드 호출 방법 잊지 말기!
		System.out.println(stv.channel);
		
		stv.displayCaption("Hello");	// false(off)이기에 출력x
		stv.caption = true;				// 자막on
		stv.displayCaption("Hello");
		

	}

}

11
nothing
Hello


일반과 상속의 차이

일반

class Point3D {
	int x;
    	int y;
    	int z;
}
...
...

Point3D p = new Point3D();

상속

class Point {
	int x;
    	int y;
}

class Point3D extends Point {
	int z;
}
...
...

Point3D p = new Point3D();

-> 같다!!!



포함 composite

  • 클래스의 멤버로 참조변수를 선언하는 것
  • 작은 단위의 클래스를 만들고, 이 클래스들을 조합해서 클래스를 만든다.

예)

class Car {
	Engine e = new Engine();	// Engine클래스를 포함한다.
    	Door[] d = new Door[4];	// 요것도! 
}


일반과 포함의 차이

일반

class Circle {
	int x;
    	int y;
        int r;
}
...
...

Circle c = new Circle();

포함

class Point {
	int x;
    	int y;
}

class Circle {
	Point p = new Point();
    	int r;
}
...
...

Circle c = new Circle();

저장공간이 3개인 건 같다!



InheritenceTest


class MyPoint{
	int x;
	int y;
}

class Circle extends MyPoint{//상속
	int r;
}

class Circle2{//포함
//	MyPoint p = new MyPoint();//1.바로 초기화 하거나
	MyPoint p;
	int r;
	
	//***2. 바깥에 있는 클래스의 생성자 안에서 초기화 해주거나
	public Circle2() {
		p = new MyPoint();
	}
}

public class InheritenceTest {

	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);
		
		Circle2 c2 = new Circle2();
		c2.p.x = 4;
		c2.p.y = 5;
		c2.r = 6;
		System.out.println("c2.p.x= "+c2.p.x);
		System.out.println("c2.p.y= "+c2.p.y);
		System.out.println("c2.r= "+c2.r);
		

	}

}

c.x= 1
c.y= 2
c.r= 3
c2.p.x= 4
c2.p.y= 5
c2.r= 6


클래스 간의 관계 결정하기

상속

: A는 B이다.

포함

: A는 B를 가지고 있다.

  • 바로 위의 Circle클래스예제의 경우, 원(Circle)이 점(Point)을 갖는 것이므로, 포함이다.
  • 보통 포함의 경우가 90%



Ref

좋은 웹페이지 즐겨찾기