brunch

매거진 SW개발

You can make anything
by writing

C.S.Lewis

by 김민석 Apr 02. 2016

객체지향?

민주주의를 닮은 객체지향 프로그래밍

객체지향을 이해하기 위해서는 객체를 이해해야 한다. 객체는 속성과 행위로 이루어져 있다. 이렇게만 일단 알고 나오게 된 배경부터 좀 살펴보자.


그 전에 많이 쓰던 절차 지향적 프로그래밍은 속성과 행위가 분리되어 있었다. 따라서 함수를 만들고 함수를 절차에 따라서 순서를 지어주면 그에 따라 프로그램이 돌아간다. 이거 나름대로 훌륭한 모델이지만 문제가 있다. 도메인이 복잡해지고 프로그램이 커지면 전체 절차도 길어지고 복잡해져서 관리하기 힘들어진다. 거기에 멀티스레드 환경이라면 데이터를 누가 언제 어떻게 건드리게 될지 도저히 감당히 안된다. 엔터프라이즈 급 환경의 솔루션에서 객체지향적인 프로그래밍을 도입하는 가장 중요한 이유이다. 


그래서 프로그램을 잘게 나눌 필요가 생겼다(Divide & Conquer). 객체를 만들면서 전체 프로그램을 쪼갠다. 따라서 객체에는 함수와 데이터가 들어간다. 객체지향적 개념이 나오면서 전체 프로그램을 볼 필요가 없이 객체만 보면 된다. 그래서 객체는 자기만의 롤이 확실하고 군더더기가 없어야 한다. 가장 훌륭한 사진은 더 이상 뺄게 없는 사진이라고 한다. 객체도 마찬가지다. 빼고 빼고 계속 빼다 보면 그 객체만의 더 이상 분해할 수 없는 본질적인 모습만이 남는다. 그래서 우리는 객체지향의 중요한 개념 중에 하나인 SRP(Single Responsibility Principle)를 이해하게 됐다. SRP를 어겨서 그 안에 모든 걸 다 때려 넣으면 그게 바로 C와 똑같아지는 것이다.


이제 객체는 그 하나로 훌륭한 프로그램이라고 이해할 수 있게 됐다. 자기의 일은 자기가 알아서 한다. 객체를 잘 만들면 그다음부터는 그 객체를 믿고 그 객체가 할 수 있는 일은 그 객체에게 시키기만 하면 된다. 그렇게 객체들끼리 대화를 하면서 프로그램이 돌아간다. 객체 안에 있는 함수를 메소드라 부르는 것도 어떤 문제의 해결 방법이라는 뜻으로 메소드라 부른다. 


그래서 객체지향적 프로그램은 수다스럽다. 어찌 보면 민주주의와 닮아 있다는 생각도 해본다. 서로 간에 신뢰를 바탕으로 해야 할 일을 가장 잘하는 객체를 찾아서 그 일을 하기 위한 정보만 넘겨주면 된다. 그다음에는 그 객체가 알아서 한다.  이렇게 보니 절차 지향적 프로그래밍은 독재주의 같은 면이 있다. 독재주의가 무조건 나쁜 건 아니다. 훌륭한 철인이 권력을 잡으면 태평성대가 온다. 하지만 현실적으로 그런 철인이 잘 없고 있더라도 인간인지라 권력을 다 가지게 되면 결국 타락하고 그 국가의 국민은 힘들어지게 마련이다. 절차 지향적 프로그램도 만든 사람이 모든 걸 잘 컨트롤하면 좋은 프로그램이 된다. 하지만 그럴 확률이 떨어진다는 것이다. 


결국 문제는 어떻게 객체를 잘 만드느냐이다. 잘 만들고 잘 쓰면 끝인 문제인데.. 어떻게 잘 만드는가가 가장 큰 문제이다. 객체를 잘 만들려면 도메인을 잘 분석해서 객체를 잘 분류해 줘야 한다. 뭔가 비슷한 일을 하는 얘들을 잘 분류하다 보면 자연스럽게 그 도메인에 객체의 모양이 만들어진다. 그래서 우리는 객체를 만들 때 class를 사용한다. class는 classification의 약자이다. 분류를 잘 하면 좋은 객체가 만들어진다. 도메인에 대해서 잘 분석을 해서 그 안에 일어나는 일들을 성격이 맞는 얘들끼리 잘 분류하다 보면 클래스가 자연스럽게 만들어지고 클래스 간에 어떻게 협력하는지 알게 되고 의존성이 자연히 만들어진다. 


따라서, 객체 간에는 서로 잘하는 일만 부탁하면 된다. 그 안에 사실 어떤 데이터가 있는지 관심 없는 게 정상이다. 객체에 있는 데이터는 그 객체가 일을 하기 위한 것이다. 다른 객체가 그 데이터에 대해서 사실 관심이 있을 이유가 없다. 이게 바로 객체지향에서 말하는 캡슐화이다. 캡슐화에 대해서 공부하다 보면 데이터를 숨겨서 보호한다는 표현을 많이 쓰는데.. 이것도 맞지만 사실은 그런 보호적인 관점보다는 편의적인 관점이 더 크다고 생각이 된다. 내가 가진 복잡한 데이터를 볼 필요 없이 필요한 일만 나에게 알려주면 알아서 해줄게.. 이런 뜻이다. 모르는 게 약이라는 말이 딱 들어맞는 부분이다.


여기에 하나 더 들여다보자면 가끔은 어떤 일을 어떻게 하는지 까지도 숨겨준다. 내가 원하는 What만 주면 How는 그 객체가 알아서 한다. 이게 바로 객체지향에서 말하는 다형성이다. 객체의 얼굴은 그 객체를 대표하는 인터페이스(What의 묶음)이고 나는 그것만 알고 던진다. 그걸 받는 실제 객체는 감춰져 있다. 이것도 몰래 감춘다기 보다는 편의를 위해 감춰주는 거다. 이 얼마나 아름다운 모습인가. 쓰는 사람을 위해 데이터도 감추고 행위도 감춘다. 인터페이스를 통해 What만 알면 된다. 그래서 내가 원하는 일만 던지면 그 뒤에서 알아서 다 돌아간다. 뷰티풀하다. 

매거진의 이전글 Spring Boot에 AOP 적용해보기
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari