오버라이딩
오버라이딩이란??
조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.
조건
- 이름이 같아야 한다.
- 매개변수가 같아야 한다.
- 반환타입이 같아야 한다.
주의점!
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 조상에서 protected로 선언되어 있으면 자식에서는 protected, public만 가능 private로 하면 안된다.
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
- 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
오버로딩 VS 오버라이딩
오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것
class Phone extends Object{
boolean power;
Phone(){
System.out.println("Phone생성자 실행");
power = false;
}
Phone(int n){
System.out.println("1 실행");
}
void power(){
power = !power;
System.out.println(power ? "전원이 켜집니다." : "전원이 꺼집니다.");
}
}
class MyPhone extends Phone{
String userName;
MyPhone(String userName){
System.out.println(super.toString());
System.out.println("MyPhone생성자 실행");
this.userName = userName;
}
void power(){ //오버라이딩
System.out.println("저의 폰이 켜집니다.");
}
void power(String x){//오버로딩
System.out.println(x + "의 폰이 켜집니다.");
}
void printUserName(){System.out.println(userName);}
}
super
💡super란?
- 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다.
class Phone extends Object{
boolean power;
Phone(){
power = false;
}
void power(){
power = !power;
System.out.println(power ? "전원이 켜집니다." : "전원이 꺼집니다.");
}
}
class MyPhone extends Phone{
boolean power;
String userName;
MyPhone(String userName){
this.userName = userName;
}
void power(){
power = !power;
System.out.println("내 폰이 켜집니다.");
}
void printObject(){
System.out.println("내 폰의 전원 상태 : " + this.power);
System.out.println("상속받은 폰의 전원 상태 : " + super.power);
}
}
이런 형태로도 사용이 가능하다!
MyPhone이 Phone로부터 상속을 받고 있을 때 변수의 이름이 동일하게 들어오는게 있으면 super키워드를 이용해서 상위클래스의 변수에 접근하는게 가능하다.
물론, 생성자에서도 Phone의 생성자를 실행하는게 가능하다.
import javax.swing.text.Style;
class Phone extends Object{
boolean power;
Phone(){
power = false;
}
void power(){
power = !power;
System.out.println(power ? "전원이 켜집니다." : "전원이 꺼집니다.");
}
}
class MyPhone extends Phone{
boolean power;
String userName;
MyPhone(String userName){
super();//요렇게 하면 상위 클래스의 생성자가 실행됨!! 만약 없어도 자동으로 기본생성자가 추가됨.
this.userName = userName;
}
void power(){
power = !power;
System.out.println("내 폰이 켜집니다.");
}
void printObject(){
System.out.println("내 폰의 전원 상태 : " + this.power);
System.out.println("상속받은 폰의 전원 상태 : " + super.power);
}
}
public class Main {
public static void main(String[] args) {
MyPhone myPhone = new MyPhone("김씨");
myPhone.printObject();
myPhone.power();
myPhone.printObject();
}
}
class Phone {
boolean power;
Phone(boolean power){//생성자에 매개변수를 추가!
this.power = power;
}
void power(){
power = !power;
System.out.println(power ? "전원이 켜집니다." : "전원이 꺼집니다.");
}
}
class MyPhone extends Phone{
boolean power;
String userName;
MyPhone(String userName){
super();
this.userName = userName;
}
void power(){
power = !power;
System.out.println("내 폰이 켜집니다.");
}
void printObject(){
System.out.println("내 폰의 전원 상태 : " + this.power);
System.out.println("상속받은 폰의 전원 상태 : " + super.power);
}
}
만약에 다음과 같은 형태로 실행된다면 오류가 발생한다!! 왜일까??
우리는 컴파일러가 컴파일을 수행할때 사용자가 생성자를 정의하고 있지 않으면 기본 생성자를 추가해준다. 근데 사용자가 생성자를 따로 정의하면 기본 생성자를 정의하지 않는데. Phone에서 매개변수가 들어온 생성자가 있기 때문에 기본 생성자를 컴파일러가 만들지 않아서 오류가 발생하는 것이다! 따라서 super() -> super(false)로 매개변수를 전달하면 오류가 발생하지 않을 것이다.
이렇게 생성자가 실행된다고 보면 될 거 같다. Object는 상속하지 않아도 컴파일러가 추가해준다!! 그냥 추가해줘도 상관없다.
새롭게 알게된 부분
- super키워드를 자동으로 추가해주는 걸 알게됨.
- Object생성자까지 실행되는지 알게됨.
'자바(Java)' 카테고리의 다른 글
선택 안됨 [자바][Java Programming Language]객체지향 프로그래밍 -package와 import (0) | 2025.02.08 |
---|---|
[자바][Java Programming Language]객체지향 프로그래밍 - 상속 (0) | 2025.01.23 |
[자바][Java Programming Language] 객체지향프로그래밍(클래스, 생성자, 매개변수, 메서드) (1) | 2025.01.22 |
[자바][Java Programming Language] 배열(Array) (0) | 2024.12.31 |