2023. 6. 15. 16:16ㆍJava/객체지향
1. 오버라이딩이란?
- 오버라이딩이란 조상클래스로부터 상속받은 메서드의 내용을 변경하는 것이다
- 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야하는 경우 조상의 메서드를 오버라이딩하여 사용한다
2. 오버라이딩의 조건
1) 자손클래스에서 오버라이딩하는 메서드는 조상클래스의 메서드와 선언부가 일치해야한다 (이름, 매개변수, 반환타입 일치)
2) 접근제어자를 조상클래스의 메서드보다 좁은 범위로 변경할 수 없다
3) 예외는 조상클래스의 메서드보다 많이 선언할 수 없다
4) 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
3. 오버로딩 vs. 오버라이딩
- 오버로딩: 기존에 없는 새로운 메서드를 정의하는 것. 즉 이름은 똑같지만 "매개변수를" 다르게 하는 것.
- 오버라이딩: 상속받은 메서드의 "내용을" 변경하는것.
4. super
- super는 자손클래스에서 "조상클래스로부터 상속받은 멤버"를 참조하는데 사용되는 참조변수이다.
- 멤버변수와 지역변수의 이름이 같을 때 this를 써서 구별했듯이 상속받은 멤버와 자신의 멤버가 이름이 같을 때는 상속받은 멤버에 super을 붙여 구분할 수 있다
- this와 마찬가지로 super역시 static메서드에서는 사용할 수 없고 인스턴스 메서드에서만 사용할 수 있다
5. super()
- 조상클래스의 생성자
- this()는 같은 클래스의 다른 생성자를 호출하는 데 사용되지만, super()는 조상클래스의 생성자를 호출하는 데 사용된다.
- 자손 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다
- 자손 클래스 인스턴스 생성: 조상 클래스 생성자 호출 -> 후손 클래스 생성자 호출
조상클래스의 멤버의 초기화 작업이 수행되어야 하기 때문에 "자손 클래스의 생성자에서" 조상클래스의 생성자가 호출되어야한다.
- Object클래스를 제외한 모든 클래스의 "생성자 첫 줄에" super()를 호출해야한다.
그렇지 않으면 컴파일러가 자동적으로 삽입한다.
- 인스턴스 생성시 고려 사항
1) 클래스: 어떤 클래스의 인스턴스를 생성할 것인가?
2) 생성자: 선택한 클래스의 어떤 생성자를 이용해 인스턴스를 생성할 것인가?