객체가 다양한 형태를 가질 수 있음을 의미하며, 상속 받아 만들어진 파생클래스를 통해 다형성을 보여줄 수 있다. 오버로딩은 메서드 중복 정의, 오버라이딩은 메서드 재정의를 뜻한다.
class Point2d{
int x;
int y;
public Point2d() {
x=100;
y=125;
}
public void disp() {
System.out.println("좌표 : ["+x+","+y+"]");
}
}
class Point3d extends Point2d{
int z; //멤버필드 : x, y, z
public Point3d() {
//super(); - 생략됨, x=100; y=125;
z = 270;
}
@Override
public void disp() {
System.out.println("좌표 : ["+x+","+y+ ","+z+"]");
}
}
public class Exam_01 {
public static void main(String[] args) {
Point2d p2 = new Point3d(); //업캐스팅(자식의 생성자 Point3d로 부모의 객체 p2를 만든다)
Point3d p3 = (Point3d)p2; //다운캐스팅 - 강제형변환, 반드시 업캐스팅된 객체를 사용해야한다.
//z값을 어떻게 채울지 몰라서 에러남
/*
Point3d p3 = new Point3d();
Point2d p2 = p3; //업캐스팅 - 자동형변환
System.out.println("p2.x = "+p2.x);
System.out.println("p2.y = "+p2.y);
//System.out.println("p2.z = "+p2.z);//자식이 만든 멤버필드는 접근할 수 없다
System.out.println("p3.x = "+p3.x);
System.out.println("p3.y = "+p3.y);
System.out.println("p3.z = "+p3.z);
*/
/*
Point2d ap = new Point2d();
Point2d bp = ap; //bp는 new가 없기때문에 힙에 들어가지않아서 ap의 값을 가리키게 만들어줌
ap.disp();
bp.disp();
ap.x=270;
ap.disp();
bp.disp(); //bp는 new가 없기때문에 힙에 들어가지않아서 ap의 값을 가리키게 만들어줌
*/
}
}
// 오버라이딩 예시
public Class Animal {
int legs;
public eat() {}
}
public Class Cat {
int legs;
public eat() {
super.eat();
System.out.println("조용히 먹는다.");
}
}
public Class Dog {
int legs;
public eat() {
super.eat();
System.out.println("허겁지겁 먹는다.");
}
}
// 오버로딩 예시
public Class Animal {
int legs;
public eat(food1) {}
public eat(food1, food2) {}
public eat(food1, food2, plant) {}
}
참고
- 유니티 객체지향의 진화, 다형성 https://blog.naver.com/i_am_gamer/223194300653
- 「개발자가 되기 위해 꼭 알아야 하는 IT용어」서적