상속(Inheritance)
- 기존의 클래스로 새로운 클래스를 작성하는 것 (코드의 재사용)
- 두 클래스를 부모와 자식으로 관계를 맺어주는 것
class Parent{}
class Child extends Parent{
...
}
- 자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외)
- 자손의 멤버 개수는 조상보다 적을 수 없다(같거나 많다)
- 자손의 변경은 조상에 영향을 미치지 않는다.
포함 관계
- composite(포함): 클래스의 멤버로 참조변수를 선언하는 것
- 상속관계 '~은 ~이다.(is-a)'
- 포함관계 '~은 ~을 가지고 있다.(has-a)' ->대부분 포함관계를 씀
class MyPoint{
int x;
int y;
}
//class Circle extends MyPoint { //상속
// int r;
//}
class Circle {
MyPoint p = new MyPoint();
int r;
}
public class InheritanceTest {
public static void main(String[] args) {
Circle c = new Circle();
c.p.x =1;
c.p.y =2;
c.r = 3;
System.out.println("c.p.x="+c.p.x);
System.out.println("c.p.y="+c.p.y);
System.out.println("c.r="+c.r);
}
}
단일 상속(Single Inheritance)
- Java는 단일 상속만을 허용한다.
- 조상은 하나만!
- 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
Object클래스 - 모든 클래스의 조상
- 부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.
- 모든 클래스는 Object에 정의된 11개의 메서드를 상속받는다 (toString(), equals(), hashCode(),...)
public class InheritanceTest {
public static void main(String[] args) {
Circle c = new Circle();
System.out.println(c.toString()); //Circle@340f438e
Circle c2 = new Circle();
System.out.println(c2.toString()); //Circle@30c7da1e
}
}
- toString()을 안써도 똑같이 출력된다.
- println()의 기능
오버라이딩(overriding)
- 상속받은 조상의 메서드를 자신에 맞게 변경하는 것
- 선언부는 변경 불가, 내용만 변경가능
class Point {
int x;
int y;
String getLocation(){
return "x: "+ x + ", y:" +y;
}
}
class MyPoint3 extends Point {
int z;
//조상의 getLocation()을 오버라이딩
String getLocation(){
return "x: "+ x + ", y:" +y+" ,z:"+z;
}
}
public class OverrideTest {
public static void main(String[] args) {
MyPoint3 p = new MyPoint3();
p.x = 3;
p.y =5;
p.z =7;
System.out.println(p.getLocation());
}
}
오버라이딩의 조건
- 선언부가 조상 클래스의 메서드와 일치해야 한다.
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
오버로딩 vs 오버라이딩
근본적으로 관계 없음
overloading : 기존에 없는 새로운 메서드를 정의하는 것 (new)
overriding: 상속받은 메서드의 내용을 변경하는 것
참조변수 super
- 객체 자신을 가리키는 참조변수, 인스턴스 메서드(생성자)내에만 존재
- 조상의 멤버를 자신의 멤버와 구별할 때 사용
super() - 조상의 생성자
- 조상의 생성자를 호출할 때 사용
- 조상의 멤버는 조상의 생성자를 호출해서 초기화
- 클래스 이름 대신 super를 사용
- 생성자의 첫 줄에 반드시 생성자를 호출해야 한다.
- 그렇지 않으면 생성자의 첫 줄에 super();를 삽입한다.(조상의 기본 생성자)
'Java > 자바의 정석' 카테고리의 다른 글
남궁성 자바의 정석 기초편 ch 7 접근 제어자 캡슐화 다형성 참조변수의 형변환 (0) | 2022.11.26 |
---|---|
남궁성 자바의 정석 기초편 ch 7 패키지 클래스 import문 제어자 static final abstract (0) | 2022.11.26 |
남궁성 자바의 정석 기초편 ch 6 오버로딩 생성자 초기화 (0) | 2022.11.22 |
남궁성 자바의 정석 기초편 ch 6 return문 호출스택 매개변수 static 메서드 인스턴스 메서드 (0) | 2022.11.21 |
남궁성 자바의 정석 기초편 ch 6 객체지향 언어 클래스 (0) | 2022.11.21 |