목차0. 개요
1. 객체지향 .. 외 등장한거야?
2. 객체지향 .. 어떻게 발전헸어?
3. 내가 만든 시스템에 '어느정도의 유연성과 간결함이 필요한가'
4. 결론
0. 개요
a. 객체지향이 대체 외 필요한데?사실 나는 객체지향이란 용어를 게임 프로그래밍 공부 할 때 처음 접했다. 그 전까진 '객체지향'이란 내용이 이렇게 무게감 있는 용어인지 몰랐었는데 교수님들이 수업 중간에 '자바는 객체지향'이란 말을 할 때도 사실 '고리타분한 구분을 위한 옛날 용어겠거니~' 하고 넘어갔었다.
근데 웹 개발자가 되고 나서 이것저것 공부를 하다 보니 '객체지향'의 중요성을 강조하는 곳들이 많았고 최근에는 '객체지향의 중요성을 이해 못하면 개발자 자질이 없다'라고 가스라이팅 당한 상태이다.
근데 도대체 객체지향이 뭐가 그렇게 대단한 걸까? 사실 그 전에 절차지향 개발이래봐야 c 언어로 자료구조 조금 공부하던 거 빼곤 없어서 솔직히 차이가 체감이 안된다. 또 애초에 '객체지향이 뭔지'도 정리가 잘 안된 상태로 SOLID니 DI니 파편적인 지식들을 학습하고 급하게 '객체지향의 사실과 오해' 같은 어려운 책을 끄적끄적 읽었으니 내 주관이 있을리 만무했다.b. 결론그래서 오늘은 객체지향이 왜 그렇게 중요한건지, 뭐가 그렇게 대단하길래 사람들이 이렇게 유난들을 떠는건지에 대해 내 주관을 만들어보는 시간을 가지려고한다.
1. 객체지향 .. 외 등장한거야?
a. 범행 동기객체지향이 지금 어떤 식으로 발전했고 어떻게 활용되고 있는지를 보기 전에 "애초에 만든 놈의 의도"를 먼저 파악해보려고 한다. 생각보다 범인은 명확했는데 ..
객체지향이라는 개념을 처음 적용한 건 노르웨이 컴퓨터 과학자 올레-요한 달 아저씨랑 크리스텐 니가드 아저씨다. 이 아저씨들은 '시스템과 실세계 프로세스의 복잡한 상호작용을 표현하기 위한 도구'가 필요했고 이런 목적달성을 위해 최초의 객체지향 언어인 Simula를 개발했다.Class Vehicle; // 클래스
Begin
Integer wheels; // 필드
Procedure setWheels(w); Integer w; // 메서드1
Begin
wheels := w;
End;
Procedure displayWheels; // 메서드2
Begin
OutText("Wheels: "); OutInt(wheels, 0); OutImage;
End;
End;
Vehicle Class Car; // 서브 클래스 (Vehicle을 상속받는 Class)
Begin
setWheels(4);
End;
Begin
Ref(Vehicle) myCar;
myCar :- New Car;
myCar.displayWheels;
End;
[원본]
b. 정상 참작일단 코드의 괴리감과 함께 저 사람들이 왜 '이해하기 쉽고 재사용하기 쉬운 코드'가 필요했는지 느낌이 온 거 같다. 지금이야 IDE도 있고 나름대로 일관적인 코딩 컨벤션들이 존재해서 저 때에 비해 코드 작성 난이도가 많이 내려 갔지만 위 예제같이 간단한 예제가 아닌 실제 복잡한 로직에서 Begin이라던지 End 같은 '{}'로 대체되는 불필요한 구문들이 즐비한 환경에서 "어떻게" 구현할지만을 고민한 개발은 지금보다 훨씬 많이 복잡했을 거 같다.
그래서 결론은 저 때의 객체지향은 '시스템과 실세계 프로세스의 복잡한 상호작용을 표현하기 위한 도구'의 목적으로 '처음' 개발된 것 이다. 우리는 저 내용을 '단순히 설명하는데 좋기 때문에 쓰이는 예시다'라고 오해하곤 하지만 사실은 이게 근본이다.
2. 객체지향 .. 어떻게 발전헸어?
a. 같은 목적이지만 발전된 방법
냉수마찰이 현대의 기술 발전을 통해 효과를 입증받고 고도화 되는 것 처럼 객체지향도 그 효과와 가치를 지속적으로 재평가받고 당대 개발자들에 의해 고도화 되어온 것이다. 마틴 파울러, 로버트 C. 마틴 등의 저명한 개발자들은 DI나 SOLID 같은 개념들을 정립했고 그 결과로 현재 우리가 공부하고 있는 객체지향의 형태가 만들어진 것이다.
즉, 우리가 흔히 아는 '추상화, 상속, 캡슐화, 다형성'은 Simula 언어가 세상에 처음 나오면서 객체지향의 등장과 함께 정의된 개념이고, 지금 우리가 머리 싸매면서 공부하는 DI나 SOLID 같은 것들은 다른 개발자들에 의해 정립된 개념들이다.
b. 발전 방향이제 '객체지향이 외 필요한데'에 대한 답을 할 수 있을 거 같다. 물론 '현실세계 엔터티와 프로세스 IT 레벨을 IT 레벨로 매핑하는' 이유도 결국 코드의 재사용성, 유지보수성, 확장성을 높이기 위해서임은 변치 않기 때문에 결국 객체지향은 '코드를 유연하고 간결하게' 만들기 위해서 필요한 것이다.
3. 내가 만든 시스템에 '어느정도의 유연성과 간결함이 필요한가'
a. 객체지향은 진리인가결국 객체지향을 사용하는 본질은 '코드를 유연하고 간결하게 만들기 위해서'라고 결론 지었다. 그럼 나는 "아 객체지향 쓰면 코드가 유연해지고 간결해지니까 공부해서 무조건 도입해야겠다!"라고 생각해야할까? 나는 사실 객체지향이 정말 엄격하게 지켜야하는 규칙이라는데에는 아직도 동의가 잘 안된다. 이게 어느정도의 객체지향을 준수해야 할지에 대해 견적을 낼 능력도 없을뿐더러 "시스템 마다 다 환경이 천차만별일텐데 객체지향 준수 정도를 판단할 기준도 없는데 뭘 얼만큼 어떻게 하라는겨?" 라는 생각이 들어서 그렇다.
또 가끔 보면 "객체지향 무균실"을 만들고 싶어하는 것 같은 사람들도 있는데 막상 결과를 놓고 보면 "이게 진짜 유지보수를 편하게 할 수 있도록 구조를 잡고 있는건지 명백히 의심될 때"가 있었다. '재사용성, 확장성' 만큼 '유지보수성'도 중요한 맥락인 거 같은데 몸에 좋다는 거 다 드시는 큰아버지 처럼 여기저기서 배워 온 것들 프로젝트에 다 우겨 넣으려고 하는 모습을 보면서 '저렇게 되지 않게 경각심을 가지고 공부해야겠다'라고 생각했었다.
b. 개발자로서의 본질어떤 개발자 아저씨가 하던 말이 기억나는데 '개발자는 아름다운 구조를 만들고 예쁜 코드를 짜는 사람이 아니라 결과물을 만들어내는 사람이에요' 라는 말이었다. 사실 나는 이 말에도 크게 동의하진 않지만, 어쨌든 남들과 협업을 해야하는 웹 개발자로서 저런 의견은 분명히 '외연'이기에 하나의 생각에 덜 매몰되기 위해 조금 더 주의깊게 들었다.
c. 그치만 객체지향은 중요하다사실 주변에서 객체지향 가지고 가스라이팅을 너무 많이 들어서 약간 반항기가 남아있는 상태라 부정적인 내용을 먼저 말하긴 했지만, 내가 아무리 투정을 부려도 객체지향은 말도안되게 중요한 개념이 맞다. 당장 스프링을 쓰는 이유도 객체지향을 '쉽게 잘' 지키기 위해서니 '객체지향이 필요 없다'고 하는 건 '스프링을 쓸 필요 없다'고 하는 것과 같다.
4. 결론
a. 객체지향이 필요한 이유다시 처음 질문으로 돌아가서 결론을 지어보면
1. 객체지향은 '코드의 유연성과 유지보수성'을 높이기 위해 필요한 아이디어다.
2. 우리는 객체지향 덕분에 스프링 프레임워크와 같은 도구를 이용해 쉽게 개발할 수 있게 됐다. 객체지향은 개발자에게 있어 HTTP 만큼이나 중요하다.
3. 다만 규모가 작고 확장, 재사용성이 적은 시스템에 어느정도의 객체지향적인 고민이 들어가야 하는지는 내 커리어적인 고민을 내려놓고 진실되게 답변할 필요가 있다.
오늘 하루도 공부할 수 있어 크게 감사합니다
2023-12-24 개발자 최찬혁
'질문을 해결하는 과정' 카테고리의 다른 글
[JVM] 3분만에 훑어보는 JVM의 가상 메모리 구조 (1) | 2024.01.15 |
---|---|
[Java] JVM의 메모리 구조와 GC에서 살아남는 법 (2) | 2024.01.07 |
[Java] 인사팀 과장님도 무릎을 탁 치는 자바를 컴파일 하는 과정 정리 (2) | 2024.01.03 |
[네트워크] 망사용료가 먼데 .. 도대체 왜 나 빼고 다 알아? (2) | 2024.01.03 |
[Java] Comaprable, Comparator를 샅샅히 파헤쳐보기 (2) | 2024.01.03 |