오버라이딩

young·2022년 12월 29일
0

1. 오버라이딩(=메서드 오버라이딩)

  • 부모클래스로부터 상속받은 메서드의 내용을 변경하는 것
ex)
class Point {
	int x;
    int y;
    
    String getLocation() { // getLocation이라는 메서드가 문자열로 반환
    	return "x : " + x + "y : " + y;
    }
}
class Point3D extends Point {
	int z;
    
    String getLocation() {
    	return "x : " + x + "y : " + y + "z : " + z;
        // 부모클래스 메서드 내용을 고친 것 = 오버라이딩(z를 포함)
        //   - 선언문은 바꿀 수 없고, 내용(구현부)만 변경 가능
    }
}

2. 오버라이딩 조건

  1. 선언부가 부모클래스의 메서드와 일치해야 함(이름, 매개변수, 반환타입)
  2. 접근 제어자는 부모클래스의 메서드보다 좁은 범위로 변경할 수 없음
    • ex ) 부모의 접근 제어자가 protected일 경우, 오버라이딩하는 자식클래스의 메서드는 접근 제어자가 protected나 public이어야 함
    • 접근 제어자의 접근범위 : public > protected > (default) > private
  3. 부모클래스의 메서드보다 많은 수의 예외를 선언할 수 없음(같거나 적어야 함)
ex)
class Parent {
	void parentMethod () throws IOException, SQLException { // 메서드의 개수가 2개(IOException, SQLException)
    	...
    }
}
class Child extends Parent {
	void parentMethod () throws IOException { // 메서드의 개수가 1개(IOException)
		...
	}
}

3. 오버로딩 vs 오버라이딩

  • 오버로딩 : 기존에 없는 새로운 메서드를 정의(이름이 같을 뿐 새로운 메서드 정의)
  • 오버라이딩 : 상속받은 메서드의 내용을 변경하는 것(기존의 것을 변경)
ex)
class Parent {
	void parentMethod() {}
}
class Child extends Parent {
	void parentMethod() {} // 오버라이딩
	void parentMethod(int i) {} // 오버로딩(같은 메서드를 매개변수만 다르게해서 정의)
    
    void childMethod() {} // 메서드 정의
    void childMethod(int i) {} // 오버로딩
    void childMethod() {} // 에러. 중복정의
}

4. super

  • 자식클래스에서 부모클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수
  • 부모의 멤버와 자신의 멤버를 구별하는데 사용됨
  • this와 마찬가지로 static메서드에서는 사용 불가하고, 인스턴스메서드에서만 사용 가능
ex)
class SuperTest2 {
	public static void main(String args[]) {
    	Child c = new Child();
        c.method();
    }
}
class Parent {
	int x = 10;
}
class Child extends Parend {
	int x = 20;
    
    void method() {
    	System.out.println("x = " + x);
    	System.out.println("this.x = " + this.x);
    	System.out.println("super.x = " + super.x);
        // 자식클래스에서 부모클래스로부터 상속받은 멤버를 참조하기 때문에 부모클래스의 x를 출력
    }
}

5. super()

  • 부모클래스의 생성자를 호출하는데 사용
  • Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자,this() 또는 super()를 호출해야 함
profile
🐿 개발중...

0개의 댓글