Notice
Recent Posts
Recent Comments
Link
컴퓨터는 잘못이 없다..
[JAVA]상속 퀴즈2 본문
Contents
접기
[퀴즈]
아래 코드를 보고 MainClass11.java의 실행결과가 어떻게 되는지 예상해보자.
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;
//extends는 어떤 클래스를 상속 받을 때 사용하는 예약어이다.
//어떤 클래스도 extends 하지 않으면 자동으로 Object 클래스를 상속받게 된다.
//따라서 Ojbect 클래스를 상속받을 거라면 생략이 가능하다.
public class Phone{
//디폴트 생성자
public Phone() {
System.out.println("Phone 생성자 호출됨");
}
//전화거는 non-static 메소드
public void call() {
System.out.println("전화를 걸어요!");
}
}
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만 화소의 사진을 찍어요");
}
}
MainClass11.java
package test.main;
import test.mypac.Phone;
import test.mypac.SmartPhone;
public class MainClass11 {
public static void main(String[] args) {
//SmartPhone -> HandPhone -> Phone -> Object
System.out.println("main 메소드가 시작되었습니다.");
//SmartPhone, HandPhone, Phone, Object 객체가 한꺼번에 만들어지고
//Heap에 저장되어 한개의 참조값으로 관리된다.
//또한 SamrtPhone, HandPhone, Phone 생성자도 호출된다.
new SmartPhone();
System.out.println("===");
Object p1= new SmartPhone();
System.out.println("===");
Phone p2 = new SmartPhone();
System.out.println("main 메소드가 종료됩니다.");
}
}
[퀴즈답]
main 메소드가 시작되었습니다.
Phone 생성자 호출됨
HandPhone() 생성자 호출됨
SmartPhone()생성자 호출됨
===
Phone 생성자 호출됨
HandPhone() 생성자 호출됨
SmartPhone()생성자 호출됨
===
Phone 생성자 호출됨
HandPhone() 생성자 호출됨
SmartPhone()생성자 호출됨
main 메소드가 종료됩니다.
┖생성자가 호출되는 순서를 보자!
자식 클래스로 객체를 생성하면 부모 클래스의 생성자부터 자식클래스의 생성자순서로 호출된다.
'공부 > JAVA' 카테고리의 다른 글
[JAVA]String도 일종의 클래스이다! (0) | 2020.12.29 |
---|---|
[JAVA]상속 퀴즈1 (0) | 2020.12.29 |
[JAVA]Eclipse 단축키정리 (0) | 2020.12.29 |
Comments