728x90
Overriding 과 super
- 부모 클래스로부터 상속받은 메서드의 내용을 재정의(변경) 하는 것
조건
- 오버라이딩은 메서드를 새로 만드는게 아니고 내용만 새로 작성하는 것
- 알맹이만 변경한다.
- 메소드 시그니처 일치
오버라이딩하는 메소드는 슈퍼 클래스에서 선언된 메소드와 동일한 이름, 매개변수 목록 및 반환 유형을 가져야함. 메소드 시그니처가 일치해야만 실제로 메소드가 오버라이딩 되는 것으로 간주함. - 접근 제한자
오바리이딩 하는 메소드는 원본 메소드보다 더 제한적인 접근 제한자를 가질 수 없음
ex) 슈퍼 클래스의 메소드가protected
로 선언되었다면, 서브 클래스의 메소드는protected
또는public
이여야함. - 반환타입
자바 5 이상에서는 오버라이딩된 메소드의 반환 타입이 원본 메소드의 반환 타입의 서브타입일 수 있음.(공변 반환 타입)
ex) 슈퍼 클래스의 메소드가Number
타입을 반환한다면, 서브 클래스 메소드는Integer
와 같은Number
의 서브 클래스를 반환할 수 있음. - 예외
오버라이딩하는 메소드는 원본 메소드가 선언한 예외보다 더 일반적인 예외를 던질 수 없음. 또한 체크된 예외를 던지는 경우, 오버라이딩하는 메소드가 던질 수 있는 예외는 원본 메소드가 던질 수 있는 예외들의 서브 타입이거나 동일한 예외여야함.
ex) 슈퍼 클래스의 메소드가NullPointer
를 던진다면, 오버라이딩하는 메소드는NullPointer
또는NullPointer
의 하위 Exception 을 던질 수 있음.
서브 클래스의 메소드가RuntimeException
을 던지면 안됨. static
메소드는 오버라이딩 불가
정적 메소드는 오버라이딩 되지 않음. 서브 클래스에서 같은 시그니처의 정적 메소드를 선언하면, 이는 메소드 숨김(Hiding) 현상이 발생함.final
메소드는 오버라이딩 불가final
로 선언된 메소드는 오버라이딩 할 수 없음. 이러한 메소드는 변경을 허용하지 않는 최종적인 구현을 가짐.- 스레드 안전과 동기화
오버라이딩하는 메소드가 원본 메소드가 스레드 안전인지 또는 동기화되어 있는지에 따라, 서브 클래스에서도 동일한 특성을 유지해야할 수도 있음.
필수적인 규칙은 아니지만 프로그램의 일관성과 안정성을 위해 고려해야함.
super
스-파
super
는 자식 클래스에서 부모 클래스의 멤버(변수,메소드) 에 접근하거나, 부모 클래스의 생성자를 호출할 때 사용됨.
주요 사용방법
- 부모 클래스의 생성자 호출
super()
는 자식 클래스의 생성자에서 사용되며, 부모 클래스의 생성자를 호출함. 이 호출은 자식 클래스의 생성자 내에서 가장 먼저 이루어져야 함. 부모 클래스에 매개변수가 필요한 생성자만 있는 경우,super
를 사용하여 필요한 값들을 전달해야함.
public class Parent {
public Parent(String name) {
System.out.println("Parent Constructor: "+name);
}
}
...
public class Child extends Parent {
public Child() {
super("Hello"); // 부모 클래스 생성자 호출
System.out.println("Child Constructor");
}
}
- 부모 클래스의 메소드 호출
자식 클래스에서는super
키워드를 사용하여 부모 클래스에서 정의된 메소드에 접근할 수 있음. 특히 메소드 오버라이딩 상황에서 유용하며, 오버라이딩 된 메소드에서 원본 메소드의 기능을 확장하거나 재사용할 때 사용됨.
public class Parent {
public void display() {
System.out.println("Parent display()");
}
}
public class Child extends Parent{
public void display() {
super.display();
System.out.println("Child display()");
}
}
- 부모 클래스의 필드 접근
자식 클래스에서super
를 사용하여 부모 클래스의 필드(멤버 변수)에 접근할 수 있음. ▶️ 변수 이름이 중복될 때 유용함.
public class Parent {
protected int number = 100;
}
...
public class Child extends Parent {
private int number = 200;
public void showNumber() {
System.out.println(super.number);
System.out.println(this.number);
}
}
Overloading
Overloading 이란?
- 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
조건
- 메소드 이름 통일
오버로딩된 메소드들은 모두 같은 이름을 가져야함. - 매개변수 목록이 달라야함
메소드를 오버로딩할 때는 매개변수의 수, 타입 또는 순서 중 하나 이상이 달라야함. - 반환 타입 관계 없음
오버로딩은 반환 타입이 다르다는 것만으로 구별되지 않음. 즉, 반환 타입만 다르고 매개변수가 동일한 두 메소드는 오버로딩으로 간주되지 않음. 매개변수가 다르면 반환타입도 다를 수 있음. - 접근 제한자와 예외는 오버로딩에 영향을 주지 않음.
접근 제한자(public, private ...) 나 예외 선언은 오버로딩을 결정하는 요소가 아님.
public class OverloadingExample {
public void display() {
System.out.println("Display without parameters");
}
public void display(int a) {
System.out.println("Display with one parameter: " + a);
}
public void display(int a, int b) {
System.out.println("Display with two parameters: "+a+ ","+b);
}
public void display(String a) {
System.out.println("Display with a string parameter: " + a);
}
}
차이점
Overriding | Overloading |
---|---|
런타임 다형성 구현 | 컴파일 시간 다형성 구현 |
메소드 호출은 객체 유형에 따라 런타임에 결정됨. | 메소드 호출은 컴파일 타임에 결정됨. |
슈퍼 클래스와 서브클래스 사이에서 발생 | 같은 클래스의 메소드 사이에서 발생 |
동일한 서명(이름 및 메서드 파라미터)를 가짐 | 이름은 같지만 매개변수가 다름 |
오류가 발생하면 런타임에 효과가 표시됨. | 오류가 발생하면 컴파일 타임에 포착될 수 있음. |
728x90
'99클럽 TIL' 카테고리의 다른 글
99클럽 코테 스터디 7일차 TIL List (0) | 2024.04.24 |
---|---|
99클럽 코테 스터디 6일차 TIL final keyword, static keyword (0) | 2024.04.23 |
99클럽 코테 스터디 4일차 TIL JVM (2) | 2024.04.21 |
99클럽 코테 스터디 3일차 TIL Annotation (0) | 2024.04.20 |
99클럽 코테 스터디 2일차 TIL Java Collection (1) | 2024.04.19 |
Comment