본문 바로가기
Programming/JAVA(eclipse)

java 8일차 _03. 다형성

by yoon9i 2024. 3. 19.

/////////////////////////////////////

OOP (객체지향) 의 3대 특징

1. 상속( inheritance )
2. 다형성 ( polymorphism )
3. 은닉화 ( encapsulation, 캡슐화 ) 

////////////////////////////////////////

2. 다형성 ( polymorphism )

1) 개념
- 하나의 참조변수가 타입이 다른 여러 인스턴스를 참조하는 능력.

2) 특징
- 상속이 전제 ( is a 관계이고 같은 종류 의미를 내포한다. )
- 재사용성이 높아진다.
- 하나의 변수로 서로 다른 기능을 가진 메서드(변수)를 호출할
  수 있다.

3) 문법
Object
    |
           Employee( 부모, 큰타입 )
    | |
Engineer         Manager (작은타입)

가. 일반적인 방법

Employee emp = new Employee( );
Engineer eng = new Engineer( );
Manage    m = new Manager( );
Secretary   s  = new Secretary( );

나. 다형성을 적용한 방법

Employee emp = new Employee( );
 emp = new Engineer( );
 emp = new Manager( );
 emp = new Secretary( );

* 기본형
short s = 10;
int s2 = s;

4) 다형성 활용
가. 배열
- 기본적으로 배열은 같은 타입만 저장된다.
다형성을 적용하면 다른 타입도 저장 가능하다.
ex)
// Employee 배열이기 때문에 Employee 또는 자식들만 
   저장이 가능하다.
Employee [ ] emp = {  
   new Employee( ),
   new Engineer( ),
   new Manager( ),
   new Secretary( )
};

// 다형성을 확장해서 Object 배열을 만들면 모든 데이터를
   저장할 수 있다.
Object [ ] obj = { 
   "hello", 
   new Employee( ),
   new Random( ),
   10,
   3.14
           ...
};


나. 메서드 파라미터 타입
==> 다형성이 지원 안되면 여러개의 오버로딩 메서드가 필요하다.
       하지만 다형성이 지원되어 하나의 메서드만 있으면 된다.


ex)
public void a ( Object  x ) { }

a("hello");
a(10);
a(true);

public String printf ( String s, Object ... obj )

System.out.printf( " ", 10 );
System.out.printf( " ", "hello" );
// printf 의 경우 처음에는 문자열을 받기때문에
Stirng s 를 받게 되는거고 뒤에는 모든 데이터를
받기에 Object obj 가 되는거고 값이 여러개가 있을수
있기에 ... 가변인자를 쓰게된다 그래서 합치면
``printf ( String s, Object ... obj )`` 가 된다.



* 이름은 똑같고 데이터타입이 다른것? 오버로딩
public void a ( String x ) { }
public void a ( int x ) { }
public void a ( boolean x ) { }

 

package exam12_상속후_5_다형성;

public class TestMain6 {

	public static void main(String[] args) {

		// 1. 일반적인 방법
		Employee6 emp = new Employee6("강감찬", 200);
		Engineer6 eng = new Engineer6("홍길동", 100, "JAVA");
		Manager6 m = new Manager6("이순신", 200, "인사");
		Secretary6 s = new Secretary6("유관순", 200);

		System.out.println(emp.getEmployee());
		System.out.println(eng.getEmployee());
		System.out.println(m.getEmployee());
		System.out.println(s.getEmployee());
		System.out.println();

		// 2. 다향성 적용
		// => 하나의 Employee 타입(부모인 큰 타입) 의 emp2 변수로 여러 자식(하위타입)을 참조함.
		Employee6 emp2 = new Employee6("강감찬", 200);
				  System.out.println(emp2.getEmployee());
				  emp2 = new Engineer6("홍길동", 100, "JAVA");
				  System.out.println(emp2.getEmployee());
				  emp2 = new Manager6("이순신", 200, "인사");
				  System.out.println(emp2.getEmployee());
				  emp2 = new Secretary6("유관순", 200);
				  System.out.println(emp2.getEmployee());
				  
				  
	}

}
package exam12_상속후_5_다형성;

public class Employee6 {

	// 공통적인 속성
	String name;
	int salary;
	
	// 생성자
	public Employee6() {
		super();
	}
		
	public Employee6(String name, int salary) {
		super();
		this.name = name;
		this.salary = salary;
	}

	// 공통적인 기능
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	
	
	//
	public String getEmployee() {
		return name+"\t"+salary;
	}
}
package exam12_상속후_5_다형성;

public class Manager6 extends Employee6 {
	
	String depart; // Manager 에서만 추가된 속성
	
	// 생성자
	public Manager6() {
		super();
	}

	public Manager6(String name, int salary) {
		super(name, salary);
	}
	
	public Manager6(String name, int salary, String depart) {
		super(name, salary);
		this.depart = depart;
	}

	
	// getter & setter
	public String getDepart() {
		return depart;
	}

	public void setDepart(String depart) {
		this.depart = depart;
	}

	
	// override
	@Override
	public String getEmployee() {
		return super.getEmployee() + "\t" + depart;
	}
	
	
}
package exam12_상속후_5_다형성;

public class Secretary6 extends Employee6 {
	
	// 추가되는 속성없음
	// getter & setter 메서드 없음
	// override 메서드 필요없음. -> 부모메서드와 동일하기때문
	
	// 생성자
	public Secretary6() {
		super();
	}

	public Secretary6(String name, int salary) {
		super(name, salary);
	}
	
}
package exam12_상속후_5_다형성;

public class TestMain6_1 {

	public static void main(String[] args) {
		
		// 다형성 활용 (예) - 배열
		Employee6 [] empArray = {
				new Employee6("강감찬", 200),
				new Engineer6("홍길동", 100, "JAVA"),
				new Manager6("이순신", 200, "인사"),
				new Secretary6("유관순", 200)
		};
		
		for (Employee6 e : empArray) {
			System.out.println(e.getEmployee());
			// Employee 에 getEmployee() 가 있기에 에러 발생 x
		}
		
		// object 로도 가능하지만 object 에 getEmployee() 라는 메서드가
		// 없기때문에 에러가 나는거임. Object 로도 가능하다는것만 알기
		for (Object e : empArray) {
//			System.out.println(e.getEmployee());
		}
		
		// 다형성 배열 확장
		// -> 자바의 모든 데이터를 저장할 수 있는 능력이 생긴다.
		Object [] obj = {
				"hello",
				20,
				3.14,
				true,
				new Engineer6("홍길동", 100, "JAVA")
		};
	}

}

'Programming > JAVA(eclipse)' 카테고리의 다른 글

java 9일차 _01. 다형성  (0) 2024.03.20
java 9일차 _ 8일차 리뷰  (0) 2024.03.20
java 8일차_ 02. 상속(2)  (0) 2024.03.19
java 8일차 _02. 상속  (0) 2024.03.19
java 8일차 _01. 클래스 관계  (0) 2024.03.19