본문 바로가기
JAVA

[Java] 객체 지향 vs 성능

by doodoom 2023. 3. 9.

0. 이 글을 쓰는 이유

페어 프로그래밍을 하던 중 페어와 성능에 대한 의견이 충돌한 적이 있었다. 객체 지향적으로 코드를 짜다보면 성능이 완벽하지 않은 코드가 생기는 경우가 많다. 예를 들어, for문 하나에서 A, B 둘 다 처리할 수 있는데 역할에 따라 객체를 분리하다보면 각각 for문을 도는 경우가 생긴다. 이럴 경우 어떤 것을 선택하는 것이 맞을까?

1. 객체 지향의 목적

우리는 자바를 비롯한 객체 지향 언어들을 왜 사용할까? 단순히 기능을 구현하기 위해서라면 사실 어떤 언어든 상관없다. 하지만 우리가 객체 지향 언어를 사용하는 이유 중 가장 큰 이유는 유지보수 하기 쉬운 코드를 짜기 위함이다. 유지 보수하기 좋은 코드(객체 지향적인 코드)는 누구든 이해할 수 있게 책임과 역할이 잘 분리되어있음을 의미 하기도 한다.
어플리케이션이 커지고 관여하는 개발자가 많아지다보면 코드는 점점 더 복잡해지고 가독성이 떨어지게된다. 객체 지향은 이러한 문제를 해결하고자 생긴 개념이라고 볼 수 있다.

2. 성능 지향

프로그래밍에서 성능은 무시할 수 없는 부분이다. 실행되는 코드는 최대한 빠르고 메모리를 적게 쓸 수록 자원을 효율적으로 쓴다고 표현한다. 하지만 자바와 같은 객체 지향 언어에서의 우선 순위는 아니라고 본다. 성능을 1순위로 하고싶으면 애초에 C, C++ 과 같이 개발자가 직접 메모리 할당 및 해제를 관리할 수 있는 언어를 선택하는게 낫다.
그리고 특히 요즘에는 성능적인 부분은 하드웨어에서 많이 해결하는 사례가 많다고한다.

3. 코드 중복 제거

서로 비슷한 목적을 가지고있는 도메인 모델 A,B가 있다고 하자. 초기에는 코드 중복을 줄이기위해 공통의 코드를 사용하고 있었다. 하지만 점점 어플리케이션의 사이즈가 커지다보니 A,B는 분화 되기 시작 했고, A의 기능을 수정하려고 하다보면 B가 영향을 받는 문제점이 생기기 시작했다. 결국 개발자는 이 둘의 코드를 완전히 분리해서 짜기로 결정 하게된다.
위의 예시처럼 코드 중복에 너무 집중하다보면 자기도 모르게 어떤 코드에 너무 의존적인 로직이 만들어지고, 그 로직이 변경되면 신경 쓰지 않고있었던 어떤 코드에 대참사가 일어날 수 있다. 예전에는 하드웨어가 비싸서 최대한 중복을 줄여야했지만, 요즘은 개발자가 사이드 이펙트 범위를 예상하고, 인지하고, 조심하고, 관리하는 비용이 더 크게 받아들여지는 것 같다.

4. 자바의 특성

자바는 c, c++ 같은 언어와 다르게 힙 메모리 관리를 GC에게 맡긴다. 이 말은 즉슨 '메모리 관리는 우리가 해줄테니까 개발자는 가독성과 유지보수성에 집중해'라는 메세지와 같다고 생각한다. 그러므로 우리는 GC를 믿고 가독성과 유지보수성이 좋은 객체지향적인 코드를 짜면 된다.

3. 우선 순위

객체 지향으로 대규모 어플리케이션을 개발하면서 가독성, 유지보수성을 포기하고 성능을 우선 순위에 두기에 잃는게 더 많은 것 같다. 그렇다고 성능이 중요하지 않다는 것은 아니다. 다만, 성능을 우선시 하기에는 객체 지향에서 신경 써야하는 부분이 더 많고 중요하다는 것이다.

'JAVA' 카테고리의 다른 글

[JAVA] TDD란?  (0) 2023.04.09
[JAVA] 불변 클래스  (0) 2023.03.24
[JAVA] 객체 안의 public api 선정 기준  (0) 2023.02.28
[JAVA] Reflection  (1) 2022.10.06
[JAVA] equals와 hashcode  (0) 2022.09.28