컴퓨터는 잘못이 없다..

[JAVA]다형성1_다형성이란?(상속과 다형성) 본문

공부/JAVA

[JAVA]다형성1_다형성이란?(상속과 다형성)

도토리까꿍v 2020. 12. 5. 18:57
Contents 접기

[예제코드]

 

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.~으로 접근할 수 있는 클래스(필드, 메소드)는 부모타입이 정해준다!

 

Comments