2008년 11월 26일 수요일

객체지향... 필요한가?

써니님의 "절차지향도 훌륭한데, 왜 객체지향인가?"라는 글을 읽고 객체지향에 대한 견해를 적어봅니다.


먼저 글을 읽고 계신 분이 C언어로 프로그래밍을 하시나요?
그러면 질문이 있습니다.

"static 함수를 사용하시나요? 또 static 함수의 용도를 아시나요?" "static 변수가 아닙니다."
사용하고 계시고 정확한 용도를 알고 계시면 C언어로도 객체지향 프로그래밍을 하고 계시는 것일 겁니다.

이 질문에 갸우뚱하시는 분이 계시나요?

그럼 이야기를 시작해보죠.

여기서 이슈를 다음 두 가지로 나눠야 할 것 같습니다.
  • 객체지향 프로그래밍
  • 객체지향 프로그래밍 언어사용
첫째, 객체지향 프로그래밍은 당연히 필요하다고 생각합니다. 

우선 몇 만 라인 이하의 소규모 소프트웨어를 개발할 때와 혼자서 소프트웨어를 개발할 때는 좀 논외로 하고 싶습니다. 이런 경우의 예를 들기 시작하면 사실 어떻게 해도 불편할 것도 없고 안되는 것도 없습니다.

적어도 수십만 라인의 이상의 코드를 다루고, 5,6명 또는 수십, 수백 명의 개발자들이 같이 일을 할 경우를 기준으로 생각해야 할 것 같습니다. 지금은 혼자 소규모의 소프트웨어를 개발하고 있어도 언젠가는 이런 규모의 소프트웨어를 개발하는데 참여하겠죠. 따라서 혼자서 개발을 하고 있어도 "나랑은 상관없는 얘기다"는 아닙니다.

프로그래밍에 객체지향 개념 도입된지는 매우 오래 되었습니다. 객체지향 프로그래밍 언어가 나오기 훨씬 이전부터 개발자들은 객체 지향적으로 개발을 하고 있었습니다. 그렇지 않고서는 너무 복잡해서 개발을 할 수가 없었거든요. 그 뒤로 이러한 요구를 만족시키기 위해서 객체지향 프로그래밍을 잘 할 수 있는 언어들이 나오기 시작한 거죠. 

객체지향의 기본 컨셉인 추상화, 캐슐화, 정보의 은닉 이런 것들은 오래 전부터 사용을 해왔죠.
그렇지 않고 절차적이고 구조적인 프로그래밍을 하게 되면 시스템의 규모가 커질 수록 그 복잡도가 너무 커져서 감당할 수가 없었죠.

그래서 개발을 할 때 시스템의 각 컴포넌트는 잘 나눠서 각 컴포넌트끼리는 간결한 인터페이스를 정의해서 해당 인터페이스만을 가지고 통신을 하도록 하고 각 개발자들은 자신이 담당함 컴포넌트만 개발할 수 있도록 했죠. 이러한 개념을 데이터와 메쏘드를 엮어서 객체지향 이론을 점점 발전시켜 왔습니다. 

C언어에서도 static 함수를 사용하면 해당 파일의 내부에서만 호출이 가능하고 외부 다른 파일에서는 호출할 수 없습니다. 즉 private 함수와 같은 효과를 발휘합니다. 따라서 public함수가 아닌 함수는 모두 static으로 정의를 해야 합니다. 그렇지 않으면 함수가 바뀌게 되었을 때 수천, 수만 개의 파일 중에서 누가 그 함수를 사용하고 있는지 정확하게 추적해서 문제없이 수정하는 것은 너무나 어려워 집니다. static함수는 해당 파일 내에서만 검토를 하면 되기 때문에 문제 없죠. 혹시 지금 C언어로 작성된 소스코드가 있으면 함수에 static이 정의 되어 있는지 확인해보세요.

둘째, 객체지향 프로그래밍 언어도 당연히 유용합니다.

C언어로도 객체지향 개념을 적용할 수 있지만, 한계가 있죠. 제대로 된 객체지향 프로그래밍을 하려면 객체지향 프로그래밍 언어가 필요합니다. 하지만 C언어로 개발을 하는 것에 대해서도 전혀 부정적인 의식은 없습니다.

주변에서 보면 언어만 C++을 사용하고 코드 내부를 뜯어보면 전혀 객체지향적이지 않는 소스코드를 많이 봅니다. 이런 경우보다는 C언어로 잘 작성하는 것이 더 낳죠.

물론 C++이 가장 훌륭한 객체지향언어라고 할 수는 없습니다. 그래서 객체지향 프로그래밍을 하기 위해서는 어떤 프로그래밍언어를 사용해야 한다고 주장하고 싶지는 않습니다.

한때 객체지향 개발방법론이 대두되어서 이전의 모든 문제를 다 해결해 줄 것처럼 떠들었지만, 이는 결국 언어를 무엇을 사용하고 방법론을 뭘 쓰느냐의 문제는 아니고 개발자들의 역량에 달린 문제 같습니다.

결론은 이렇습니다. 
"객체지향이 유용하기는 하나 무슨 언어를 쓰냐보다는 개발자의 객체지향 개발 역량이 더 중요하다."

객체 지향이라는 것이 꼭 알아야 하는 것이지만 툴에 목을 메지는 맙시다.


절차지향도 훌륭한데, 왜 객체지향인가? 
by 써니

구조적 프로그래밍 혹은 절차지향적 프로그래밍이라고도 말하는 C언어를 학습하시거나, 현장에서 C언어를 이용해서 개발하시는 분들과 대화를 나누다 보면 굳이 객체와 클래스라는 생소하고 어색한(?) 개념을 도입해서 개발해야 하는지 그 필요성을 잘 느끼지 못한다고 하십니다. 저 또한 베이식 - 베이직 보다 베이식이 정확한 발음이더군요 - 그리고, C언어를 먼저 학습한 사람이기 때문에 어느 정도 공감하고 있습니다.

단순한 프로그램을 개발하건, 복잡한 프로그램을 개발하건 구조적 프로그래밍이건 객체지향 프로그래밍 기법을 사용하건 어떠한 문제를 풀던 간에 눈에 보이는 결과 자체로는 차이점을 발견할 수 없습니다. 그러니까, C언어로 윈도우 어플리케이션을 만들어도 잘 동작하고, C#으로 만들어도 잘 동작합니다. 여전히 대부분의 운영체제는 C언어로 개발되고 있고, 전세계에서 운영되고 있는 수많은 제품들과 정보시스템들이 여전히 C언어로 구현 및 유지보수 되고 있습니다. 여전히 수많은 금융기관에서는 코볼로 작성된 프로그램들을 사용하고 있고, 게다가 아주 성공적으로 운영되고 있습니다.



댓글 16개:

  1. 좋은 포스트 감사합니다. ^^ 제가 VB를 처음 접하던 95년도에 고민했었던 문제네요. 복학하고 파워빌더와 델파이를 하면서 OOP의 완성이 되는 듯 하였으나 역시 C언에 익숙했던 터라 static, global, public 이런 데이터 타입에 유혹을 많이 받게 되죠. 제가 고정관념처럼 갖고 있는 개념 중에 하나가 "프로세스의 부품화"였습니다. Bottom-Up방식의 프로그램에서 아주 중요한 개념이지만 지적하신 것처럼 대규모 프로젝트에선 여러가지 어려움이 내재되어 있는건 분명해 보입니다. 다만 요즘 화두가 되고 있는 웹2.0처럼 프로그래밍에도 표준이 생겨난다면 100%는 아니여도 최대한 OOP구현에 가깝게 프로젝트를 수행할 수 있지 않을까 생각이 드네요.

    답글삭제
  2. ZIBSIN님 안녕하세요.
    뭐가 됐든 맹신은 위험한 것 같습니다. 그리고 원리는 하나로 통하는 것 같습니다. 요술방망이 찾지 말고 두루 많은 경험을 하는 것이 좋은 것 같습니다.

    답글삭제
  3. 전 C보다는 C++을 먼저 배워서 일단은 사용하는데 많은 어려움은 없더라구요..
    펌웨어를 짜다보면 C를 많이 사용하는데, 객체지향적 관점에서 보면 뭔가 많이 조잡하달까.. -_-;;
    객체지향적으로 프로그램을 짜다보면 어느정도 코드가 안정되고 정리된 느낌이 들더라구요..
    하지만, 드라이버들은 아직은 C로 짜는게 더 나은 경우가 있더라는.. ^^;;

    절차적이든 객체지향적이든.. 그때그때 상황에 맞춰서 사용하는게 가장 좋은게 아닐런가 싶네요.. 무언가 댓글이 좀 정신없어서 죄송합니다.. ㅠㅠ

    답글삭제
  4. kkommy님 안녕하세요.
    펌웨어나 Device Driver등을 만들 때는 일반적인 소프트웨어 개발 이론이 적용되지 않고 특수한 환경이죠. 보통 크기도 크지 않고 속도가 중요하고 안정성도 중요하고 또, C++컴파일러를 지원하지 않는 환경도 있습니다. kkommy님 말씀이 정확하네요. 그 상황에 맞는 가장 좋은 방법을 찾는 것이 중요합니다.

    답글삭제
  5. 객체지향을 쓰는 개발자의 역량이 참 중요한것 같습니다. 가끔 자바로 되어 있는 프로그램에 무수히 존재하는 if-else, 몇만 라인을 초과하는 클래스 등 전혀 객체지향적으로 되어있지 않은 경우도 많은 것 같습니다. 먼저 객체지향적 개념을 코드에 자연스럽게 구현할 수 있는 노력이 필요하다고 봅니다.

    답글삭제
  6. 박연중과장님 안녕하세요.
    사실 그렇더군요. 객체지향 언어로 개발을 많이 하지만 제대로 객체지향적으로 설계가 되어서 개발한 것은 많지 않은 것이 현실인 것 같습니다. 박과장님은 블로그 운영하지 않나봐요? 블로그 하나 운영해보심이 어떨까요? :)

    답글삭제
  7. 예. 사실 저도 제 개인블로그 하나 오픈하려고 준비중입니다 ^^;

    답글삭제
  8. 박연중 과장님 Open하면 알려주세요. :)

    답글삭제
  9. 저 블로그 개설했습니다. 아직은 많이 썰렁하지만 앞으로 많이 채워나가려구요^^

    답글삭제
  10. Object-Oriented – 객체지향.

    어디서나 접할 수 있고 가장 흔하게 듣는 용어이기 때문에 이제는 별 깊은 생각 없이 사용하는 용어 중 하나일 것이다. 기억은 나지 않지만 오래 전에 어디선가 읽은 기억으로는 일본식 용어를 그대로 갖다 쓴 대표적인 용어 중 하나라고 했던 것 같다.

    사실 “지향”이라는 단어를 보면 그 뜻을 알 것

    답글삭제
  11. 박연중과장님 안녕하세요.
    블로그에 들어가 봤습니다. 앞으로 좋은 정보 많이 교환하죠. 감사합니다.

    답글삭제
  12. 저도 여러 언어를 하다가 최근 다시 C로 돌아왔는데, 절차지향언어만 할 때보다, 객체지향 언어를 하고 나서 다시 쓰다보니 각각의 장단점이 확실히 느껴지는 것 같습니다. 뭐 언어야 도구일 뿐이지만, C언어를 10년이상 썼어도 적당한 곳에 static도 안 써주고, 함수 하나가 몇백라인으로 그냥 두는 사람도 있더군요.

    답글삭제
  13. BAGE님 안녕하세요.
    저도 C언어를 가장 좋아합니다. 사실 C언어로 못할 건 없죠. 성능은 좋지만 어려운 언어 중 하나고 요즘은 과거와 달라서 C언어 외에도 선택할게 많은 것 같습니다.

    답글삭제
  14. "사용하고 계시고 정확한 용도를 알고 계시면 C언어로도 객체지향 프로그래밍을 하고 계시는 것일 겁니다."
    이 말씀이 얼마나 반가운지 모르겠습니다.
    객체지향이라고 하면 흔히, 클래스와 오브젝트부터 얘기를 하는데요,
    C의 한 모듈이 Global로 구분된 Interface함수군을 갖춘다면, 앨런케이가 말한 '작은 소프트웨어 컴퓨터'로서 손색이 없다고 생각합니다.

    답글삭제
  15. 안녕하세요. 강경진님
    객체지향에 대해서 진정으로 이해를 하고 계시는 군요. ^^

    답글삭제
  16. 이미지출처 : www.restafari.org 객체지향 (Object Oriented) inheritance - 상속 when one class extends another class to reuse or build upon the inherited class behavior. 재사용이나 상속되는 클래스의 행동들을 바탕으로 새로운 클래스를 만들때. avoid duplicating and repeating code. 코드의 중복이나 반복을 피할 수 있..

    답글삭제