-
자바 step8 - Extends(extends, casting, Override, super)Java 2022. 10. 26. 21:05
Phone class 생성
package test.mypac; public class Phone { //어떤 클래스도 상속 받지 않으면 자동으로 extends Object 된다. //생성자 public Phone() { System.out.println("Phone 생성자 호출됨"); } //전화거는 메소드 public void call() { System.out.println("전화를 걸어요!"); } }
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만 화소의 사진을 찍어요"); } }
HandPhone class를 생성할 때 Phone class를 상속받아서 만들었다. extends를 사용하였다. 상속받아 class를 생성하면 객체생성을 하지 않아도 부모 class의 메소드를 사용할 수 있다.
package test.main; import test.mypac.HandPhone; /* * Phone 클래스를 상속받은 HandPhone 클래스로 객체를 생성하면 * * Phone 객체가 미리 만들어지고 HandPhone 객체가 만들어진다. * * 그리고 그 두개의 객체가 동일한 heap 영역에 저장되어서 동일한 참조값으로 관리가 된다. */ public class MainClass01 { public static void main(String[] args) { HandPhone p1=new HandPhone(); p1.call(); // 부모로부터 상속 받은 기능을 사용한다고 볼 수 있다. p1.mobileCall(); p1.takePicture(); } } <console> Phone 생성자 호출됨 HandPhone 생성자 호출됨 전화를 걸어요! 이동중에 전화를 걸어요! 30만 화소의 사진을 찍어요
package test.main; import test.mypac.HandPhone; import test.mypac.Phone; /* * java 의 다형성(Polymorphism) * * - 객체는 type 이 여러가지 일수도 있다. */ public class MainClass02 { public static void main(String[] args) { //HandPhone 객체를 생성해서 참조값을 HandPhone type 변수에 담기 HandPhone p1=new HandPhone(); //HandPhone 객체를 생성해서 참조값을 Phone type 변수에 담기 Phone p2=new HandPhone(); //HandPhone 객체를 생성해서 참조값을 Object type 변수에 담기 Object p3=new HandPhone(); } } <console> Phone 생성자 호출됨 HandPhone 생성자 호출됨 Phone 생성자 호출됨 HandPhone 생성자 호출됨 Phone 생성자 호출됨 HandPhone 생성자 호출됨
HandPhone class를 기반으로 Phone 객체를 생성 가능하다.
Object로도 객체를 생성 가능한데, 이는 모든 class의 부모는 Object이기 때문이다.
package test.main; import test.mypac.HandPhone; import test.mypac.Phone; public class MainClass03 { public static void main(String[] args) { //HandPhone 객체를 생성해서 그 참조값을 p1 이라는 이름의 HndPhone type 지역변수에 대입하기 HandPhone p1=new HandPhone(); // p1 안에 있는 참조값을 p2 라는 Phone type 지역 변수에 대입하기 Phone p2=p1; // p1 안에 있는 참조값을 p3 라는 Object type 직역 변수에 대입하기 Object p3=p1; } } <console> Phone 생성자 호출됨 HandPhone 생성자 호출됨
객체를 생성해서 지역변수에 대입할 수 있다.
package test.mypac; public class SmartPhone extends HandPhone{ //생성자 public SmartPhone() { // 부모 생성자 즉 HandPhone 클래스의 생성자를 호출하는 표현식이다. // super(); // 부모생성자 중에서 default 생성자를 호출할때는 생략 가능하다. System.out.println("SmartPhone 생성자 호출됨"); } //인터넷 기능 public void doInternet() { System.out.println("인터넷을 해요!"); } //사진찍는 메소드 재정의(오버라이드) 하기 @Override public void takePicture() { System.out.println("1000만 화소의 사진을 찍어요"); super.takePicture();//부모생성자의 호출 } }
HandPhone class를 상속받아 SmartPhone class를 생성하였다. extends를 사용하였다.
package test.main; import test.mypac.HandPhone; import test.mypac.Phone; import test.mypac.SmartPhone; public class MainClass04 { public static void main(String[] args) { //SmartPhone 객체를 생성해서 Phone type p1 이라는 지역변수에 담아보세요. Phone p1=new SmartPhone(); //p1 에 들어있는 참조값을 이용해서 전화를 걸고 싶다면? p1.call(); //p1 에 들어있는 참조값을 이용해서 이동중에 전화를 걸고 싶다면? HandPhone p2=(HandPhone)p1; // HandPhone type 으로 casting 해서 p2에 담는다. p2.mobileCall(); //p1 에 들어있는 참조값을 이용해서 인터넷을 하고 싶다면? SmartPhone p3=(SmartPhone)p1;//SmartPhone type 으로 casting 해서 p3 에 담는다. p3.doInternet(); } } <console> Phone 생성자 호출됨 HandPhone 생성자 호출됨 SmartPhone 생성자 호출됨 전화를 걸어요! 이동중에 전화를 걸어요! 인터넷을 해요!
SmartPhone class를 기반으로 Phone 객체를 생성하였다. Phone class의 메소드가 사용가능하다.
다만 Phone 객체로 생성하였기 때문에 Phone 메소드밖에 사용할 수 없다.
위의 객체를 기반으로 casting하여 HandPhone 객체를 생성할 수 있다. HandPhone 메소드 사용 가능하다.
SmartPhone 객체 또한 마찮가지이다.
SmartPhone class를 기반으로 생성하였기 때문에, casting은 SmartPhone class 까지 가능하다.
package test.main; import test.mypac.HandPhone; import test.mypac.SmartPhone; public class MainClass05 { public static void main(String[] args) { //자식에게 사준 일반 핸드폰(인터넷이 안 됨) HandPhone p1=new HandPhone(); //엄마! 나도 SmartPhone 갖고 싶어!!! //엄마가 새로운 설명서를 가지고 왔어 이제 그 폰은 SmartPhone 이야 SmartPhone p2= (SmartPhone)p1;//ClassCastException 발생! //진짜? 엄마 짱이다~~ //나 이제 인터넷 한다! p2.doInternet(); } }
HandPhone class를 기반으로 생성하였기 때문에 HandPhone class보다 상위 class인 SmartPhone class로 casting 할 수 없다. err 발생
package test.mypac; public class SmartPhone extends HandPhone{ //생성자 public SmartPhone() { // 부모 생성자 즉 HandPhone 클래스의 생성자를 호출하는 표현식이다. // super(); // 부모생성자 중에서 default 생성자를 호출할때는 생략 가능하다. System.out.println("SmartPhone 생성자 호출됨"); } //인터넷 기능 public void doInternet() { System.out.println("인터넷을 해요!"); } //사진찍는 메소드 재정의(오버라이드) 하기 @Override public void takePicture() { System.out.println("1000만 화소의 사진을 찍어요"); super.takePicture();//부모생성자의 호출 } }
Override를 설명하기 위해 다시한번 SmartPhone class를 가져왔다. Override란, 부모 메소드를 가져와서 재정의를 하는 것이다. 즉, 부모 메소드를 가져와서 변경하여 사용 가능하다.
super는 부모 메소드를 호출하는 것이다.
package test.main; import test.mypac.SmartPhone; public class MainClass06 { public static void main(String[] args) { SmartPhone p1=new SmartPhone(); p1.mobileCall(); p1.doInternet(); p1.takePicture(); } } <console> Phone 생성자 호출됨 HandPhone 생성자 호출됨 SmartPhone 생성자 호출됨 이동중에 전화를 걸어요! 인터넷을 해요! 1000만 화소의 사진을 찍어요 30만 화소의 사진을 찍어요
SmartPhone class로 객체를 생성하고, takePicture 메소드를 호출하였지만, class 내에서 Overdrrive(재정의) 하였기 때문에 재정의 한 메소드가 호출된다.
'Java' 카테고리의 다른 글
자바 step9 - AbstractClass(override) (0) 2022.11.06 자바 step8 - Extends(super, protected) (0) 2022.10.26 자바 step7 - Array(2) (0) 2022.10.25 자바 step7 - Array(1) (0) 2022.10.25 자바 step6 - WrapperClass(데이터 type 변경) (0) 2022.10.25