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