JAVA

JAVA 다형성: 객체 지향 프로그램의 4가지 특징[추상화, 상속, 다형성, 캡슐화]

anjoo24 2024. 1. 28. 18:41

 

 Java는 객체를 기반으로 하는 객체 지향 프로그래밍(Object-Oriented Programming : OOP)이다. 객체 지향 프로그램에는 추상화, 상속, 다형성, 캡슐화라는 4가지 주요한 특징이 있다.

 

다형성이란(Polymorphism)?

 

 그 중 다형성은 Polymorphism이라는 영어 단어에서 알 수 있듯이 다양한 형태를 뜻한다. 즉, 자바에서는 하나의 객체가 여러 타입을 가질 수 있는 것을 말한다.

 

예를 들어,

 

1. 부모클래스

public class Parent {
    public void parentMethod(){
    
        System.out.println("부모메서드");
    }
}

 

2. (Parent를 상속받은) 자식클래스

public class Child extends Parent{
    public void childMethod() {
    
        System.out.println("자식메서드");
    }
}

 

3. 메인클래스

public class PolyMain {
    public static void main(String[] args) {
    
        Parent parent = new Parent(); //메모리에 부모만 생성
        Child child = new Child(); //메모리에 부모와 자식 모두 생성
        Parent polyParent = new Child(); //부모는 자식을 담을 수 있다.
        Child polyChild = new Parent(); //오류발생: 자식은 부모를 담을 수 없다.

 

 여기서 자식객체가 하나가 아닌 여러개가 있어도 동일한 규칙이 적용되며, 이처럼 한 객체가 여러 타입의 객체를 만들 수 있는 것을 다형성이라고 부른다. 만약 자식객체 Child 아래에 Child를 상속받은 손자 객체 GrandChild가 있어도 Parent 클래스로 GrandChild를 부를 수 있다(Parent a = new GrandChild(); // 성립)

 

 

 

+

이 부분을 배우면서

왜 자식은 부모를 담을 수 없는지 고민해 보았다.

 

자식이 부모를 담을 수 없는 이유

 

 

위의 메인클래스 코드를 일부 가져와서

먼저 부모가 자식을 담을 경우,

 

        Parent polyParent = new Child();  //부모는 자식을 담을 수 있다.

 

 Parent 라는 변수로 자식 객체를 참조해서 polyParent 객체를 만든다. 메모리에는 Parent와 Child가 모두 생성된다. 나는 Parent 라는 틀을 가지고 Child의 메모리에 담는다고 이해했다. 

 

 

반대로

자식이 부모를 담는 경우,

 

 Child polyChild = new Parent();  //오류발생: 자식은 부모를 담을 수 없다.

 

 Child 라는 변수로 부모 객체를 참조해서 polyChild라는 객체를 만든다. 나는 Child의 틀로 Parent의 메모리에 담아야 하는데 Parent의 메모리가 Child보다 작기 때문에 담을 수 없다고 이해했다.