오버라이딩(Overriding) = 리모델링
쉽게말해서 재 정의하기!
상속시 적용되는 개념으로 부모로 부터 상속받은 멤버들을 그대로 재 사용하지 않고 재 정의해서 사용하는 것을 말함!
조건이 좀 까다로워
- "메소드명"이 동일해야 한다.
- 메소드의 "매개변수 개수, 데이터타입 및 순서"가 모두 같아야 한다.
- 메소드의 "반환타입"도 같아야 한다.
=> 현실에서 리모델링 하는 것과 같이 겉모습은 모두동일하고 안쪽만 뜯어 고치는 개념임!
- 부모 메서드의 접근 지정자가 "public이거나 protected"인 경우에만 오버라이딩이 가능하다 (당연! 부모-자식은 다른 class 혹은 다른 패키지 일 수 있으니까!)
- 부모 메서드가 default 지정자나(이건 모르겠고 나중에 ) private지정자를 가진 메서드를 오버라이딩 한경우
자식 고유의 메서드로 처리된다(오버라이딩 한 것이 아니고 걍 자식클래스에서 새로 만들어진것임)
그리고 !!!! ********정적메소드는 오버라이딩 대상이 아님********** 얘는.... 바꿀 수 가 없어........
public class Parent { =========부모클래스=======
[멤버변수]
String name;
int age;
[기본생성자]
public Parent() { }
[인자생성자]
public Parent(String name, int age) {
this.name = name;
this.age = age;
}//////////
[멤버메소드]
private void eat() {
System.out.println("부모님이 드신다");
}
String sleep(int age) {
System.out.println("부모님이 주무신다");
return null;
}
protected int walk(Date date) {
System.out.println("부모님이 산책하신다");
return 0;
}
public void exercise() {
System.out.println("부모님이 운동하신다");
}
static void staticMethod() {
System.out.println("부모님의 정적 메소드");
}
////[출력메소드]////
String getParent() {
return String.format("성함:%s,연세%s", name,age);
}
void printParent() {
System.out.println(getParent());
}
public class Child extends Parent { =========자식클래스=======
[멤버 변수]
String newExtendVar ; 자식에서 새롭게 확장한 멤버
[인자 생성자]
public Child(String name, int age,String newExtendVar) {
super(name, age);
this.newExtendVar = newExtendVar;
}
[멤버 메소드]
void newExtendMethod() { =>자식에서 새롭게 확장한 멤버
System.out.println("자식에서 새롭게 확장한 멤버");
}////////////////////
***자식에서 새롭게 확장한 메소드는 오버라이딩이 아님!!!
private void eat() { =>(부모의 private이 붙은 메소드는 자식에서 안보이니까 오버라이딩 한거 아니고 자식에서 새롭게 확장한 멤버가 됨.!!)
System.out.println("자식이 먹는다");
}/////////////////
@Override => (어노테이션 : 주석의 일종인데 컴파일러에게 아래 메소드는 오버라이딩한 메소드다 라고 알려줌,, 근데 형식에 안맞거나 틀린거면 빨간줄로 표시 됨.. 즉 진짜 오버라이딩인지 아닌지 구분 할 때 사용한다!)
public String sleep(int age) { =>접근지정자는 부모와 같거나 부모보다 넓어야 한다
System.out.println("자식이 잔다");
return null;
}/////////////////
오버로딩에 해당 부모의 walk는 오버라이딩 안하고 그대로 사용.
매개변수 타입만 다르게해서 사용하면 자식에서 새롭게 확장한 메소드와 같다
int walk(int date) { =>그니까 타입 변경 되었으니 오버라이딩은 아니고 오버로딩이라고! 헷깔리지 말아랏
System.out.println("나이가 "+age+"살인 자식이 걷다:오버로딩");
return 0;
}///////////////////////////
@Override
public void exercise() {
super.exercise(); 이건 부모의 메소드를 그대로 사용하도록 함
System.out.println("자식이 운동한다"); =>이게 재 정의
}
@Override
String getParent() {
return super.getParent()+",자식 멤버변수:"+newExtendVar;
}
@Override
void printParent() {
System.out.println(getParent());
}
static void staticMethod() { ===>오버라이딩 아님 정적메소드는 오버라이딩 대상이 아님
System.out.println("자식의 정적 메소드");
}
main 안
인스턴스 변수 :Child타입(자식)
메모리 :Child타입(자식)
Child child = new Child("가길동",20,"Child Member Var1");
System.out.println("[자식타입의 인스턴스변수 -오버라이딩한 메소드 호출]");
child.sleep(10);
child.exercise();
child.printParent();
=>출력
[자식타입의 인스턴스변수 -오버라이딩한 메소드 호출]
자식이 잔다
자식이 운동한다
성함:가길동,연세20,자식 멤버변수Child Member Var1
System.out.println("[자식타입의 인스턴스변수 -자식에서 새롭게 확장한 메소드 호출]");
child.newExtendMethod();
child.walk(10); => int형이라 오버로딩된거!
child.walk(new Date()); => 이것은 상속받은 메소드
=>출력
[자식타입의 인스턴스변수 -자식에서 새롭게 확장한 메소드 호출]
자식에서 새롭게 확장한 멤버
나이가 20살이 자식이 걷다:오버로딩
부모님이 산책하신다
인스턴스 변수 :Child타입(부모)
메모리 :Child타입(부모)
인스턴스변수가 어떤타입이든 무조건 오버라이딩한 메소드가 호출된다
부모메소드 쓰고싶으면 super. 으로 접근
이게 되네,,,?
Parent parent = new Child("나길동",30,"child Member Var2");
System.out.println("[부모타입의 인스턴스변수 -오버라이딩한 메소드 호출]");
parent.sleep(10);
parent.exercise();
parent.printParent();
=>출력
[부모타입의 인스턴스변수 -오버라이딩한 메소드 호출]
자식이 잔다
자식이 운동한다
성함:나길동,연세30,자식 멤버변수child Member Var2
---------------------------어떤 타입이든 무조건 오버라이딩한 메소드가 호출됨...
System.out.println("[부모타입의 인스턴스변수 -자식에서 새롭게 확장한 메소드 호출]"); parent.newExtendMethod(); 부모타입엔 이거 없어 호출 불가 parent.walk(10); //역시 없어
parent.walk(new Date()); 상속받은 메소드 그대로 사용
***부모타입의 인스턴스 변수로 자식에서 새롭게 확장한 멤버에 접근하려면 형변환해야***
Child ch = (Child)parent;
ch.newExtendMethod(); =>변수를 이용하거나
((Child)parent).walk(10); => 캐스팅연산자로 직접바꾸거나
형변환은 부모의 그릇을 찌그려트려서 자식의 그릇처럼 만드는 것!
그림으로 이해해보면 더 쉽다!

'학원 > JAVA' 카테고리의 다른 글
10/4 14-7 instanceof 연산자 (0) | 2022.10.04 |
---|---|
10/4 14-6 이질화와 동질화 (0) | 2022.10.04 |
추상화 과제 복습 (0) | 2022.10.02 |
9.30 13-7 Constructor 3 (this() 생성자) (0) | 2022.10.01 |
9.30 13-6 Constructor 2 (기본 생성자) (1) | 2022.10.01 |