티스토리 뷰

Java+Spring/Java

[Java]다형성(Polymorphism)

Vagabund.Gni 2022. 7. 15. 22:37
728x90
반응형

다형성(Polomorphism)이란 자바의 객체지향 프로그래밍의 네 가지 기둥 중 하나이자,

 

객체지향 프로그래밍에서 가장 중요하다고 할 수 있는 부분이다.

 

자바에서 다형성이란 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미한다.

 

자바 프로그래밍에서 다형성이란 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것이며,

 

더 직관적으로 보자면 상위 클래스 타입의 참조변수를 통해 하위 클래스의 객체를 참조할 수 있도록 허용된 것이라 할 수 있다.

 

도대체 무슨 말인지 잘 감이 오지 않는데, 다음의 쉬운 예를 보자.

//참조변수의 다형성 예시

class Friend {

    public void friendInfo() {
    
        System.out.println("나는 당신의 친구입니다.");
    
    }
}

class BoyFriend extends Friend {
    
    public void friendInfo() {
    
        System.out.println("나는 당신의 남자친구입니다.");
    
    }
}

class GirlFriend extends Friend {   
    
    public void friendInfo() {
    
        System.out.println("나는 당신의 여자친구입니다.");
    
    }
}

public class FriendTest {

    public static void main(String[] args) {
    
        Friend friend = new Friend(); // 객체 타입과 참조변수 타입의 일치
        BoyFriend boyfriend = new BoyFriend();
        Friend girlfriend = new GirlFriend(); // 객체 타입과 참조변수 타입의 불일치

        friend.friendInfo();
        boyfriend.friendInfo();
        girlfriend.friendInfo();
    
    }
}

// 출력 결과
나는 당신의 친구입니다.
나는 당신의 남자친구입니다.
나는 당신의 여자친구입니다.

이전까지의 글에서 객체를 생성할 때 객체의 타입과 참조변수 타입을 일치시켜 왔다.

 

위의 예에서 friend 객체와 boyfriend 객체가 그 예라고 할 수 있다.

 

그런데 그 다음 라인에선 GirlFriend 클래스의 객체를 생성하고 Friend 타입의 참조변수 girlfriend에 할당하고 있다.

 

원래대로라면 타입을 일치시키기 위해 GirlFriend를 참조변수의 타입으로 지정해주어야 하지만

 

그러지 않고 상위 클래스 Friend를 참조변수의 타입으로 지정해준 것이다.

 

이 경우, 상위 클래스를 참조변수의 타입으로 지정했기 때문에 참조변수가 사용할 수 있는 멤버의 개수는 상위 클래스의 멤버의 수가 된다.

 

이것이 앞서 정의했던 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조하는 것이자 다형성의 핵심이다.

 

다음으로 기억해두어야 할 사실은 상위 클래스의 타입으로 하위 클래스 타입의 객체를 참조하는 것은 가능하지만,

 

그 반대는 불가능하다는 점이 있다.

 

다음의 예를 보자.

public class FriendTest {

    public static void main(String[] args) {
    
        Friend friend = new Friend(); // 객체 타입과 참조변수 타입의 일치 -> 가능
        BoyFriend boyfriend = new BoyFriend();
        Friend girlfriend = new GirlFriend(); // 객체 타입과 참조변수 타입의 불일치 -> 가능
	//  GirlFriend friend1 = new Friend(); -> 하위클래스 타입으로 상위클래스 객체 참조 -> 불가능

        friend.friendInfo();
        boyfriend.friendInfo();
        girlfriend.friendInfo();
        
    }
}

Friend 타입으로 하위 클래스 GirlFriend를 참조하는 것은 가능하지만,

 

하위 클래스 GirlFriend로 상위 클래스 Friend 타입을 참조하는 것은 불가능함을 볼 수 있다.

 

이는 Friend 타입의 참조변수보다 GirlFriend타입의 참조변수의 멤버가 더 많기 때문인데,

 

멤버를 줄이는 것은 가능해도 늘리는 것은 구현되어있지 않기 때문이라고 한다.

 

또한, 앞에서 살펴봤던 오버로딩과 오버라이딩도 다형성의 한 예시라 할 수 있는데

 

둘 다 같은 이름의 메서드를 재사용/덮어쓰기로 사용하기 때문에 글 처음에 언급했던

 

하나의 객체가 여러가지 타입을 가질 수 있는 것이라는 다형성의 정의에 부합하기 때문이다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함