티스토리 뷰

반응형

1. super

  • 부모클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 참조변수이다.
  • 부모 클래스의 멤버와 자식클래스의 멤버 이름이 같을 경우 super를 통해 부모 클래스의 멤버에 접근 할 수 있다.
  • 인스턴스 메소드에만 사용 가능하며 클래스 메소드에는 사용할 수 없다.
class Parent {
    int num = 5;
}

 

class Child extends Parent {
    int num = 10;
    void print() {
        System.out.println(num);	//10	
        System.out.println(this.num);	//10
        System.out.println(super.num);	//5
    }
}

 

public class Ex01 {
    public static void main(String[] args) {
        Child a = new Child();
        a.print();
    }
}

 

 

 

2. super()

  • super()는 부모 클래스의 생성자를 호출할 때 사용한다.
  • 자식 클래스의 인스턴스를 생성하면 부모클래스의 모든 멤버까지 포함되어 있어서 부모 클래스의 멤버를 초기화하기 위해서 부모클래스의 생성자를 자식클래스의 생성자 첫줄에서 호출해야 한다.
  • 이러한 호출은 Object 클래스의 생성자까지 거슬러 올라가며 수행된다.
  • 자바 컴파일러는 부모 클래스의 생성자를 명시적으로 호출하지 않은 자식 클래스의 생성자 첫 줄에 자동으로 super()를 추가하여 부모클래스의 멤버를 초기화하도록 한다.
  • 단 컴파일 시 클래스에 생성자가 하나도 정의되어 있지 않아야 자동으로 기본 생성자를 추가해준다.
class Parent {
    int num;
    public Parent() { 
    	num = 5; 
    }
    public Parent(int n) { 
    	num = n; 
   }
}

 

class Child extends Parent {
    int a;
    public Child(int x) {
      super(x);	//첫줄에 와야함
      a = 20;
    }

    public void print() {
        System.out.println(num);	//30
        System.out.println(a);	//20
    }

}

 

public class Ex02 {

    public static void main(String[] args) {

        Child ch = new Child(30);
        ch.print();
    }
}

super()를 이용하여 부모클래스의 생성자 호출

 

 

 

 

this, this(), suepr, super()

 

  • this와 super는 모드 레퍼런스로 this현재 객체의 모든 멤버를,
    super는 현재 객체 내에 있는 부모 클래스 멤버를 접근할 수 있다.
this.객체내의멤버
super.객체내의슈퍼클래스의멤버

 

  • super로 메소드를 호출하면 정적바인딩을 실행한다.
  • this()와 super()는 모드 메소드 호출이며 this()생성자에서 다른 생성자를 호출할때 사용하고,
    super()자식클래스의 생성자에서 부모클래스의 생성자를 호출할 때 사용한다.

 

 

 

 

3. 메소드 오버라이딩(method overriding)

  • 부모클래스에서 선언된 메소드와 같은이름, 같은 리턴타입, 같은 매개 변수 리스트를 갖는 메소드를 자식클래스에서 재작성하는 것이다.
  • 즉, 메소드 오버라이딩은 상속받은 부모클래스의 메소드를 재정의하여 사용하는 것을 의미한다.
  • 메소드 오버라이딩은 '부모클래스 메소드 무시하기' 혹은 '부모클래스 메소드 덮어쓰기'로 표현할 수 있다.

 

class Parent {

	public void print() {
		System.out.println("부모 클래스의 print() 메소드입니다.");
	}

}

class Child extends Parent {

	public void print() {	//메소드오버라이딩
		System.out.println("자식 클래스의 print() 메소드입니다.");
	}

}

public class Ex01 {

	public static void main(String[] args) {

		Parent papa = new Parent();
		papa.print();

		Child a = new Child();
		a.print();

		Parent b = new Child();	//업캐스팅
		b.print();	//동적바인딩

	}

}

메소드오버라이딩 실행결과

 

 

  • Child클래스에서 Parent 클래스의 print()를 오버라이딩하였다.
  • 어떤 경우이든 자바에서 오버라이딩된 메소드가 있다면 동적 바인딩을 통해 오버라이딩된 메소드가 무조건 실행된다.

 

 

 

 

오버라이딩 조건

 

  • 부모클래스의 메소드와 동일한 이름, 동일한 매개변수 타입과 개수, 동일한 리턴 타입을 갖는 메소드를 작성해야한다.
  • 부모클래스 메소드의 접근지정자보다 접근의 범위를 좁여 오버라이딩할 수 없다.
    • 접근지정자는 public, protected, default, private 순으로 접근의 범위가 좁아진다.
    • 부모클래스에 protected로 선언된 메소드는 자식클래스에서 protected나 public으로만 오버라이딩할 수 있다.
    • 부모클래스에 public으로 선언도니 메소드는 자식클래스에서 public으로만 오버라이딩할 수 있다.
    • static이나 private 또는 final로 선언된 메소드는 자식클래스에서 오버라이딩할 수 없다.

 

 

 

 

오버라이딩 vs 오버로딩

 

비교 요소 메소드 오버라이딩 메소드 오버로딩
선언 자식클래스에서 부모클래스에 있는 메소드와 동일한 이름의 메소드 재작성 같은 클래스나 상속 관계에서 동일한 이름의 메소드 중복 작성
관계 상속관계 동일한 클래스 내 혹은 상속관계
목적 부모클래스에 구현된 메소드를 무시하고 자식클래스에서 새로운 기능의 메소드를 재정의하고자함 이름이 같은 여러개의 메소드를 중복 작성하여 사용의 편리성 향상
조건 메소드 이름, 매개변수 타입과 개수, 리턴 타입이 모두 동일 메소드 이름은 반드시 동일
매개변수 타입이나 개수가 달라야 성립
바인딩 동적 바인딩
실행 시간에 오버라이딩된 메소드를 찾아 호출
정적 바인딩
호출될 메소드는 컴파일 시에 결정

 

 

반응형
댓글
반응형
공지사항