반응형
상속 (Inheritance)
기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
class Parent { ... }
class Child extends Parent { ... }
Parent : 조상 클래스 (부모 parent, 상위 super, 기반 base 클래스)
Child : 자손 클래스 (자식 child, 하위 sub, 파생된 derived 클래스)
- 생성자와 초기화 블럭은 상속되지 않고 멤버만 상속된다.
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
포함관계 (Composite)
한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것
class Circle{
Point c = new Point();
// int x;
// int y;
int r;
}
class Point{
int x;
int y;
}
상속관계
class Circle extends Point{
int r;
}
class Point{
int x;
int y;
}
포함관계 | ~은 ~을 가지고 있다. (has-a) |
상속관계 | ~은 ~이다. (is-a) |
단일 상속 (Single Inheritance)
Java 는 다중 상속을 허용하지 않는다.
class TV { ... }
class VCR {
void play() { ... }
void stop() { ... }
}
class TVCR extends TV {
VCR vcr = new VCR();
void play(){
vcr.play();
}
void stop(){
vcr.stop();
}
}
TV 클래스를 조상으로 하고, VCR 클래스를 TVCR 클래스에 포함시킨 코드
Object 클래스
모든 클래스 상속계층도의 최상위에 있는 조상 클래스이다.
오버라이딩 (Overriding)
조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
조건
자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 이름, 매개변수, 반환타입이 같아야한다. ( = 선언부가 일치해야 한다.)
단, 접근 제어자와 예외는 제한된 조건 하에서 다르게 변경 가능하다.
- 접근 제어자 - 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외 - 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
- 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.
오버로딩 vs 오버라이딩
오버로딩 | 기존에 없는 새로운 메서드를 정의하는 것 (new) |
오버라이딩 | 상속받은 메서드의 내용을 변경하는 것 (change, modify) |
super
자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수
(멤버변수와 지역변수의 이름이 같을 때 this 로 구별했듯이 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름을 구별)
class superTest{
public static void main(String[] args) {
Child1 c = new Child1();
Child2 d = new Child2();
c.method();
d.method();
}
}
class Parent{
int x = 10;
}
class Child1 extends Parent{
void method(){
System.out.println("x=" + x);
System.out.println("this.x=" + this.x);
System.out.println("super.x=" + super.x);
}
}
class Child2 extends Parent{
int x = 20;
void method(){
System.out.println("x=" + x);
System.out.println("this.x=" + this.x);
System.out.println("super.x=" + super.x);
}
}
// 출력
// x=10
// this.x=10
// super.x=10
// x=20
// this.x=20
// super.x=10
조상 클래스의 메서드를 자손 클래스에서 오버라이딩한 경우 메서드에도 super 를 붙여준다.
후에 조상 클래스의 메서드가 변경되더라도 변경된 내용이 자손 클래스의 메서드에 자동 반영된다.
super()
조상 클래스의 생성자를 호출하는데 사용
class PointTest{
public static void main(String[] args) {
Point3D p3 = new Point3D(1,2,3);
}
}
class Point{
int x;
int y;
// 해결방법 2
// Point(){
// } 추가
Point(int x, int y){
this.x = x;
this.y = y;
}
}
class Point3D extends Point{
int z;
Point3D(int x, int y, int z){
// 컴파일 에러 발생
// 생성자 첫 줄에 생성자를 호출하지 않았기 때문에 super(); 가 디폴트로 들어가지만
// Point 클래스에는 Point() 가 없으므로 에러 발생
// 해결방법 1
// super(x, y); 추가 - 조상 클래스의 생성자 호출
this.x = x;
this.y = y;
this.z = z;
}
}
실행 순서
Point3D() → Point3D(int x, int y, int z) → Point(int x, int y) → Object()
조상 클래스의 멤버 변수는 조상의 생성자에 의해 초기화되도록 해야 한다.
반응형
'개발 ━━━━━ > Java' 카테고리의 다른 글
[Java] String <-> Int 형변환 (0) | 2023.08.25 |
---|---|
[Java/Algorithm] List 오름차순 (0) | 2023.08.24 |
[Java] 객체 지향 - 클래스, 인스턴스, 생성자 (0) | 2023.08.19 |
[Java] 기초 문법 - 컬렉션 (Collection) (0) | 2023.08.16 |
[Java] 기초 문법 - 배열 (0) | 2023.08.16 |