Coram Deo

ch 7-1~9 [객체지향 개념] - 상속, 포함 관계, 오버라이딩과 오버로딩 차이점 본문

자바의 정석

ch 7-1~9 [객체지향 개념] - 상속, 포함 관계, 오버라이딩과 오버로딩 차이점

탁탁슝 2022. 11. 5. 21:59

ch 7-1,2 상속(Inheritance)

- 기존의 클래스로 새로운 클래스를 작성하는 것. (코드의 재사용)

- 두 클래스를 부모와 자식으로 관계를 맺어주는 것.

- 자손은 조상의 모든 멤버를 상속받는다. (생성자, 초기화블럭 제외)

- 자손의 멤버 개수는 조상보다 적을 수 없다. (같거나 많다.)

- 자손의 변경은 조상에 영향을 미치지 않는다. * 단, 부모의 변경은 자식에 영향을 줌.

- 상속하면 자손 클래스가 확장된다. → extends

 

ch 7- 3 포함 관계

▶ 포함(Composite)이란?

- 클래스의 멤버로 참조변수를 선언하는 것

- 작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만든다.

// 포함관계 예제
class Point {
	int x;
	int y;
}

class Circle {
	Point c = new Point(); // 원점
	int r; // 반지름(radius)
}

 

ch 7- 4 클래스 간의 관계 결정하기

상속관계 '~은 ~이다.(is-a)'

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

class Point {
	int x;
	int y;
}

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

// 2. 상속관계
class Circle extends Point {
	int r;
}

Circle c = new Circle();
// 1,2번일 때 각각 그림 직접 그려보기

예시) 원(Circle)은 점(Point)이다. - Circle is a Point. → 상속

         원(Circle)은 점(Point)을 가지고 있다. - Circle has a Point. → 포함

* 대부분의 경우(90%)는 포함이다. 상속은 여러가지 제약이 많기 때문에 꼭 필요할때만 씀.

 

프로그래밍 = 설계(90%) + 코딩(10%)

설계 (=그리기) → 많이 그려보기! 

 

ch 7- 5 단일 상속(Single Inheritance)

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

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

 

ch 7- 6 Object 클래스 - 모든 클래스의 조상

- 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다. (우리가 작성하지 않아도 컴파일러가 자동 추가해줌.)

- 모든 클래스는 Object 클래스에 정의된 11개의 메서드를 상속받는다.

- 11개의 메서드 : toString(), equals(Object obj), hashCode(), ...

 

- toString()

클래스이름@객체주소값

 

* 아래 두 문장의 출력결과가 같음. (println안에 참조변수를 입력하면 toString()자동 호출함.)

println(참조변수) = println(c.toString())

 

ch 7- 7 메서드 오버라이딩(overriding)

- override : v. 덮어쓰다.

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

- 선언부는 변경불가, 내용(구현부)만 변경가능

- 의미상 같은 일을 할 때 사용

 

ch 7- 8 오버라이딩의 조건

1. 선언부가 조상 클래스의 메서드와 일치해야 한다.

2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다. * 접근제어자 : public, protected, private 등

3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다. (예외는 8장에서 / 같거나 적어야함.)

 

ch 7- 9 오버로딩 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() {}		// 중복정의 -> 오버로딩도 아니고 오버라이딩도 아님. 에러임.
}