7장 상속과 포함

slee2·2021년 9월 6일
0

Java의 정석

목록 보기
10/28
post-thumbnail
post-custom-banner

상속

  • 기존의 클래스로 새로운 클래스를 작성하는 것.(코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어주는 것.
class	Parent {}

class	Child extends Parent {}

Child 클래스와 Parent 클래스는 상속관계다.

  • 자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외)
  • 자손의 멤버 개수는 조상보다 적을 수 없다.(같거나 많다.)
  • 자손의 변경은 조상에 영향을 미치지 않는다.

상속 했을 때와 안했을 때의 차이점

Point3D	p = new Point3D();

class Point {
	int	x;
   	int	y;
}

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

------------------------------

class Point3D extends Point {
	int z;
}

위의 경우 Point클래스에서 x값이 바뀌어도 Point3D는 영향을 받지 않지만, 밑의 경우에는 Point클래스의 값들이 변경된 것에 영향을 받는다.

포함

포함(composite)이란?

  • 클래스의 멤버로 참조변수를 선언하는 것
  • 작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만든다.
class Circle {
	Point c = new Point();
   	int	r;
}

Circle이 Point를 포함 관계

클래스 간의 관계 결정하기

상속관계

  • '~은 ~이다(is-a)'
    포함관계
  • '~은 ~을 가지고 있다.(has-a)'
class	Circle {
	Point	c = new Point();
   	int	r;
}
원은 점을 가지고 있다.

class Circle extends Point{
	int	r;
}
원은 점이다.

대부분 포함을 많이 사용한다. 상속은 꼭 필요할때만 사용한다.
프로그래밍 = 설계(90%) + 코딩(10%)

단일 상속

Java는 단일상속만을 허용한다.(C++은 다중상속 허용)

class	TvDVD extends Tv, DVD {	// 에러 조상은 하나만 허용된다.
	//...
}

다중을 쓰고싶다면, 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.

class	TvDVD extend TV {
	DVD dvd = new DVD();
   	
   	void	play() {
    	dvd.play();
    }
    
   	void	stop() {
    	dvd.stop();
    }
}

Object 클래스 - 모든 클래스의 조상

  • 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
  • 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
    (toString(), equals(Object obj), hashCode(), ...

오버라이딩

상속받는 조상의 메서드를 자신에 맞게 변경하는 것

class	Point {
	int	x;
   	int	y;

   	String	getLocation() {
   		return "x :" + x + ", y :" + y;
    }
}

class	Point3D extend Point {
	int	z;
  
   	String	getLocation() {			// 오버라이딩
    	return "x :" + x + ", y :" + y + ", z :" + z;
    }		// 선언부 변경 불가. 내용만 변경가능. 구현부 {}
}

오버라이딩의 조건

  • 선언부가 조상 클래스의 메서드와 일치해야 한다.
  • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

참조변수 super

  • 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재
  • 조상의 멤버를 자신의 멤버와 구별할 때 사용
class	Ex7 {
	public static void	main(String args[]) {
   		Child	c = new Child();
   		c.method();
    }
}

class	Parent {int x = 10; // super.x}

class	Child extends Parent {
	int	x = 20;		// this.x
   	
   	void	method() {
   		System.out.println("x=" + x);
   		System.out.println("this.x=" + this.x);
   		System.out.println("super.x=" + super.x);
    }
}
x = 20
this.x = 20
super.x = 10

class	Parent2 {int x = 10; // super.x}

class	Child2 extends Parent2 {
   	void	method() {
   		System.out.println("x=" + x);
   		System.out.println("this.x=" + this.x);
   		System.out.println("super.x=" + super.x);
    }
}
x = 10
this.x = 10
super.x = 10

super() - 조상의 생성자

  • 조상의 생성자를 호출할 때 사용
  • 조상의 멤버는 조상의 생성자를 호출해서 초기화
class	Point {
	int	x, y;
    
   	Point(int x, int y) {
   		this.x = x;
   		this.y = y;
    }
}

class	Point3D extends	Point {
	int	z;
    
    Point3D(int x, int y, int z) {
   		this.x = x;		// 조상의 멤버를 초기화. 이렇게 하면 안된다.
  		this.y = y;
  		this.z = z;
    }
}

-----------------------------------

Point3D(int x, int y, int z) {
	super(x, y);		// 조상클래스의 생성자 Point(int x, int y)를 호출
	this.z = z;			// 자신의 멤버를 초기화
}

조상님껀 조상님이 초기화하세요.

생성자의 첫줄에 반드시 생성자를 호출해야 한다.(중요)

  • 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입
class	Point {
	int	x;
   	int	y;
    
   	Point() {
   		this(0, 0);
    }
    
   	Point(int x, int y) {
   		this.x = x;
  		this.y = y;
    }
}

------- 컴파일을 하면 ---------
class	Point extends Object {
	int	x;
   	int	y;
    
   	Point() {
   		this(0, 0);
    }
    
   	Point(int x, int y) {
   		super();	// Object();
   		this.x = x;
  		this.y = y;
    }
}
post-custom-banner

0개의 댓글