JAVA 다형성과 동적 바인딩의 필요성

#JAVA010 #상속 #다형성 #동적바인딩
Dec 22, 2023
JAVA 다형성과 동적 바인딩의 필요성
 
 

🍐 개요

자바에서 다형성 기능을 제공하는 주된 이유는 코드의 재 사용성, 유연성 그리고 확장성을 높이기 위함이다. 다형성은 객체 지향 프로그래밍의 핵심 원리 중 하나로, 프로그램을 더 효율적이고 관리하기 쉽게 만들어 준다. 이는 곧 개발자들이 프로그램을 유지 보수하는 대에 있어서 제공해주는 장점들을 제공해준다.
 

🍅 개발자에게 다형성이 필요한 이유

다형성이 유지 보수에 필요한 이유는 다음과 같은 측면으로 설명이 가능하다.
 
 
재사용성과 확장성이 좋아진다.
기존의 라이브러리를 재사용하고 새로운 기능을 추가하기가 쉬워진다. 이는 코드 베이스를 안정적으로 유지하면서도 필요에 따라 새로운 기능을 쉽게 추가 할 수 있게 해준다. 이는 고객이 새로운 사항을 요구할 시에 시스템을 쉽게 수정할 수 있게 된다.
 
오류의 영향 범위 최소화
시스템의 한 부분을 수정하더라도 다른 부분에 미치는 영향이 줄어든다. 이는 곧 코드의 결합도를 낮춰준다고 표현 할 수 있는데, 한 부분에서의 오류가 전체적으로 번지지 않게 시스템의 안정성이 높아진다고 할 수 있다. 이는 신입 개발자들과 협업시 발생할 수 있는 다양한 오류의 가능성을 줄여준다.
모듈성 향상
다형성은 코드를 모듈화 하는 데 도움이 된다. 모듈화된 코드는 각 부분이 독립적으로 기능하기 때문에 유지 보수가 더 쉬워진다. 이 때문에 전체 시스템에 대한 이해가 없이도 특정 부분의 수정이 가능해진다.
 
테스트와 디버깅 용이성
다형성을 사용하는 코드는 테스트와 디버깅이 더 쉽다. 다형성을 활용하면 유사한 동작을 하는 여러 객체들을 일관된 방식으로 처리할 수 있어, 테스트 케이스 작성이 간소화된다. 이런 일관된 동작 방식 덕분에 디버깅에 있어서도 수월해 진다.
 
 

🍍 동적 바인딩 개념

다형성의 여러가지 장점을 십분 활용하기 위해서는 동적 바인딩이라는 것을 이해 해야될 필요가 있는데, 이는 메소드 오버 라이딩을 가능하게 하는 핵심 매커니즘이다. 예를 들어서 설명하겠다.
 
부모 ‘Protoss’와 상속된 클래스들
notion image
코드의 구성을 위 그림과 같이 만들었다고 가정해 보자. 프로토스라는 종족에 다양한 개체들이 생성이 되었다. 이 다양한 객체들이 전투에 나가서 싸우는 것을 가정으로 프로그래밍을 한다면, 어떻게 될까??
 
실제로 네 개의 객체가 있는 것 만으로도 전투에서 2의 4승, 즉 16가지의 경우의 수를 만들어 낸다. 이를 코드로 표현한다면 이런 모습이 된다.
 
notion image
이 4개의 객체만 있어서 이런 경우의 수를 만들어 내는데, 스타크래프트를 해보신 분들은 아시겠지만, 거기에는 수많은 객체가 출현한다. 그럼 그 많은 경우의 수를 다 이렇게 일일이 코드로 작성이 해야될까???
 
이런 노가다(?)작업을 효율적으로 해결할 수 있는 것이, 동적 바인딩의 개념이라고 보면 쉽다.
 
 

🍒 동적 바인딩의 동작원리

자 위의 노가다 코드를 어떻게 동적 바인딩으로 풀어내야 되는지 살펴보자. 동적 바인딩에는 상속을 해주는 부모 클래스의 메소드를 다양한 형태로 자식 클래스에서 오버 라이딩이 되어야한다. (다양한 형태이지만 오버 라이딩의 문법은 부모의 메소드와 같은 이름으로 연결된다.)
 
일단 부모 “Protoss”클래스를 생성해서 아래와 같이 오버라이딩 될 수있는 메소드를 만들어야 된다.
부모 “Protoss”클래스
부모 “Protoss”클래스
  • attack()메소드에 아무것도 없어서 이게 뭐지 싶을 수도 있지만, 이는 오버 라이딩을 위한 문법이라 생하고 받아들이자.
 
 
자식 “Dragoon”클래스
자식 “Dragoon”클래스
  • 자식인 “Dragoon”클래스에서 부모인 “Protoss”extends한 모습을 볼 수 있다.
  • 그리고 부모 클래스에 정의되어 있던 attack()메소드를 같은 이름으로 다시 정의 되었다.
  • 이는 힙 메모리에 해당 객체가 호출이 될 때 attack()메소드가 재정의 되어서 동적 바인딩이 런타임에 결정이 된다.
 
 
notion image
  • new키워드로 객체 생성시 자식클래스는 부모클래스로 업 캐스팅 (Up casting)이 가능하여, 일괄적으로 gameStart의 생성자에 변수로 대입이 가능하게 된다. 즉, 객체 생성할 때마다 초기화 해야 되는 일이 사라졌다.
  • u1.attack() u2.attack()이 호출 되는 부분에서 동적바인딩이 사용된다. 프로그램이 실행 될 때 JVM은 ‘u1’ ‘u2’가 실제로 가리키고 있는 객체의 타입을 확인하고, 해당 타입에 오버라이드된 ‘attack()’ 메소드를 실행한다.
  • 이제 아까 난잡했던 노가다 코드는 아래 코드로 간결해짐으로서 가독성이 많이 좋아 졌다. 이제는 간단히 호출만 해주면 되는 것이다.
 
 
💡
따라서, 동적 바인딩은 개발자들에게 다형성 구현, 코드 유지 보수 용이, 재사용성 증진, 확장성 향상, 디버깅 개선등의 효율성을 향상시킨다는 것을 알수있다. 그러므로 프로그램 개발 시에 적극 활용 해야되는 도구로서 사용되고 숙지하고 있어야 된다고 할 수 있겠다.
 
 
Share article

AI_Nomads