OOP 개념의 적용에 대한 질문

parkon의 이미지

좀 두리뭉실한 질문인데요,

예를 들어 자동차 구동 시뮬레이션 코드를 만든다고 할 때
첫눈에는 OOP가 제격처럼 보입니다.
엔진, 미션, 바퀴, 브레이크, 연료통 등에 대한 클래스들을 각각 만들고
각각의 인터페이스와 멤버 데이타를 정의하고 등등등.

하지만 실제로 해 보려 하면, 아리까리 해 지는게
차에서 엔진도 하나고, 미션도 하나고, 그러니까
위 클래스들을 싱글톤 구조로 만들어야 하나,
아님 위 클래스들의 인스턴스를 글로발 변수로 지정해야 하나 고민이 드는군요.
그것도 아님
클래스 대신 위 오브젝트들을 아예 네임스페이스로 구현하는게 어떤가 싶기도 하고요,

솔직히 코딩은 처음부터 수많은 글로발 변수로 떡칠하는게 가장 편할것 같긴 한데,
이건 뭔가 좀 맘에 안들지만,
맘에 안들어도 일단 글로발 변수들 잔뜩 사용해서 원하는 기능들을 다 구현한 다음에,
그 다음에 조금씩 조금씩 클래스나 네임스페이스 등등의 면모를 넣어가면서
작은 부분부터 점차로 코드를 구조화 시켜 나가는 방안도 생각중입니다.

너무 질문이 두리뭉실해서 죄송하고요,
혹시 경험담이나 조언 있으시면 부탁드립니다.

snowall의 이미지

차에 엔진이 한개만 있어야 한다는 법적인 제한 조건이 있지는 않겠죠.

전역변수도 이름공간도 필요 없이 "그냥" 하시면 될 것 같은데요.

만들고 계신 코드에 어떤 객체는 절대로 두개 이상 생성되면 안된다거나 하는 제약조건이 있는건가요?

피할 수 있을때 즐겨라! http://melotopia.net/b

parkon의 이미지

그런 제약 조건은 없습니다.
근데 "그냥" 한다는 말씀의 뜻을 좀 더 풀어주시면 감사하겠습니다,

싱글톤이나 네임스페이스나 전역변수를 생각한 이유는
각 오브젝트가 다른 오브젝트를 불려야 할 때,
예를 들어 미션의 멤버 함수들은
엔진(의 인스턴스)을 호출 할 수 있어야 할 것이고
또 바퀴나 브레이크를 호출할 수 있어야 할 텐데
이를 위해서요.

emptynote의 이미지

주관적인 재 생각에는

일단 돌아가도록 만드신후

초심 유지하고 지켜 보시고 개선하다 보면 실력이 늘듯합니다.

처음부터 이상향에 묶여서 생각만 하고 끝나지 않으셨으면 합니다.

전역 변수 사용하시고 싶으시면 그렇게 해 보시는것도 좋은 경험이 될듯합니다.

중요한것은 최초 구현완료후 최소 한달정도 지난후

꼭 지금의 객체지향을 하시고자 하는 마음으로 봐야 한다는 점입니다.

꾸준히 보셔다면 더 좋구요. ^^

parkon의 이미지

조언 감사드립니다.
어차피 하긴 해야 할 일이어서 도중에 그만두는 일은 없겠지만
저도 그간 이상향에 묶여 시간 낭비한 경험들이 많아서... ^^

익명 사용자의 이미지

자동차 구동 시뮬레이션 코드(?)를 말씀하신 방식으로 구현한다면 (아마도) 모델링을 완전히 잘못 한 것입니다.
무엇을 시뮬레이션 할지에 따라서 모델링을 어떻게 할 지가 달라질테고, 대부분의 경우에는 실제 세계의 물체 하나하나를 클래스로 그대로 매핑한다면 잘못 모델링 했을 가능성이 매우 큽니다. 예를 들어, 자동차 사고에 관련된 시뮬레이션을 하는 코드를 만드는 경우에는 엔진, 미션 등에 대해서 따로 클래스로 만들 정도로 기능이 많이 들어가지 않을 것 같네요.

모델링을 할 때는 physical 한 물건에 대해서 하나씩 클래스를 만드는게 아니라, 어떤 특정한 기능을 하는 (재사용 가능한) 코드들을 클래스로 표현하는게 아마도 좀더 맞는 방법일 겁니다. 그런 점에서 우선 원하는 기능을 구현한 다음에 name space, class등으로 구조화 시켜나가는 것도 괜찮은 방법일 수 있겠습니다. 다만, 원하는 기능을 "다" 구현한 다음에 하기보다는, 기능 구현과 구조화를 번갈아가면서 조금씩 하는게 좋아 보이네요.

powersys의 이미지

모든건 상황에 맞게 써야지..
아무데나 적용한다고 좋은게 아닙니다.
특히나 우리나라는 남들하니까 나도한다식의 "거름지고 장에간다" 많이합니다.

님이 예로드신.. 자동차구동 시뮬레이션 코드 만드는데.. 왜 첫눈에 OOP 인가요..

OOP 를 하는목적이 뭔가요?.. 안했을때와 차이점은 뭔가요.. 실질적인 이득이 있나요? 냉정하게 판단해보셨는지..

대부분의 사람들이... 이득이 없음에도.. 남들하니까.. 하고 있습니다.
뭐 성능이 나아집니까?
개발속도가 빨라지나요?
차후유지보수가 편한가요?

아마 위 세가지모두.. NO 일가능성이 큽니다.
유지보수에 이견을 다는사람이 있을텐데.. 구현안한것과 한것에 유지보수할경우.. 같은일애대해..
몇줄을 분석해야하며.. 몇줄을 코딩하는지 생각해보셨나요?

대부분의 경우 후자가더 비용이 많이듭니다.
아니그럼 대체 왜하냐구요??? ...그러게요..? 왜하세요?? 그걸자신한테 물어보세요..

parkon의 이미지

사람마다 다르겠지만, 제 같은 경우엔, OOP를 하는 이유는
결과적으로 코드가 보다 직관적으로 되어 이해하기 편하고,
이는 곧 나중 코드 관리나 확장면에서 유리하더군요.

그렇다고 제가 뭐 OOP 매니아는 아니고요,
정성들여 제대로 된 코드 만들 욕심이 있을때는 그렇게 만들고,
대충 대충 빨리 만들고 싶을땐 또 그렇게 하고요.

또 어차피 대규모 프로젝트가 아닌 경우는
시간/노력/가치 등에 대한 손익계산은 대충 합니다.
그때 그때 끌리는 대로 하는거죠.

익명 사용자의 이미지

싱글턴 컴포턴트 간의 상호작용이 시스템의 대부분인 경우는 OOP보다는 차라리 C 스타일의 모듈 수준 스코프를 쓰는게 깔끔하더라구요. 당연히 아시겠지만 글로벌 남발은 언제나 좋지 않구요.

OOP라는게 나오면서 구조적 프로그래밍에 덧붙여진 가장 큰 차별점 중 하나가, 같은 메시지에 대해 객체 별로 달리 반응할 수 있게 만드는 것일텐데, 만들려는 시스템의 메이져한 특성이 딱히 그 점을 활용할만하지 않으면 사실 그런 경우에 채택된 OOP는 그만큼 오버엔지니어링이라고도 볼 수 있겠죠. 성능이건 부피건 클래스 private 변경에 따른 전체 컴파일이건 생성된 바이너리 심볼의 복잡함이건, 지불해야할 비용은 반드시 있을 수 밖에 없져.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.