컴퓨터는 잘못이 없다..
[JAVA]다형성1_다형성이란?(상속과 다형성) 본문
[예제코드]
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만 화소의 사진을 찍어요!");
}
}
MainClass02.java
package test.main;
import test.mypac.Phone;
import test.mypac.HandPhone;
public class MainClass02 {
public static void main(String[] args) {
//객체를 다양한 타입의 변수에 대입해보자!
//방법1.생성한 객체와 같은 타입의 변수에 대입
//1가지)HandPhone객체를 생성해서 참조값을 HandPhone type변수에 담기
HandPhone p1 = new HandPhone();
System.out.println("------------------");
//방법2.생성한 객체와 다른 타입의 변수에 대입
//2가지)HandPhone객체를 생성해서 참조값을 Phone type에 담기
Phone p2 = new HandPhone();
System.out.println("------------------");
//3가지)HandPhone객체를 생성해서 참조값을 Object type에 담기
Object p3 = new HandPhone();
System.out.println("------------------");
//방법2의 경우
//new로 생성한 클래스의 참조값을 담은 변수가 구리다(?) 라고 생각하기.
//혹은 담고있는 설명서가 구리다! 라고 생각하기
//따라서 아래 방법2로 쓴 애들은
//담긴 변수의 데이터 타입(클래스)내 메소드와 필드 밖에 사용 못한다.
//구린 설명서대로밖에 사용못한다.
}
}
▲MainClass02.java 실행결과
Phone 생성자 호출됨
HandPhone() 생성자 호출됨
------------------
Phone 생성자 호출됨
HandPhone() 생성자 호출됨
------------------
Phone 생성자 호출됨
HandPhone() 생성자 호출됨
------------------
[예제코드 설명]
1. 다형성이란?
-다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미한다.
-객체는 여러가지 type을 가질 수 있다.
-상속 관계에 따라서 여러가지 type이 된다.
다시 말하면 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.
-아래의 HandPhone 객체는 3가지 type을 가진다.(HandPhone 타입, Phone 타입, Object타입..)
2.예제 코드를 그림으로 표현해보자.
① 상속관계를 확인하자! Object <- Phone <- HandPhone
Phone.java 와 HandPhone.java
② new HandPhone() 하면 벌어지는 일
▼HandPhone의 부모클래스들까지 모두 객체가 생성되며 하나의 참조값으로 관리된다!
▼ 실행결과를 보고 new HandPhone() 하면 부모클래스의 생성자도 호출됨을 확인하자!
③HandPhone p1 = new HandPhone(), Phone p2=new HandPhone(), Object p3=new HandPhone()
하면 벌어지는 일
④실제 p1, p2, p3가 사용할 수 있는 것!!!
HandPhone 객체를 담은 HandPhone p1 은 Object, Phone, HandPhone 내 필드, 메소드까지 사용 가능하다.
HandPhone 객체를 담은 Phone p2 는 Object, Phone 내 필드, 메소드까지 사용 가능하다.
HandPhone 객체를 담은 Object p3 는 Object 내 필드, 메소드까지 사용 가능하다.
*접근지정자가 모두 public 이라고 가정하고 생각하였습니다.
부모타입 p=new 자식타입;
의 모양일 때 p.~으로 접근할 수 있는 클래스(필드, 메소드)는 부모타입이 정해준다!
'공부 > JAVA' 카테고리의 다른 글
[JAVA]다형성2_업캐스팅과 다운캐스팅(상속/다형성/업캐스팅과 타운캐스팅) (0) | 2020.12.06 |
---|---|
[JAVA]최상위 클래스인 Object클래스 (상속은 extends, 상속관계에서 생성자호출, 다중상속은 불가능하다) (0) | 2020.11.29 |
[JAVA]Generic Class (0) | 2020.11.29 |