728x90
상속(inheritance)
- 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것.
- 두 클래스를 조상과 자손으로 관계를 맺어주는 것.
- 자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화 블럭은 제외된다.)
- 자손의 멤버개수는 조상의 멤버개수보다 같거나 많다.
조상 클래스 - 부모 클래스, 상위 클래스, 기반 클래스
자손 클래스 - 자식 클래스, 하위 클래스, 파생된 클래스
class Point {
int x, int y;
}
class Point3D {
int x;
int y;
int z;
}
class Point3D extends Point {
int z;
}
class Point3D{
int z;
Point p = new Point();
p.x;
p.y
}
클래스간의 관계 - 상속관계
- 공통부분은 조상에서 관리하고 개별부분은 자손에서 관리한다.
- 조상의 변경은 자손에 영향을 미치치만, 자손의 변경은 조상에 아무런 영향을 끼치지 않는다.
클래스간의 관계 - 포함관계
- 한 클래스의 멤버변수로 다른 클래스를 선언하는 것
- 작은 단위의 클래스를 먼저 만들고 이들을 조합해서 하나의 커다란 클래스를 만든다.
class Point {
int x, y;
}
class Circle {
int x, y, r;
}
class Circle {
Point c = new Point(); //원점
int r; //반지름
}
클래스간의 관계를 결정 - 상속 vs 포함
- 가능한 많은 관계를 맺어주어 재사용을 높이고 관리하기 쉽게 한다.
- is-a관계와 has-a관계를 가지고 문장을 만들어 본다.
- 원(Circle)은 점(Point)이다. Circle is a Point.
- 원(Circle)은 점(Point)을 가지고 있다. Circle has a Point.
- 상속관계 : ~은 ~이다.(is - a)
- 포함관계 : ~은 ~를 가지고 있다.(has - a)
class Circle extends Point {
int r;
}
class Circle {
Point c = new Point();
int r;
}
단일상속
- 자바에서는 단일 상속만 허용된다.
오버라이딩(Overriding)
- 조상 클래스로부터 상속받은 메서드의 내용을 상속받는 클래스의 맞게 변경하는 것을 말한다.
class Point {
int x; int y;
String getLocation() {
return "x : " + x + ", y : " + y;
}
}
class Point3D extends Point {
int z;
String getLocation() { //오버라이딩
return "x : " + x + ", y : " + y + ", z : " + z;
}
}
오버라이딩의 조건
- 선언부가 같아야 한다.(이름, 매개변수, 리턴타입)
- 접근제어자를 좁은 범위로 변경할 수 없다. (조상의 메서드가 protected라면 범위가 같거나 넓은 protected나 public으로만 변경할 수 있다.)
- 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
오버로딩 vs 오버라이딩
- 오버로딩 - 기존에 없는 새로운 메서드를 정의하는 것(new)
- 오버라이딩 - 상속받은 메서드의 내용을 변경하는 것(change)
class Parent {
void parentMethod();
}
class Child extends Parent {
void parentMethod() {} //Overriding
void parentMethod(int i) {} //Overloading
void childMethod() {} //새로운 메서드
void childMethod(int i) {} //Overloading
void childMethod() {} //Error => 중복정의
}
super - 참조변수
this
- 인스턴스 자신을 가리키는 참조변수
- 인스턴스의 주소가 저장되어 있다.
- 모든 인스턴스 메서드에 지역변수로 숨겨진채로 존재한다.
super - this와 같다.
- 조상의 멤버와 자신의 멤버를 구별하는데 사용한다.
- 자손클래스의 인스턴스를 생성하면 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
- 조상의 멤버들도 초기화되어야하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.
- Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에는 생성자(같은클래스의 다른 생성자 또는 조상의 생성자를 호출해야 한다.) 그렇지 않으면 컴파일러가 자동적으로 super();를 생성자의 첫 줄에 만들어준다.
'Language > Java' 카테고리의 다른 글
[Java] 실습 (여러 종류의 객체를 하나의 배열로 사용하기) (0) | 2022.08.16 |
---|---|
[Java] 실습 (get, set) (0) | 2022.08.12 |
[Java] 실습 (단일 상속) (0) | 2022.08.12 |
[Java] 실습 (this, super) (0) | 2022.08.12 |
[Java] 실습 (Overriding Overloading) (0) | 2022.08.12 |