다형성
* 객체지향 프로그래밍(OOP:Object Oriented Programming)
* 1. 캡슐화 : 정보은닉(필드에는 private, 간접접근으로 getter/setter메소드)
* 2. 상속 : 공통적인 내용물을 추출하여, 부모클래스로써 정의하고, 이를 자식클래스에서 가져다 쓰는 기능
* 3. 다형성 : 상속된 관계에서 객체간의 형(Class)변환(UpCasting, DownCasting)
* 즉, 기본자료형과 마찬가지로, 객체간에도 형변환을 할 수 있다는 것을 의미함.
* 여기서, 다형성에서도 기본자료형과 마찬가지로 값처리 규칙을 적용함.
*
* [형변환에서의 값처리규칙]
* 1. 대입연산자를 기준으로 좌항, 우항의 자료형이 같아야한다.
* 2. 같은 자료형끼리만 연산이 가능하다.
* 3. 연산결과도 같은 자료형이어야 한다.
*
* 클래스 간에 형변환이 가능함.(단, 상속 관계일 경우에만 가능.)
* 업캐스팅(Up-Casting) : 자식타입이 부모타입으로 변경되는 자동형변환을 일컬음.
* 형변환 연산자를 생략 가능함.
* 다운캐스팅(Down-Casting) : 부모타입이 자식타입으로 변경되는 강제형변환을 일컬음.
* 형변환 연산자를 생략 불가함.
1. 부모클래스
Parent클래스
package com.kh.chap01_poly.part01_basic.model.vo;
public class Parent {
private int x;
private int y;
public Parent() {
}
public Parent(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() { return x; }
public void setX(int x) { this.x = x; }
public int getY() { return y; }
public void setY(int y) { this.y = y; }
@Override
public String toString() {
return "Parent [x=" + x + ", y=" + y + "]";
}
public void printParent() {
System.out.println("나는 부모다.");
}
public void print() {
System.out.println("나는 부모다.");
}
}
2. 자식클래스
Child1 클래스
package com.kh.chap01_poly.part01_basic.model.vo;
public class Child1 extends Parent{
private int z;
public Child1() {
super();
}
public Child1(int x, int y,int z) {
super(x, y);
this.z = z;
}
public int getZ() { return z; }
public void setZ(int z) { this.z = z; }
@Override
public String toString() {
return "Child1 [x="+super.getX()+", y="+super.getY()
+"z=" + z + "]";
}
public void printChild1() {
System.out.println("나는 자식1이다.");
}
public void print() {
System.out.println("나는 자식1이다.");
}
}
Child2 클래스
package com.kh.chap01_poly.part01_basic.model.vo;
public class Child2 extends Parent {
private int n;
public Child2() {
super();
}
public Child2(int x, int y, int n) {
super(x,y);
this.n = n;
}
public int getN() { return n; }
public void setN(int n) { this.n = n; }
@Override
public String toString() {
return "Child2 [x="+super.getX()+"y="+super.getY()+"n=" + n + "]";
}
public void printChild2() {
System.out.println("나는 자식2이다.");
}
public void print() {
System.out.println("나는 자식2이다.");
}
}
PolyRun클래스
package com.kh.chap01_poly.part01_basic.run;
import com.kh.chap01_poly.part01_basic.model.vo.Child1;
import com.kh.chap01_poly.part01_basic.model.vo.Child2;
import com.kh.chap01_poly.part01_basic.model.vo.Parent;
public class PolyRun {
public static void main(String[] args) {
System.out.println("1. 부모 타입의 참조형변수로 부모 객체를 다루는 경우");
Parent p1 = new Parent();
p1.printParent();
System.out.println("2. 자식 타입의 참조형변수로 부모 객체를 다루는 경우");
Child1 c1 = new Child1();
c1.printChild1();
c1.printParent();
System.out.println("3. 부모 타입의 참조형변수로 자식 객체를 다루는 경우");
Parent p2 = new Child1();
p2.printParent();
((Child1)p2).printChild1();
Child1[] arr1 = new Child1[2];
arr1[0] = new Child1(1,2,4);
arr1[1] = new Child1(2,1,5);
Child2[] arr2 = new Child2[2];
arr2[0] = new Child2(5,7,2);
arr2[1] = new Child2(2,3,5);
System.out.println("===== 다형성을 접목한 객체배열=====");
Parent[] arr = new Parent[4];
arr[0] = new Child1(1,2,4);
arr[1] = new Child1(2,1,5);
arr[2] = new Child2(5,7,2);
arr[3] = new Child2(2,3,5);
arr[0].printParent();
arr[1].printParent();
arr[2].printParent();
arr[3].printParent();
((Child1)arr[0]).printChild1();
((Child1)arr[1]).printChild1();
((Child2)arr[2]).printChild2();
((Child2)arr[3]).printChild2();
((Child1)arr[0]).printParent();
((Child1)arr[1]).printParent();
((Child2)arr[2]).printParent();
((Child2)arr[3]).printParent();
System.out.println();
System.out.println("====== 반복문을 이용해보기 =====");
for(int i=0 ; i<arr.length; i++) {
arr[i].print();
}
}
}
다형성 적용 전
1. ElectronicController1 클래스
package com.kh.chap01_poly.part02_electronic.controller;
import com.kh.chap01_poly.part02_electronic.model.vo.Desktop;
import com.kh.chap01_poly.part02_electronic.model.vo.NoteBook;
import com.kh.chap01_poly.part02_electronic.model.vo.Tablet;
public class ElectronicController1 {
private Desktop desk;
private NoteBook note;
private Tablet tab;
public void insert(Desktop d) {
desk = d;
}
public void insert(NoteBook n) {
note = n;
}
public void insert(Tablet t) {
tab = t;
}
public Desktop selectDesktop() {
return desk;
}
public NoteBook selectNoteBook() {
return note;
}
public Tablet selectTablet() {
return tab;
}
}
1-1. ElectronicRun 클래스
package com.kh.chap01_poly.part02_electronic.run;
import com.kh.chap01_poly.part02_electronic.controller.ElectronicController1;
import com.kh.chap01_poly.part02_electronic.model.vo.Desktop;
import com.kh.chap01_poly.part02_electronic.model.vo.Electronic;
import com.kh.chap01_poly.part02_electronic.model.vo.NoteBook;
import com.kh.chap01_poly.part02_electronic.model.vo.Tablet;
public class ElectronicRun {
public static void main(String[] args) {
ElectronicController1 ec = new ElectronicController1();
ec.insert(new Desktop("삼성","데스크탑",1200000,"GTX 1070"));
ec.insert(new NoteBook("LG","그램",2000000,3));
ec.insert(new Tablet("애플","아이패드",500000,false));
System.out.println(ec.selectDesktop());
System.out.println(ec.selectNoteBook());
System.out.println(ec.selectTablet());
}
다형성 적용 후
2. ElectronicController2 클래스
package com.kh.chap01_poly.part02_electronic.controller;
import com.kh.chap01_poly.part02_electronic.model.vo.Electronic;
public class ElectronicController2 {
private Electronic[] elec = new Electronic[3];
public void insert(Electronic any, int index) {
elec[index] = any;
}
public Electronic select(int index) {
return elec[index];
}
public Electronic[] select() {
return elec;
}
}
2.2 ElectronicRun 클래스
package com.kh.chap01_poly.part02_electronic.run;
import com.kh.chap01_poly.part02_electronic.controller.ElectronicController2;
import com.kh.chap01_poly.part02_electronic.model.vo.Desktop;
import com.kh.chap01_poly.part02_electronic.model.vo.Electronic;
import com.kh.chap01_poly.part02_electronic.model.vo.NoteBook;
import com.kh.chap01_poly.part02_electronic.model.vo.Tablet;
public class ElectronicRun {
public static void main(String[] args) {
ElectronicController2 ec2 = new ElectronicController2();
ec2.insert(new Desktop("삼성","데스크탑",1000000,"Gtx1070"),0);
ec2.insert(new NoteBook("LG","그렘",2000000,3), 1);
ec2.insert(new Tablet("애플","아이패드",500000,false), 2);
System.out.println("===== 다형성 적용 후 =====");
System.out.println(ec2.select(0));
Electronic[] elec = ec2.select();
System.out.println("elec : "+ elec);
System.out.println();
for(int i=0; i<elec.length;i++) {
System.out.println(elec[i]);
}
}
}