상속은 캡슐화, 추상화와 더불어
객체 지향 프로그래밍
을 구성하는 중요한 특징 중 하나로 상위 클래스의 맴버변수와 메서드를 하위클래스가 물려받는 기술을 의미한다.
자바에서 상속을 구현할 때는 extends
예약어를 사용한다.
포함관계
: 포함관계는 상속과 같은 방식으로 관계를 맺는 게 아닌 클래스 내에서 다른 클래스의 인스턴스를 생성하면 포함 관계라고 볼 수 있다. 쉽게 말해 한 클래스의 맴버로 참조변수를 선언하는 것class Circle {
int x;
int y;
int r;
}
class Circle {
Point c = new Point();
int r;
}
circle
이Point
를 포함하고 있다.
상속관계
: '~은 ~이다'
포함관계
: '~은 ~을 가지고 있다.'
단일상속 : 하나의 부모 클래스로부터의 단일 상속
을 받는것을 일컫는다. 둘 이상의 부모 클래스로부터 상속을 받을 수 없다.
class TvDVD extends Tv, DVD {
//이럴경우에는 에러가 난다
// C++은 다중상속 허용
}
자바는 다중 상속이 아닌 단일상속만 허용한다.
그 이유는 이름이 같은 메서드 호출 시에 충돌이 일어날 수 있기 때문이다.
그렇기 때문에 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다
나중에 인터페이스에서 이러한 충돌문제를 해결할 수 있다고 한다 . 이 부분은 인터페이스 공부할때 정리해봐야지
모든 클래스의 조상
부모가 없는 클래스는 자동적으로 object 클래스를 상속받게 된다.
object에 정의된 메서드는 총 11개가 있으며 equals(), hashCode(), toString() 등이 있다.
Object c = new Object();
System.out.println(c);
System.out.println(c.toString);
// 실행결과는 같다.
상속받은 조상의 메서드를 재정의하는 것
class point {
int x;
int y;
String getLocation()
return "x : " + x + ", y : " + y;
}
}
class Point3D extends Point {
int z;
//조상의 getLocation()을 오버라이딩
String getLocation() {
return "x : " + x + " , y : " + y + ", z : " + z;
}
}
오버라이딩
이란 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존 메소드와 완전히 같아야한다. (단, 메소드의 반환 타입은 부모 클래스의 반환 타입으로 변환할 수 있는 타입이라면 변경할 수 있다.)오버로딩과 오버라이딩
class Parent {
void parentMethod() {}
}
class Child extends Parent {
void parentMethod() {} // 오버라이딩
void perentMethod(int i ) {} //오버로딩
void childMethod() {} // 메서드 정의
void childMethod(int i ) {} // 오버로딩
본 게시글은 자바의 정석을 참고하여 작성하였습니다.
https://github.com/castello/javajungsuk_basic