// 부모클래스
class Hello{
public void say() {
System.out.println("Hello");
}
}
// 자식
class English extends Hello{
}
// 자식
class Korean extends Hello{
public void say() {
System.out.println("안녕하세요.");
}
}
public class Main01 {
public static void main(String[] args) {
English e = new English();
// 자식 클래스에 구현된 메서드가 없기 때문에,
// 부모 클래스에 정의된 메서드를 찾아가게 된다.
e.say();
// 자식클래스가 부모와 같은 이름의 메서드를 정의하고 있기 때문에
// k객체에게는 부모 클래스가 정의하고 있는 say()메서드가
// 가려지게 된다.
Korean k = new Korean();
k.say();
}
}
* 부모 클래스 값도 호출하고 자식 클래스 값도 호출하고 싶을 때
-> Super 사용
result
Hello
안녕하세요.
클래스의 상속 관계에서 자식 클래스가 부모 클래스를 가리키는 예약어
사용방법
멤버변수 이름 앞에 명시
: 부모 클래스의 멤버변수를 의미한다. 하지만 부모 클래스의 멤버변수는 이미 모두 상속되어 있기 때문에 이 경우에는 this키워드를 사용하는 것과 동일한 결과이기에 잘 사용하지 않는다.
메서드 이름 앞에 명시
: 부모 클래스의 메서드를 의미한다
: 재정의(Override) 되지 않은 메서드
- 이미 상속되어 있기 때문에 this 키워드를 사용하는 것과 동일한 결과를 갖는다.
: 재정의(Override) 된 메서드
- Override 된 메서드 이름 앞에 사용하게 되면 재정의되기 이전의 원본 메서드를 의미한다.
class HelloP{
/*
* 자식 클래스에서 이 메서드를 재정의 하였기 때문에,
* Korean 클래스의 객체는 이 기능에 접근하지 못한다.
*/
public void say() {
System.out.println("Hello!!!!!~~~~~~");
}
}
class KoreanC extends HelloP{
/*
* Korean 클래스가 say()메서드를 Override 처리하게 되면
* Korean 클래스의 객체는 더 이상 부모의 say() 메서드에
* 접근할 수 없게 된다.
*/
public void say() {
/*
* 원본 기능에 대한 수정이 발생 할 경우 부모 클래스와 자식 클래스를
* 모두 수정해야 하기 때문에 소스코드의 유지보수 효율성이 떨어지게 된다.
*/
//System.out.println("Hello!!!!!");
/*
* - super 키워드는 부모 클래스의 메서드를 호출하는 기능을 가지고 있기 때문에
* Override 된 자식 클래스의 메서드에서 super 키워드를 사용하면,
* 재정의 되기 이전의 부모 클래스에 대한 메서드를 호출할 수 있다.
*
* - super 키워드를 사용하여 부모의 메서드를 호출한 뒤에 추가적인 기능을
* 정의하고 있으므로, 부모의 원본 메서드에 대한 기능 확장 효과가 있다.
*/
super.say();
System.out.println("안녕하세요.");
}
}
public class Main02 {
public static void main(String[] args) {
KoreanC k = new KoreanC();
k.say();
}
}
result
Hello!!!!!~~~~~~
안녕하세요.
class Hello3{
public Hello3( String msg ) {
System.out.println(msg);
}
}
class Korean3 extends Hello3 {
/*
* 부모와 동일한 파라미터를 받도록 생성자를 정의하고,
* 전달받은 파라미터를 부모에게 재전달 한다.
*/
public Korean3( String msg ) {
super( msg );
}
}
public class Main03 {
public static void main(String[] args) {
}
}
// 부모
class PClass1{
public PClass1() {
System.out.println("부모 생성자 호출");
}
}
// 자식
class CClass1 extends PClass1{
public CClass1() {
super();
System.out.println("자식 생성자 호출");
}
}
public class Main04 {
public static void main(String[] args) {
CClass1 cClass = new CClass1();
}
}
* 기본 생성자
result
부모 생성자 호출
자식 생성자 호출
// 부모
class PClass2{
public PClass2( String str ) {
System.out.println("부모 생성자 호출 : " + str);
}
}
// 자식
class CClass2 extends PClass2{
public CClass2( String str ) {
// super("부모 생성자");
super(str);
System.out.println("자식 생성자 호출");
}
}
/*
* - 부모클래스의 생성자는 상속되지 않고, 자식 클래스로 객체를 생성할 때
* 자동적으로 부모의 기본 생성자로 호출
* - 부모 생성자가 매개변수를 갖고 있다면 자식 클래스를 객체화 할때 자동으로
* 호출되지 않는다.
* - 따라서 자식 생성자에서 명시적으로 부모 생성자를 호출해야 한다.
* 이때 사용되는 키워드가 super()이다. 단, super()를 사용할때
* 자식 생성자의 첫 줄에 위치해야 한다.
*/
public class Main05 {
public static void main(String[] args) {
CClass2 cClass2 = new CClass2("부모 생성자");
}
}
* 파라미터를 갖는 생성자
result
부모 생성자 호출 : 부모 생성자
자식 생성자 호출