▸JAVA/기본 상식

객체지향 언어의 특징(다형성) [4/4]

코데방 2019. 12. 9.
728x90

4. 다형성

  • 하나의 클래스나 메소드가 다양한 방식으로 동작이 가능한 것을 의미
  • 부모클래스가 자식클래스의 값으로 대체되는 오버라이딩
  • 같은 메소드의 매개변수(parameter)에 따라 다르게 동작하는 오버로딩

 

다형성 또한 상속과 마찬가지로 객체지향 고유의 특징입니다.

예를 들어 C언어에서 아래와 같은 프로그램을 만들었다고 가정하겠습니다.

 

객체지향 언어의 특징(다형성) [4/4]

 

서로 입력값의 갯수 또는 타입이 다르기 때문에 모두 다른 함수로 만들어줘야 합니다. "인자값을 받아서 특정한 결과값을 출력한다"라는 공통적인 행위이지만, 각자 개별적이고 독립적인 함수(일종의 객체)로 실행됩니다. 우리가 한 파일에다가 함수들을 모아둘 순 있지만 기본적으로 저 함수들은 그냥 서로 연관성이 1도 없는 개별적 함수들로 존재합니다.

저런 게 10가지가 있다면 서로 다른 함수를 10개 만들어야 합니다. 이름 짓기도 힘들겠네요.

print_2num(), print_3num(), print_str... 등으로 이름 짓다보면 나중에 사용할 때 엄청 복잡해질 가능성이 높습니다. 큰 프로그램은 함수가 수백, 수천개가 될텐데 같은 기능을 하는 미묘하게 다른 함수들이 엄청 많다면 나중에 찾는것도 힘들게 됩니다.

 

객체지향 언어의 특징(다형성) [4/4]

 

 

 


 

Java (객체지향)에서는 위의 로직을 바라보는 기준이 다릅니다. 행동(메소드)를 미리 명령해두고(메소드 실행), 클래스(객체) 따라 행동을 달리하도록 합니다. 절차지향과는 다르게 클래스 자체가 어떤 행동을 해야 할지 가지고 있기 때문입니다.

[ 오버라이딩 ]

  • 부모클래스에서 상속받은 내용을 자식클래스에서 재정의
  • 재정의한 내용을 다시 부모클래스에 덮어쓸 수 있도록 함

Java에서는 함수(메소드)를 호출한다기 보다는 해당 클래스를 호출하는 것에 더 가깝다고 볼 수 있습니다. 예를 들어 C언어에서는 불려오는 사람에 따라 써야 하는 무기를 지급해 주는 개념이라면, Java에서는 불려오는 사람이 각자의 무기를 가지고 있어서 필요한 사람을 불러오면 알아서 가지고 있는 무기를 발사하는 개념인 것이죠.

객체지향 언어의 특징(다형성) [4/4]

실제 사용 예시는 아래 링크된 글을 참조하시면 됩니다.

 

2019/12/10 - [JAVA/기본 문법] - 다형성의 활용 (오버라이딩)

 

 


 

[ 오버로딩 ]

  • 같은 메소드의 parameter(매개변수)가 다를 경우 각기 다른 행위를 함

이 부분은 정말로 C언어에 비해 혁신적인 것 같습니다. C언어에서 비슷하게 구현하려면 정말 복잡하게 구현해야 합니다. 심지어 또 하나의 다른 타입을 추가해야한다고 하면 전체를 뜯어고쳐야할 수도 있습니다.

 

객체지향 언어의 특징(다형성) [4/4]

 

 


 

원래 함수 실행을 시키는 코드는 컴파일 될 때 해당 함수의 내용이 들어있는 메모리를 이미 가리키고 있습니다. 이를 정적 바인딩이라고 합니다. 하지만 실제 실행(런타임)시까지 어떤 함수를 실행시킬지 알 수 없다는 다형성의 특성 상, 런타임 시에 어떤 함수를 실행할지 결정하는 동적 바인딩이 적용 됩니다. 메모리에 관해서는 다음번에 다시 다뤄보도록 하겠습니다.

 

 

 

728x90

댓글