본문 바로가기
IT 공부/공부하며 드는 의문들

왜 자바는 모든 것을 class로 처리하려는 것일까? (주절주절)

by exdus3156 2023. 10. 30.
공부하면서 느끼는 제 개인적인 생각과 감정입니다...

 

  • 자바는 클래스에서 시작해서 클래스로 끝난다. 처음부터 객체지향 설계 언어를 목표로 만들어진 언어라 그런가 싶다.

 

  • 하지만 본질적으로 서로 다른 존재인 데이터 구조와 객체가 동등한 문법에 의해 만들어지는 것이 뭔가 불편하게 느껴진다.

 

  • 데이터구조는 C언어의 struct와 비슷하다. 말 그대로 다양한 데이터타입을 묶어 개발자가 새롭게 정의한 데이터 타입이다. 대표적인 예로 직교좌표계의 점, 2차원의 벡터를 들 수 있다.
  • 객체는 객체지향에서 말하는 바로 그 객체다. 객체를 정의하기가 쉽지 않지만, 객체지향에서 객체는 특정한 일에 특화된 작은 모듈이라 할 수 있다. 이때 그 구현은 외부로 드러나지 않아야 한다. 이것이 캡슐화(Capsulation) 개념이다. 만약 외부로 드러내는 메소드(일종의 API)의 구현에 필요한 재료들이 있다면 그것이 데이터든 혹은 다른 분리된 하위 메소드이든 private으로 감춰야 한다.

 

  • 데이터구조와 객체는 서로 다르다. 데이터구조는 새로운 데이터 타입으로서 외부 메소드의 인자로도 전달될 수 있다. 당연히 데이터이기 때문에 내부에 어떤 데이터들로 구성되어 있는지 그 정보가 외부로 드러나도 된다. 드러나도 상관이 없다. 새로운 데이터 타입이기 때문이다. 예를 들어, 자바의 String은 누구나 그 데이터가 String 타입이라는 것을 알고 있다. 굳이 숨겨야 할 이유가 없다. 데이터 그 자체이기 때문이다.

 

  • 이렇듯 서로 다른 본질과 목적을 가지고 있다면 서로 분리하는 것이 맞지 않을까? 설령 비슷한 원리로 생성된다고 해도 프로그래밍 언어 차원에서 심볼로 구분해야 하는 것이 좋아보일 것 같다. 객체는 class로, 자료구조는 struct 같은 심볼로 만들어내면 문제가 없을 것 같은데... 

 

  • 가끔 java bean 규격을 보면 순수한 자료구조로 사용되면서도 굳이 값 객체(value object)라는 말을 쓰면서까지.. 어떻게든 객체처럼 보이게 하는 경우가 있다. 그래서 온갖 get, set 메소드가 난립한다. 하도 써서 그런지 이클립스와 같은 IDE에서 아예 단축키로 지원까지 해준다. 그런데 아무리 생각해도 get, set은 캡슐화의 본질을 이미 벗어난 것 같은데, 그저 데이터를 private으로 묶었다 한들, 어차피 get, set으로 보여줄텐데 말이다.. 필요가 있나 싶다.

 

  • 실제로 로버트 마틴의 <클린 코드>에 보면 이런 식의 DTO 객체를 사이비 캡슐화라고 말하기까지 한다. (꼭 로버트 마틴이 책에서 이렇게 언급해서 내가 자바의 클래스와 자료구조에 대한 의문을 가지는 것은 아니다. 난 원래 C언어로 먼저 프로그래밍을 배워서 그런지 오히려 struct의 유용성을 버리고 억지로 객체에 집착하는 자바가 원래 낯설었다.)

 

  • 내가 객체지향 설계에 대해 잘 아는 바는 아니지만, 객체지향의 원리를 보다보면 나는 객체가 아주 작은 프로그램, 혹은 웹서버와 비슷하다고 생각한다. 크게 보면 웹에서 프론트엔드측이 백엔드의 API를 요청하는 것과 비슷하다. 클라이언트가 데이터를 주고, 서버가 처리를 요청하고, 결과를 전송한다. 이런 모듈들이 서로 협력하는 것이 객체지향이다.

 

  • 객체가 컴퓨터에 가깝다면, 자료구조는 그냥 데이터 그 자체다. 적어도 내가 받아들이기로는 그렇다. 그런데 자바에서는 이 둘을 명확하게 구분하지 않고 모두 class로 만들어버린다. 그래서 솔직히 헷갈린다..

 

  • 그래서 DTO는 참 난잡하다. 아주 간단한 자바 백엔드 웹 서버를 만들기 위해 초보용 교과서를 읽으며 컨트롤러, 서비스 레이어, 데이터베이스 등 레이어를 나눠가며 일일이 그 사이를 오가는 DTO를 만든 적이 있었다. 정말 너무 귀찮았다. 왜 만들어야 하는지는 알고 있었다. 힘들었던 원인은 서비스 클래스와 DTO가 모두 같은 class 문법으로 만들어진다는 것이다.

 

  • 객체를 작은 컴퓨터에, 데이터구조를 데이터에 비유한 내 설명이 어느정도 객체지향을 설명하는 부분이 있다고 한다면, 아무리 생각해도 데이터구조를 class를 이용해 객체(컴퓨터)로 만들어버리는 것이 이상하다.

 

  • 쉽게 비유하자면, 외장 하드 디스크(데이터)를 요청했는데 소형 컴퓨터(객체)가 딸려 와서는 전원을 키고 폴더를 열어서 그 안에 있는 데이터를 보는 느낌이랄까??? 그러니까 왜 굳이 이렇게 해야하는 거지? 취업하고 공부하다보면 내가 알 수 없는 어떤 진리가 숨어있는걸까? 취업하고 경험 많은 개발자 선배한테 물으면 의문이 해소되겠지....