Programming Language/Java

[Java] 상속 | 클래스 상속, 오버라이딩, 오버로딩

성니 2021. 2. 23. 14:54

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788994492032&orderClick=LEa&Kc=

 

Java의 정석 - 교보문고

자바의 기초부터 객제지향개념을 넘어 실전활용까지 수록한『Java의 정석』. 저자의 오랜 실무경험과 강의한 내용으로 구성되어 자바를 처음 배우는 초보자들의 궁금한 점을 빠짐없이 담고 있

www.kyobobook.co.kr


[상속]

* 상속이란?

기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.

상속을 통해서 클래스를 작성하면 코드를 공통적으로 관리할 수 있기 때문에, 코드의 추가 및 변경이 편하다. 코드의 재사용성을 높이고 코드의 중복을 제거할 수 있다.

 

 

* 상속 구현하는 법

새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 'extends'와 함께 쓸 것

class Child extends Parent{
}

Child 클래스와 Parent 클래스는 서로 상속 관계에 있다.

상속해주는 클래스'조상 클래스', 상속해주는 클래스'자손 클래스'라고 한다.

 

 

* 상속계층도(class hierarchy)

클래스 Parent와 클래스 Child의 다이어그램

자손 클래스는 조상 클래스의 모든 멤버를 상속받는다.

그러므로 Child 클래스는 Parent 클래스의 멤버들을 상속받는다.

클래스 parent.와 클래스 Child의 관계를 다이어그램으로 표현하면 위와 같다.

 

 

 

class Parent{
	int age;
}
class Child extends Parent{}

Parent 클래스에  age라는 정수형 변수를 추가하면 자손 클래스는 조상의 멤버를 모두 상속받기 때문에 Child 클래스는 자동적으로 age라는 멤버변수가 추가된 것과 같은 효과를 얻는다.

클래스 클래스의 멤버
 Parent age
Child age

 

 

 

class Parent{
	int age;
}

class Chld extends Parent{
	void play() {
    	System.out.println("Let's play together");
    }
}

아까와는 반대로 자손인 Child 클래스에 새로운 멤버로 play() 메서드를 추가했다.

Child 클래스에 새로운 코드가 추가되어도 조상인 Parent 클래스는 아무런 영향도 받지 않는다.

클래스 클래스의 멤버
Parent age
Child age, play()

 

조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받지만,

자손 클래스가 변경되는 것은 조상 클래스에 아무런 영향을 주지 않는다.

 

- 생성자와 초기화 블럭은 상속되지 않고, 멤버만 상속된다.

- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.

 

 

* 클래스 관계

- 포함 관계

한 클래스를 작성하는 데 다른 클래스를 멤버변수로 선언하여 포함시키는 것

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

Class Point {
    int x;
    int y;
}

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

원점과 반지름의 길이를 포함하는 Circle 클래스를 만들었다.

x, y 좌표를 Point 라는 클래스의 멤버변수로 선언하여 포함시키고, 다시 Circle 클래스를 만들면 간결하게 만들어진다.

 

 

- 관계 결정해주기 : 포함(has-a) or 상속(is-a)?

'~은 이다(is-a)'와 '~은 ~을 가지고 있다(has-a)' 문장을 이용해서 쉽게 판단하자.

-> 원(Circle)은 점(Point)이다. - Circle is a Point.

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

 

예시) SportsCar 클래스와 Car 클래스

'SportsCar'은 'Car'이다. 가 옳기 때문에, 이 경우는 Car 클래스를 조상으로 하는 상속관계가 옳다.

 

 

 

* 오버라이딩(overriding)

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것

 

- 오버라이딩의 조건

오버라이딩은 메서드의 내용만을 새로 작성하는 것이므로 메서드의 선언부는 조상의 것과 완전히 일치해야 한다.

자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 이름, 매개변수, 반환타입이 같아야 한다.

 

예외

접근 제어자(access modifier)와 예외(exception)는 제한된 조건 하에서만 다르게 변경할 수 있다.

1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

2. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

 

 

 

* 오버로딩 vs. 오버라이딩

- 오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것 (new)

- 오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것 (change, modify)

class Parent {
	void parentMethod() {}
}

class Child extends Parent {
	void parentMethod() {} // 오버라이딩
    void parentMethod(int i) {} // 오버로딩
    
    void childMethod() {}
    void childMethod(int i) {} // 오버로딩
}

 

 

728x90