상속

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

class Parent{}

class Child extends Parent {
   // 자식  ↔상속관계↔ 부모
}

● 자손은 조상의 모든 멤버를 상속받는다.(생성자,초기화블럭 제외)=>부모의 부모 상속
● 자손의 멤버 개수는 조상보다 적을 수 없다.(같거나 많다.)

class Parent {
	int age;	// 멤버 1개
}

class Child extends Parent { // 멤버 1개}
	// 자신의 멤버는 0개 상속받은 멤버는 1개

● 자손의 변경은 조상에 영향을 미치지않는다.

class Parent{
	int age;	// 멤버1개
}

class Child extends Parent {
	void play() {
		System.out.println("놀자~");
	// 자신멤버 1개 상속받은멤버1개 => 2개의 멤버를 갖게된다.
	}
}

포함관계

포함(composite)이란?

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

클래스 간의 관계 결정하기

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

class Point{
	int x;
	int y;
}

class Circle {	// 포함
	Point c = new Point();
	int r;
}

class Circle extends Point {	// 상속
	int r;
}
  • 두개의 문장을 만들면 상속관계인지 포함관계인지 알 수 있다.
    원(Circle) 점(Point)이다. - Circle is a Point.
    원(Circle) 점(Point)을 가지고 있다 - Circle has a Point.

단일상속

  • java는 단일상속만 허용한다.(C++은 다중상속 허용)
class TvDVD extends Tv, DVD { // 에러! 조상은 하나만 허용된다.
	//...
}
  • 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.

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

  • 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
  • 모든클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
    toString(), .equals(Object obj) ,hashCode(), ....
class Tv { // 부모X}
class SmartTv extends Tv { //부모O}
▼컴파일러 했을때 자동으로 추가된다.
class Tv extends Object {}
class SmartTv extends Tv {}

상속계층도

Object
▲
Tv
▲
SmartTv

오버라이딩

  • 상속받은 조상의 메서드를 자신에 맞게 변경하는 것
class Point{ // 2차원 자표
	int x;
	int y;
	
	String getLocation(){
		return " x :" + x + ", y : "+ y;
	}
}
▼ 컴파일러 했을때 결과
class Point3D extends Point {
	int z;
	String getLocation(){	// 조상의 getLocation을 오버라이딩 , 내용만 변경가능
		return " x :" + x + ", y : "+ y, z : " +z;
	}
}

오버라이딩의 조건 3가지

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

오버로딩 vs 오버라이딩

오버로딩 - 기존에 없는 새로운 메서드를 정의하는것(new) ▶ 이름이 같은
오버라이딩 - 상속받은 메서드의 내용을 변경하는것 (change, modify) ▶ 이름변경

class Parent {
	void parentMethod(){}
}
class Child extends Parent {
	void parentMethod(){}	// 오버라이딩
	void parentMethod(int i){}	// 오버로딩
	
	void childMethod(){}	//메서드 정의
	void childMethod(int i){}	// 오버로딩
	void childMethod(){}	// 중복정의, 에러
}

참조변수 super

  • 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재
                                             // static메서드내에 사용불가
  • 조상의 멤버를 자신의 멤버와 구별할 때 사용   // 조상멤버.자신멤버구별

super() - 조상의 생성자

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

제일 중요한 부분! ★★★★★
추가조건 - 생성자의 첫 줄에 반드시 생성자를 호출해야한다. (this,super호출해야한다.)
              그렇지 않으면 컴파일러가 생성자의 첫 줄에 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);	// ok
	}
	Point(int x, int y){
		super(); // Object(); , ok
		this.x = x; 
		this.y = y;
	}
}
profile
반갑습니다.

0개의 댓글