컴퓨터는 잘못이 없다..
[JAVA]상속과 super, this,오버라이딩2(+final예약어/@어노테이션) 본문
[핵심]
1. final예약어로 종단 클래스 만드는 방법 확인하기
2. @어노테이션 무엇인지 알아보기
3. 오버라이드와 super, this 개념 확인하기
4. 퀴즈 꼭 보기!!!!!
[예제코드]
Phone.java
package test.mypac;
//extends는 어떤 클래스를 상속 받을 때 사용하는 예약어이다.
//어떤 클래스도 extends 하지 않으면 자동으로 Object 클래스를 상속받게 된다.
//따라서 Ojbect 클래스를 상속받을 거라면 생략이 가능하다.
public class Phone{
//디폴트 생성자
public Phone() {
System.out.println("Phone 생성자 호출됨");
}
//전화거는 non-static 메소드
public void call() {
System.out.println("전화를 걸어요!");
}
}
HandPhone.java
package test.mypac;
public class HandPhone extends Phone{
//디폴트 생성자
public HandPhone() {
System.out.println("HandPhone() 생성자 호출됨");
}
//이동중에 전화를 걸어요
public void mobileCall() {
System.out.println("이동중에 전화를 걸어요");
}
//사진을 찍어요
public void takePicture() {
System.out.println("30만 화소의 사진을 찍어요!");
}
}
SmartPhone.java
package test.mypac;
//SmartPhone 클래스를 종단 클래스로 만드는 final 얘약어 --> fianl은 고자를 만들어버린다.
public final class SmartPhone extends HandPhone{
//디폴트 생성자
public SmartPhone() {
System.out.println("SmartPhone()생성자 호출됨");
}
//SmartPhone이 정의한 메소드
public void doInternet() {
System.out.println("인터넷을 해요");
}
//SmartPhone메소드에서 부모클래스와 자기자신클래스 메소드 호출하기
public void callMethod() {
//SmartPhone클래스엔 call()함수가 없으니 부모의 call()함수가 호출된다.
call();
//SmartPhone 클래스엔 mobileCall()함수가 없으니 부모의 mobileCall()함수가 호출된다.
mobileCall();
//SmartPhone클래스엔 takePicture()함수가 있으므로(재정의함)
//부모클래스의 takePicture()를 호출하고 싶을땐 super예약어를 이용한다.
super.takePicture();
//부모클래스의 takePicture()가 아닌
//SmartPhone클래스의 takePicture을 호출하고 싶을 땐 this 예약어를 사용한다.
this.takePicture();
//위에 1줄에서 this는 생략해도 된다.
//이경우 부모클래스에도, 자식클래스에도 takePicture이 존재하므로 자식의 takePicture가 호출된다.
takePicture();
}
//HandPhone으로 부터 메소드 상속을 받긴 하겠지만
//어떤 메소드는 내가 재정의를 하겠다!
//이 메소드는 재정의한 메소드라고 표시해주는 어노테이션(@)
//특별한 기능을 하는 것은 아니고 단지 재정의한 메소드라고 표시해주는 기능만 있다.
@Override
public void takePicture() {
/*
super 는 부모 객체를 가리키는 예약어이다.
피 오버라이드된 부모 메소드도 만일 호출하려면 아래와 같이 호출하면 된다.
super.takePicture();
부모메소드를 호출해야하는지 아닌지는 그때 그때 클래스에 따라 다르므로
클래스 사용법을 학습을 해서 선택을 해야한다.
*/
super.takePicture();//부모 메소드를 호출해준다. super은 부모 클래스의 참조값을 가리킨다.
System.out.println("1000만 화소의 사진을 찍어요");
}
}
MainClass04.java
package test.main;
import test.mypac.SmartPhone;
public class MainClass04 {
public static void main(String[] args) {
SmartPhone p1 = new SmartPhone();
System.out.println("-------------");
p1.call();
System.out.println("-------------");
p1.mobileCall();
System.out.println("-------------");
p1.takePicture();
System.out.println("-------------");
p1.doInternet();
System.out.println("-------------");
p1.callMethod();
}
}
MainClass04.java 실행결과
Phone 생성자 호출됨
HandPhone() 생성자 호출됨
SmartPhone()생성자 호출됨
-------------
전화를 걸어요!
-------------
이동중에 전화를 걸어요
-------------
30만 화소의 사진을 찍어요!
1000만 화소의 사진을 찍어요
-------------
인터넷을 해요
-------------
전화를 걸어요!
이동중에 전화를 걸어요
30만 화소의 사진을 찍어요!
30만 화소의 사진을 찍어요!
1000만 화소의 사진을 찍어요
30만 화소의 사진을 찍어요!
1000만 화소의 사진을 찍어요
[코드 설명]
1. final 예약어로 클래스를 종단 클래스로 만들 수 있다.
▼public final class 클래스명~ 으로 class앞에 final예약어를 붙여주면 된다.
SmartPhone.java
▼아래 그림처럼 더이상 자식클래스를 만들지 못하게 된다!
2. 예제코드에서 쓰인 어노테이션
▼@Override의 의미 : 특별한 기능을 하는 것은 아니다, 단지 재정의한 메소드라고 표시해주는 기능만 있다.
SmartPhone.java
3. 자식클래스에서는 부모클래스의 메소드를 사용할 수 있다.
▼예제코드의 상속관계는 아래와 같다. (그림엔 없지만 SmartPhone 클래스에 callMethod() 메소드도 있음!)
▼SmartPhone.java의 재정의한 takePicture()메소드
┕ 부모의 takePicture()메소드를 재정의하였다. 여기서 super예약어로 부모 메소드도 호출해 주었다.
▼SmartPhone.java의 callMethod() 메소드
└takePicture()메소드는 HandPhone클래스의 메소드이고 자식클래스인 SmartPhone메소드에서 재정의 하고있다.
SmartPhone.java 에서 this.takePicture()은 자식클래스의 재정의한 메소드이고, super.takePicture은 부모클래스의 메소드이다.
└이때 this를 생략하고 takePicture()만 호출하면 자식클래스의 재정의한 메소드를 의미한다.
▼상속 관계와 메소드를 확인한 후 MainClass04.java의 실행결과를 살펴보자.
└p1.takePicture(); 코드는 자식클래스인 SmartPhone.java의 재정의 된 takePicture()가 호출된다.
또한 재정의한 takePictrue()안에서 super.takePicture() 를 호출해 주었기 때문에
30만 화소의 사진을 찍어요!
1000만 화소의 사진을 찍어요
이렇게 2개의 출력문을 출력한다.
4. super과 this는 각각 어디를 가리키고 있을까?
▼ MainClass04.java와 SmartPhone.java
┕this는 자기자신의 참조값을 가리키고 (new SmartPhone()) super은 부모 클래스의 참조값을 가리킨다.
★★★★★5. 퀴즈
public class Parent {
public int compute(int num) {
System.out.println("parent의 메소드");
if( num <= 1) return num;
return compute(num-1) + compute(num-2);
}
}
public class Child extends Parent {
@Override
public int compute(int num) {
System.out.println("child의 메소드");
if( num <= 1) return num;
return compute(num-1) - compute(num-3);
}
}
public class Main {
public static void main(String[] args) {
Parent obj=new Child();
System.out.print(obj.compute(4));
}
}
답은1
★알아둬야할 주요 사실!!!!!!!!!
부모클래스 a=new 자식클래스();
부모클래스에 compute메소드
자식클래스에 오버라이딩한 compute메소드가 있다
a.compute() 했을 때 호출되는 것은??
-> 자식 클래스의 오버라이딩 된 comput메소드가 호출된다!!
'공부 > JAVA' 카테고리의 다른 글
[JAVA]매개변수가 클래스타입인 메소드 호출해보기(+instanceof연산자, NullPointerException방지하는 법) (0) | 2020.12.28 |
---|---|
[JAVA]상속과 super, this,오버라이딩 (0) | 2020.12.07 |
[JAVA]java.lang패키지 Object클래스/Object클래스와 업캐스팅, 다운캐스팅 (0) | 2020.12.07 |