[Java 기초] 객체지향언어의 특성 2. 다형성

김재희·2023년 10월 15일
0
post-custom-banner

객체지향언어의 특성

2. 다형성(Polymorphism)

객체가 다양한 형태를 가질 수 있음을 의미하며, 상속 받아 만들어진 파생클래스를 통해 다형성을 보여줄 수 있다. 오버로딩은 메서드 중복 정의, 오버라이딩은 메서드 재정의를 뜻한다.

🔶 특징

  • 같은 자료형이거나 상속관계에서만 객체 간의 대입연산 가능
  • 다형성 멤버필드의 법칙
    • 업캐스팅(자동형변환)
      자식의 생성자로 부모의 객체를 만드는 것이며, 멤버필드의 접근은 super멤버필드만 가능하다.
    • 다운캐스팅(강제형변환)
      부모의 객체값으로 자식의 객체를 만드는 것이며, 강제형 변환을 해야한다. 부모의 객체값이 반드시 업캐스팅된 상태일때만 가능하다.
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의 값을 가리키게 만들어줌
		*/
	}
}

🔶 오버라이딩과 오버로딩

  • 오버라이딩(overriding)
    '메소드의 재정의'이며, 자식 클래스에서 부모 클래스의 메소드를 재정의하여 다양한 형질의 특성을 가질 수 있다.
// 오버라이딩 예시
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("허겁지겁 먹는다.");
    }
}
  • 오버로딩(overloading)
    '메소드의 중복 정의'이며, 메소드의 이름이 같고 매개변수의 유형과 개수를 여러 타입으로 지정해 다양한 형질의 특성을 가질 수 있다.
// 오버로딩 예시
public Class Animal {
	int legs;
    public eat(food1) {}
    public eat(food1, food2) {}
    public eat(food1, food2, plant) {}
}



참고

profile
소통하며 협업하는 신입 백엔드 개발자입니다.
post-custom-banner

0개의 댓글