본문 바로가기
JAVA

221012 이종모음-배열 다형성과 매개변수의 다형성

 

이종모음
이(異)종모음은 배열에 다형성을 적용시키는 원리이다. 배열은 원래 동(仝)종모음 구조이다

(int 배열에는 int만 들어가고, String 배열에는 String만 들어갔다.)


하지만 다형성을 이용하면 이종모음 구조의 객체 배열이 생성 가능하다

부모 타입 배열에 자식 객체가 저장될 수 있다. 덕분에 이종모음이 가능해짐
다형성은 멤버 변수의 값을 대입할 때도 발생하지만, 메서드를 호출할 때 사용하는 매개 변수에도 발생할 수 있습니다.

 

 

Employee

package day08.poly.basic2;

public class Employee extends Person{
	
	String department;//부서
	Employee(String name, int age, String department){
		super(name,age);
		this.department=department;
		
	}
	
	
	String info() {
		//super.메서드()- 오버라이딩된 메서드에서 부모님의 원형메서드가 필요할때 사용가능
		return super.info()+ ", 부서:"+ department;
	}
}

Student

package day08.poly.basic2;

public class Student extends Person{

	String studentId;//학번
	Student(String name, int age, String studentId){
		super(name, age);
		this.studentId=studentId;
		
	}
	
	String info() {
		
		return "이름:" + name + ", 나이:" + age + ", 학번:" + studentId; 
	}
	
}

Teacher

package day08.poly.basic2;

public class Teacher extends Person {
	
	String subject;//과목
	
	Teacher(String name, int age, String subject){
		super(name, age);
		this.subject=subject;
		
	}
	
	String info() {
		return "이름:" + name + ", 나이:"+ age+ ", 과목:"+ subject;
	}
}

House

package day08.poly.basic2;

public class House {//사용자클래스
	
	/* 배열을 전달하라는 말이 아닙니다.
	 * 
	 * 1. 멤버변수로 크기가 100개인 Person배열을 선언
	 * 2. 배열의 순서를 사용할 count변수 선언
	 * 3. void setPerson(???) 모든 자식클래스를 받을 수 있도록 선언하세요.
	 *    기능 - 멤버변수에 매개변수를 순서대로 저장되는 기능
	 *    
	 * 4. 메인클래스에서는 3명의 Person을 전달하세요.
	 */
	private Person[] pr = new Person[100];//멤버변수
	private int count;
	
	
	public void setPerson(Person p) {
		pr[count]=p;
		count++;
	}
	
	//pr반환 get메서드
	public Person[] getPerson() {//멤버변수가 베열.
		return pr;
	}
	
	
	
	
	
	
}

setPerson 메서드에서 Person p를 매개변수로 받은 건 student, teacher, employee가 person에 상속되어 있기 때문에 받을 수 있기 때문

 

멤버변수는 배열이었다. 당연히 get으로 반환하는 것도 배열이다. set에서 배열 멤버변수를 조정했으니까.

 

Main

package day08.poly.basic2;

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {

		//다형성을 적용한 배열
		Student s = new Student("홍길동", 20, "123123");

		Teacher t = new Teacher("홍길자",30,"프로그램");

		Employee e = new Employee("홍길순", 40, "취업지원팀");

		//Object[] arr = {s, t, e};오버라이딩 메서드 사용불가
		Person[] arr = {s, t, e};//부모타입으로 한번에 받기

		for(Person p :arr) {//마찬가지, 부모타입으로 한번에
			System.out.println(p.info());//오버라이딩된 메서드
		}

		System.out.println("============================");
		printInfo(s);
		printInfo(t);
		printInfo(e);

		House h = new House();
		h.setPerson(s);//스튜던트 저장
		h.setPerson(t);//티쳐
		h.setPerson(e);//임플로이
		Person[] pr=h.getPerson();

		for(Person p : pr) {
			if(p==null) break;
			System.out.println(p.info());
		}
	}
	public static void printInfo(Person p) {//부모타입 매개변수
		System.out.println(p.info());
	}
}
이름:홍길동, 나이:20, 학번:123123
이름:홍길자, 나이:30, 과목:프로그램
이름:홍길순, 나이:40, 부서:취업지원팀
============================
이름:홍길동, 나이:20, 학번:123123
이름:홍길자, 나이:30, 과목:프로그램
이름:홍길순, 나이:40, 부서:취업지원팀
이름:홍길동, 나이:20, 학번:123123
이름:홍길자, 나이:30, 과목:프로그램
이름:홍길순, 나이:40, 부서:취업지원팀

다형성 덕분에 Person[] arr에 세 객체를 모두 받는 것이 가능하다!

house객체 setter에서 s, t, e를 받아 house멤버변수인 Person[] 배열에 담는다. 

그리고 house의 getter가 Person[]배열을 반환하므로 Person[]배열로 받는 것이 가능

 

단, 이때 if(p==null) break;를 쓰는 건 받은 배열의 크기가 100인데 s, t, e 세 개의 객체만 배열에 넣었기 때문.