4. 다형성
- 하나의 클래스나 메소드가 다양한 방식으로 동작이 가능한 것을 의미
- 부모클래스가 자식클래스의 값으로 대체되는 오버라이딩
- 같은 메소드의 매개변수(parameter)에 따라 다르게 동작하는 오버로딩
다형성 또한 상속과 마찬가지로 객체지향 고유의 특징입니다.
예를 들어 C언어에서 아래와 같은 프로그램을 만들었다고 가정하겠습니다.
![객체지향 언어의 특징(다형성) [4/4] 객체지향 언어의 특징(다형성) [4/4]](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
서로 입력값의 갯수 또는 타입이 다르기 때문에 모두 다른 함수로 만들어줘야 합니다. "인자값을 받아서 특정한 결과값을 출력한다"라는 공통적인 행위이지만, 각자 개별적이고 독립적인 함수(일종의 객체)로 실행됩니다. 우리가 한 파일에다가 함수들을 모아둘 순 있지만 기본적으로 저 함수들은 그냥 서로 연관성이 1도 없는 개별적 함수들로 존재합니다.
저런 게 10가지가 있다면 서로 다른 함수를 10개 만들어야 합니다. 이름 짓기도 힘들겠네요.
print_2num(), print_3num(), print_str... 등으로 이름 짓다보면 나중에 사용할 때 엄청 복잡해질 가능성이 높습니다. 큰 프로그램은 함수가 수백, 수천개가 될텐데 같은 기능을 하는 미묘하게 다른 함수들이 엄청 많다면 나중에 찾는것도 힘들게 됩니다.
![객체지향 언어의 특징(다형성) [4/4] 객체지향 언어의 특징(다형성) [4/4]](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
Java (객체지향)에서는 위의 로직을 바라보는 기준이 다릅니다. 행동(메소드)를 미리 명령해두고(메소드 실행), 클래스(객체) 따라 행동을 달리하도록 합니다. 절차지향과는 다르게 클래스 자체가 어떤 행동을 해야 할지 가지고 있기 때문입니다.
[ 오버라이딩 ]
- 부모클래스에서 상속받은 내용을 자식클래스에서 재정의
- 재정의한 내용을 다시 부모클래스에 덮어쓸 수 있도록 함
Java에서는 함수(메소드)를 호출한다기 보다는 해당 클래스를 호출하는 것에 더 가깝다고 볼 수 있습니다. 예를 들어 C언어에서는 불려오는 사람에 따라 써야 하는 무기를 지급해 주는 개념이라면, Java에서는 불려오는 사람이 각자의 무기를 가지고 있어서 필요한 사람을 불러오면 알아서 가지고 있는 무기를 발사하는 개념인 것이죠.
![객체지향 언어의 특징(다형성) [4/4] 객체지향 언어의 특징(다형성) [4/4]](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
실제 사용 예시는 아래 링크된 글을 참조하시면 됩니다.
2019/12/10 - [JAVA/기본 문법] - 다형성의 활용 (오버라이딩)
[ 오버로딩 ]
- 같은 메소드의 parameter(매개변수)가 다를 경우 각기 다른 행위를 함
이 부분은 정말로 C언어에 비해 혁신적인 것 같습니다. C언어에서 비슷하게 구현하려면 정말 복잡하게 구현해야 합니다. 심지어 또 하나의 다른 타입을 추가해야한다고 하면 전체를 뜯어고쳐야할 수도 있습니다.
![객체지향 언어의 특징(다형성) [4/4] 객체지향 언어의 특징(다형성) [4/4]](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
원래 함수 실행을 시키는 코드는 컴파일 될 때 해당 함수의 내용이 들어있는 메모리를 이미 가리키고 있습니다. 이를 정적 바인딩이라고 합니다. 하지만 실제 실행(런타임)시까지 어떤 함수를 실행시킬지 알 수 없다는 다형성의 특성 상, 런타임 시에 어떤 함수를 실행할지 결정하는 동적 바인딩이 적용 됩니다. 메모리에 관해서는 다음번에 다시 다뤄보도록 하겠습니다.
'▸JAVA > 기본 상식' 카테고리의 다른 글
Java의 메모리 구조_기본 구조[1/3] (1) | 2019.12.09 |
---|---|
클래스, 인스턴스, 객체의 차이 (0) | 2019.12.09 |
객체지향 언어의 특징(상속) [3/4] (0) | 2019.12.09 |
객체지향 언어의 특징(캡슐화) [2/4] (0) | 2019.12.09 |
객체지향 언어의 특징(추상화) [1/4] (0) | 2019.12.09 |
댓글