/////////////////////////////////////
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 |