자바의 정석 책과 멋쟁이 사자처럼에서 공부한 내용을 정리한 내용입니다.
상속
이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
그럼 왜 상속
이 좋은가? 상속을 받아서 클래스를 작성하면 코드의 양이 줄어들고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 용이해 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.
그럼 상속은 어떻게 쓰는건가? 사용 방법은 간단하다. extends
키워드를 사용하면 된다.
class Child extends Parent{
}
c++ 에서는 여러 조상 클래스로부터 상속을 받는다고 한다. 하지만 자바에서는 단일 상속만을 허용한다. 그래서 하나 이상의 클래스로부터 상속을 받을 수 없다.
다중상속을 허용하면 여러 클래스로부터 상속받을 수 있기 때문에 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있는 장점이 있지만 클래스간의 관계가 매우 복잡해진다는 것과 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 수 있는 방법이 없다는 단점이 있습니다.
자바에서는 이러한 다중상속의 단점을 해결하기 위해 다중상속의 장점을 포기하고 단일상속만을 허용합니다.
쉽게 부모 클래스
에서 메서드를 물려받으면 메서드의 내용을 자식 클래스
에서 변경하는 것을 말한다.
자손 클래스에서 오버라이딩하는 메서드는 조상 클래스와 메서드와
이 부분은 오버로딩
부분에서 정리를 했지만 간단하게 다시 정리를 하자면
오버로딩
은 만든다, 오버라이딩
은 변경한다. 이렇게 생각해봅시다.
super
는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다.멤버변수와 지역변수의 이름이 같을 때 this
를 붙혀 구별을 했듯이 상속받은 멤버와 자식의 클래스에 저으이된 멤버의 이름이 같을 때는 super
를 이용해 구별한다.
예제를 보면 바로 이해가 될 것입니다.
public class MainClass {
public static void main(String[] args) {
Child c = new Child();
c.method();
}
}
class Parent{
int x=10;
}
class Child extends Parent{
int x=20;
void method() {
System.out.println("x="+x);//Child의 멤버변수 x의 20이 출력됨
System.out.println("this.x="+this.x);//Child에 선언된 멤버변수가 출력됨
System.out.println("super.x="+super.x);//Parent에서의 멤버변수 x의 10이 출력됨
}
}
이 예제를 통해 x, this, super
가 서로 다른 값을 참조하는 것을 알 수 있었습니다.
ㄴ
this()
는 같은 클래스의 다른 생성자를 호출하는 데 사용되지만, super()
는 조상 클래스의 생성자를 호출하는데 사용된다.