상속
1. 상속의 정의와 장점
상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
상속을 통해서 클래스를 작성하면
- 보다 적은 양의 코드로 새로운 클래스를 작성 할 수 있음
- 코드를 공통적으로 관리할 수 있음
- 코드의 추가 및 변경이 용이함
- 코드의 재사용성을 높이고, 중복을 제거하여 생산성과 유지보수에 기여
상속은 구현하는 방법
새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 extends와 함께 써주면 됨
class child extentd Parent {
//...
}
상속해주는 클래스는 '부모' 상속 받는 클래스를 '자식' 이라고 함
자식 클래스의 코드가 수정되어도 부모 클래스는 아무런 영향도 받지 않지만,
부모 클래스의 코드가 수정되면 자식 클래스는 자동적으로 영향을 받는다.
자식 클래스는 부모 클래스의 모든 멤버를 상속받기 때문에 항상 부모와 같거나 많은 멤버를 갖는다.
따라서 상속에 상속을 거듭할수록 상속받는 클래스의 멤버 개수는 점점 늘어나게 된다.
그래서 상속을 받는다는 것은 부모 그래스를 확장(extends)한다는 의미로 해석할 수도 있으며 이것이 상속에 사용되는 키워드가 'extends'인 이유기도 하다
2. 클래스간의 관계 - 포함관계
상속이외에도 클래스를 재사용하는 또 다른 방법은 클래스간에 포함관계(Composite)를 맺어주는 것이다.
클래스 간의 포함관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조 변수를 선언하는 것을 뜻한다.
class Circle {
int x;
int y;
int r;
}
class Point {
int x;
int y;
}
다음과 같이 Circle 클래스와 Point 클래스가 있다고 할 때
class Circle {
Point c = new Point();
int r;
}
다음과 같이 Point클래스를 재사용해서 코드를 작성할 수 있다.
이처럼 하나의 거대한 클래스를 작성하는 것 보다 단위별로 여러 개의 클래스를 작성한 다음, 이 단위 클래스들을 포함관계로 재사용하면 보다 간결하고 손쉽게 클래스를 작성할 수 있다
작성된 단위 클래스들은 다른 클래스를 작성하는데 재사용될 수 있다
3. 클래스간의 관계 결정하기
class Circle {
Point c = new Point();
int r;
}
class Circle extends Point {
int r;
}
두 경우를 비교해 보면 Circle 클래스를 작성하는데 있어서 Point 클래스를 포함시키거나 상속받도록 하는 것은 결과적으로 별 차이가 없어보인다.
~는 ~이다 => 상속
~는 ~를 가지고있다 => 포함
Point p = new Point(150,150);
Circle c = new Circle(p, 50);
다음 코드를 아래와 같이 하나로 쓸 수 있다
Circle c = new circle(new Point(150,150) 50);
복잡한 코드를 만났을 때는 여러 문장으로 분해해서 이해하기!
4 단일 상속
자바는 오직 단일 상속만을 허용한다.
즉, 둘 이상의 클래스로부터 상속 받을 수 없다.
extends 뒤에 하나만 입력 가능!
5. Object 클래스 - 모든 클래스의 조상
Object 클래스는 모든 클래스 상속 계층도의 최상위에 있는 부모 클래스
다른 클래스로 부터 상속 받지않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 된다
class TV {
...
}
다음 코드를 컴파일 하면 컴파일러는 자동적으로 extends Object를 추가하여
class TV extends Object {
...
}
Tv 클래스가 Object 클래스로부터 상속받도록 한다.
모든 상속 계층도의 최상위에는 Object 클래스가 위치하며, 자바의 모든 클래스들은 Object 클래스의 멤버들을 상속 받기 때문에 Object 클래스에 정의 된 멤버들을 사용할 수 있다.
출처 - Java의 정석
'Language > Java' 카테고리의 다른 글
[Java] 객체지향 프로그래밍 - package와 import (0) | 2024.04.05 |
---|---|
[Java] 객체지향 프로그래밍 - 오버라이딩(overriding) (0) | 2024.04.05 |
[Java] JsonArry 형태의 문자열을 List<VO>객체로 변환하기 (0) | 2023.10.12 |
[Java] Optional이란? (0) | 2023.09.04 |
[JAVA] 자바11 설치 / 환경변수 설정 (Window11) (2) | 2023.07.31 |