본문 바로가기

프로그래밍/기타

# 플밍지기와 함께하는 객체 지향 # - 1

제가 운영하는 카페에서 쓴 객체지향 관련 내용이었습니다. ^^
도중에 게시판을 옮기는 바람에 언제 처음 썼는지는 모르겠지만..
가장 첫 댓글이 05년 2월인 것으로 보아, 05년 초반에 쓴 듯 하네요..
어느 덧 3년 전.. 그러나 그 때나, 지금이나 머리 속에 든 것은 변함없이..
아니.. 아니 오히려 더 줄어들어버린 듯 싶네요.. ^^
이제 하나씩.. 다시 그 빈 공간을 채워야 할 것 같네요~ ^^

--------------------------------------------------------------------

# 플밍지기와 함께하는 객체 지향 #


1. 객체지향 방법론


 자~ 자바를 하려고 하셨으면.. ^^ 아마.. 이런 말씀을 많이 들으셨을 겁니다..

객체지향언어? OOP? 뭐.. 대강 비스무리.. 못 들으셨다구염.. -.-;;

흐흠.. 전  많이 들었답니다..  뭐.. 아니시라면.. ㅡ.ㅡ 어쩔 수 없음돠.. ^^

앞으로.. 마니 들으세요!!  필히! 말이죠~ ^^


  음 그럼 객체지향이 멀까요.. 그건. 바로....


  객체를 지향 하겠다는 뜻입니다... (아닌가염... 에공..)


흐흠.. 썰렁하다구여? 죄성합니다.. 원래.. 제가 좀 이래여.. ㅎㅎ 하지만... 저게 맞지 않나여?

객체를 지향하니깐. 객체지향이겠죠.. OOP에서.. 앞의 O는 오브젝트, 즉 객체..

가운데는 ┅지향의, 좋아하는, 본위의, 중심으로 한’의 뜻의 결합사.  이라는 뜻이구요.(한컴사전..)

P는 머.. 프로그래밍이구여.. ^^;; 그럼.. 객체를 지향하는 혹은 좋아하는 객체를 중심으로하는..

프로그래밍이라는 뜻이니. ^^ 제 말이 맞는거 같긴하죠? ^^


 자.. 그럼 이제 다른 의문을 생각해봅시다. ^^;; 그렇다면.. 과연 객체란 무엇일까여?

어떤 것이길래.. 고놈을 좋아하구.. 중심으로 한.. 즉 지향하는 프로그래밍을 하는 것일까여?

앞으로 4번에 걸쳐서 다뤄질 내용이 바로 그것이구요..  오늘은 바로.. 고놈이 무엇인지에

대해서.. 알아내는 작업입니다.  자~ 이제 객체에 한 번 빠져봅시다~


  객체라는 넘이 무엇이냐하면... 일상생활에서.. 보여지고 규정되어지는 모든 것들이라고

볼 수 있습니다.. 좀..예전에 보았던 책이 있었다면.. 좀 더 멋드러지게. 규정지어볼텐데..

제가 원츄하는 책은 짐 없구여.^^;; 기억나는 건 저거네요. ^^

  음 그렇다면 보여지고 규정되어지는 모든 것이라는 것의 예를 들어볼까요?

뭐.. 보여지는 것.. 말 그대로입니다.. 책상, 칠판, 자동차, 나,너, 고녀석, 고놈, 이녀석, 이넘..

(음.. 다 물건 아니면 남자군요.. 이유는 여자를 쓰면.. 좀 심한 욕같잖아여.. ㅡㅡ; )

어쩄든.. 그런 것들이 보여지는 것이겠죠? 그렇다면.. 규정되어지는 것? 이건 또 멀까여?

어케 잘 표현하기가 좀 그렇네요.. ^^;;  가령.. 야구라는 건.. 보여지진 않습니다..

뭐.. -.-;; 야구 경기가 있긴 하지만. 야구가 보이는 건 아니잖습니까.. 어케 어케 하는걸.

야구라고 규정지은 것이지.. 보이는 것은 아뉩니다.

(아니라구여? 쩝.. 맞지 않나여?... 걍 맞다고해요)

  자.. 이렇게 해놓고. 보니깐.. 객체라는 넘은 참 다양하겠네요.. 음.. 어떻게 보면.. 명사로

쓸 수 있는 것들이.. 모두.. 객체가 될 수 있지 않을까여? ^^ (사실 품사에 대해서 약합니다..)


 자 이제 객체란 녀석이 먼지는 아셨나여? 흐흠. 아직 부족하겠죠? 고롬.. 객체란 녀석이..

멀로 이뤄진 넘인지 한 번 보죠.. 객체란 넘은 두 글자잖아요.. 그래서 딱 두가지만

가지고 있습니다.  고넘의특징, 하는짓거리... 다른 말로 하면..

 속성(혹은 특성)과 행위라고 말하죠..

 속성은 위에 말한 대로.. 객체란 녀석이 가진 특징정도가 됩니다. 핸펀으로 예를 들면..

액정, 버튼, 메모리,화음  이런 것들이 있을꺼구요..

  행위는 전화걸기, 메시지 보내기, 무선이너넷하기..

(사진찍기, 음악듣기는 뺐습니다.. 왜냐면.. 제 핸폰은.. 그딴게 안되는 꼬진 핸펀이거든요.-.-;)

  머.. 이것도 보면.. 속성은 명사구..행위는 동사정도가 되겠네요.. 맞나여? 쩝...


  자..이제 정리해볼까요? 객체란 녀석이 무엇인지..

    객체는 실세계에서 보여지고, 규정되어지는 모든 것

    객체는 속성과 행위로 이루어져 있다.

  이 두가지를 알기 위해서. ㅡ.ㅡ; 저렇게 길게 알아봤습니다..


 그럼... 이제 끝일까여? 아쉽게요. 아니지요.. 그럼 우리는 왜 객체라 녀석을 지향해야 하는지에..

대해서 생각을 해보지 않았네요... 우선 객체에 대비되는 것에 대해서 잠깐 또.. 알아보죠..

  객체지향에 대비되는 것으로는 절차지향이란 말이 있습니다. 이것은.. 말 그대로..

 절차를 지향한다는 말이죠..  좀 다른걸 원하셨나여? -.-; 절차를 중시한다는 것이죠..

 돌은 던지지 말아주세요.. 음 절차에 대해서 또 넘 자세히 알아보면. 지겨울테니..

  간단하게 보죠.. 절차 지향.. 즉.. 절차적으로... 순서대로.. 일을 처리한다는 것이죠..

그렇다면.. 절차지향에서.. 객체지향으로 넘어가게 되는 이유는 무엇일까요?

  이유는..절차지향은 모든 일은 순서대로 처리하게 됩니다. 그러면.. 마지막쯤에 가서..

아.. 뭔가가 잘못된 점을 찾아냈습니다.. -.-; 이럴때.. 아띠 젠당. 잘못됐잖아..

  그러나.. 일이 모두 순서대로 연결되어 있기 땜에.. 다시.. 그것과 연결된 내용들을..

  모두.. 다시 처리해줘야 합니다.. 눈물납니다. ㅠㅠ

  가령. 자크를 올리는데.. 거의 다 올려줬습니다.. 근데.. 처음 부분에서. 약간 헐거워져서..

자크가. 잠겨야 하는데. 살짜쿵.. 풀어졌네요.. (경험 없으신가여? 오래 사용하다보면.. -.-;)

  그럼 어케합니다.. 그 부분만.. 다시.. 손의 악력으로.. 다시.. 붙여서 잠글 수 있나여?

  다시.. 쫘!~악.. 내려서. 잠궈줘야죵..  아 귀찮습니다... 좀 비약해서.. 서울에서 부산까지..

  자크를 잠그는데.. 대구쯤 왔는데.. 과천쯤에서.. 그렇게 풀어졌습니다.. -.-; 대략 아시겠죠?

흐흠.. 좀.. 예가 잘못됐는지 모르겠지만..  즉 절차지향에서의 문제는. 모두.. 연결되어 있기 때문에

잘못이 발견될 시에는 모두 수정이 필요하다는 것이 단점이죠..


  그렇다면.. 객체지향? 모든 것을.. 하나의.. 독립된 객체로 놓고... 하게 되는 것이죠..

순서대로가 아니라.. 일을 딱딱 나눠서.. 객체로 만듭니다.. 각각의 개개의 것으로 말이죠...

그러면.. 무언가 잘못되었을 경우에, 해당 객체만 바로 수정하면 되는 것이죠.. 다른 것까지

모두 수정할 필요가 없구요.. 가령.. 이번엔 자크를 단추로 바꿨습니다. 단추가 살짜쿵..

풀렸습니다..  걱정마십시오.. 풀린 단추만 딱.. 다시 끼워주면 됩니다.. 서울에서 부산까지 단추?

중간에 풀리면. 걍 풀린것만 고치십시오! 아 좋습니다~ 아.. 또 좋은 점이 있네요.. 중간에..

단추가 한 개가. 깨져 버렸습니다.. 그 단추만.. 살짜쿵 바꿔주면 되겠죠? 쟈크가 중간 부분이 쇠가.

완전히 깨졌거나. 헐거워졌다고.. 그 부분만 바꿀 수 있나여? 못하죠.. 연결된 부분은 다 바꿔야죵

아.. 단추는 얼마나 편리합니다. 단추 만세입니다!!

  즉.. 다시 말해서.. 유지보수가. 편리하다는 말이됩니다.


 이처럼 절차지향에서는 힘든 것들을 객체지향 관점으로 놓고보면.. 편리해집니다...

즉 절차지향의 장점에다가... 독립된 객체의 개념을 추가했다고 볼 수 있죠.. ^^;

그름.. 이제 객체를 왜 지향하는지는 아실랑가여? 사실.. 이 점 말고도 또 좋은 점들이 있긴

합니다만. 그건. 앞으로 차차 살펴보게 될 것입니다.

 

  자.. 이제 그름.. 아무래도.. 우리는 프로그램을 공부하다보뉘.. 이렇게.. 추상적인 얘기말고..

이런 얘기들을 프로그램에서 어떻게 결부시키는지 알아봐야겠죠.. OO가 아니라. OOP..즉.

객체지향프로그래밍이잖습니까.. ㅎㅎ


  객체는 아까도 말했지만.. 모든 물리적 사물.. 개념적인 것을 포함합니다.

그리고, 이들은 속성(특성)과 행위를 지니고 있습니다. 하지만, 우리는 프로그램에서 이런 객체를

표현하고자 할 때에는.. 모든 걸 다 표현하지 않습니다.. 왜냐면.. 너무 많잖아요.. -.-;; 일일이

그걸 어떠케 다 하겠습니까.. 그래서 우리는 그걸 표현하고자 할 떄에는..

  중요하지 않은 것을 제외하고 필수적인 즉 중요한 것만을 다루게 됩니다.. 이를.. 추상화 작업

이라고 하게 되지요..  이제 드디어. 우리가 많이 들었던 말이 나오게 됩니다.  바로..

  그건 클래스라는 것이죠.. 아.. 교실이 아닙니다.. 학급도 아니구요..  

 

  우리가 말한 객체는 실세계에 있는 것들이구요.. 우리가 프로그래밍에서.. 다뤄지는 것은...

그러한 객체에서 중요한 사항들만 뽑아낸.. 즉.. 실세계의 객체를 추상화 작업을 통해서...

클래스로 만들어 내는 것입니다.  ㅇㅋ?  실제 프로그램에서 쓰일 것들만.. 열띠미 작업해서..

필요한 사항을 분석해서... (추상화 작업.... 미술가도 아니지만.. 해야합니다. )

  클래스라는 놈을 만들어 내게 됩니다.  그렇다면..  클래스라는 넘두.. 객체처럼...

딱 두가지만 가지고 있나여? 네. 맞습니다.. 바로. 클래스도.. 객체란 녀석을.. 작업한 것이기 떔에.

두가지만 가지고 있죠.. 북치기 박치기...... (헛소리해서.  줄 수좀 그만 늘리라구여? -.-:)

  이넘두.. 속성, 행위를 가지고 있지요.. 물론.. 하지만. 클래스에서는.. 그넘들을 각각..

변수와 메서드라고 부른답니다..  변수는 보통 멤버변수라고 부르지요.. 클래스 안에 있는

넘이니까요.. 클래스의 멤버~ 변수.. 라고 부르지요.. ^^

  자.. 그러면.. 클래스라는 말을 들으면서.. 또 많이 들었던 말이 있을겁니다.. 바로..

instance.. 자 처음으로 영어가 나왔네요... 걍 인스턴스라고 하죠.  그름 인스턴스는 먼가여?

인스턴스는 클래스로 만들어진 객체를 뜻하게 됩니다.. 흐흠.. 뭐냐구요?

왜 이제까지 설명했던 단어로만.... 뜻을 정해 버렸네요.. 고의가 아닌데.. 에궁.

  다시 생각해보지요.. ^^; 객체라는 녀석은 실세계에 존재하는 것들, 개념적인 것들이라고

했구요.. 그것을 추상환 한 것이 클래스가 됩니다. 자 근데 여기까지하고.. 클래스라는 넘은

이 때 하나의 완성된 물건? 즉 우리가 직접적으로 사용할 것이 아닙니다...

  흠. 이것은 하나의 개념적인 것에 불과한 것이죠..  일종의 틀이라고 할까요?

어떤 것을 만들어내기 위한 틀을 만든 작업이.. 추상화 작업이라고 볼 수 있구요.. 그 틀이..

바로.. 클래스가 되는 것이지요.. 그럼.. 클래스란 녀석은. 일종의 개념.. 틀.. 정도로..

볼 수 있겠군요.. 그럼 아까 말했던 인스턴스는 클래스로 만들어진 객체...

  즉 그 틀에서 만들어진.. (혹은 그 개념으로 이뤄진.. ) 물건.. (실제적인 것..)이 됩니다.

다시 굳이 말하면. 클래스로 만든 우리가 실제적으로 다루게 되는 물건이 인스턴스가 되죠..

그리고 여기서 말한 객체는.. 일종의.. 하나의 실제적인 것이라는 것을 나타내는 말이죠..

실세계에서 말한 객체와는 사뭇 다른 거죠.. ^^;

  그리고.. 조금 더 들어가보면.. 보통.. 이렇게 말합니다..


   클래스를 인스턴스화 한다..   클래스로 만들어진 객체...  이런식으로 쓰이죠..

   클래스를 객체화 한다. 혹은 클래스로 만들어진 인스턴스 라는 말은 잘 쓰지 않습니다..


  맞나여? 쩝.. 아님 말구요.. ^^;;


 자.. 이제 두가지만..더 말씀 드리고.. 첫 번째 강좌를 끝내려고 합니다.. ^^;;

여기까지 보신 분이 계시려나? ㅎㅎ

 

  객체지향에서는 절차지향과는 다르게 일을 처리하게 됩니다. 절차지향은 뭐.. 차례대로..

진행하면 되지만.. 객체지향은.. 그러한 순서가 따로 있는 것이 아니니까요.. 그래서..

객체지향에서는 메시지 전달을 통해서.. 이러한 작업이 이뤄집니다.

  무슨 말이냐하믄.. 클래스로 만들어진 객체들은.. 클래스에서 정의되어진.. 메서드가

있습니다.. 그 메서드를 상대방에게 노출시키구요.. 다른 객체에서는 그 노출되어진 메서드를

이용해서 메시지를 보내게 되면.. 그 정의되어진... 행위를 하게 되는 것입니다..

 

  가령.. 사용자라는 객체가.. 핸드폰이라는 객체가 가진.. 전화걸기라는 메서드를 이용해서..

핸드폰에 객체에게 메시지를 보냅니다. '야 전화 좀 걸어보자꾸나!' 그러면.. 그 메시지를

통해서 핸펀 객체는 전화를 걸게 되는 것이지요..


  즉 메시지 보내기(sending message)는 객체의 메서드를 호출하는 것을 뜻하게 됩니다.


자.. 이제 마지막입니다..  이건. 앞으로 다뤄지게 될 내용과도 같은데요..

이제까지 알아본.. 객체 지향 방법론을 통해서.. 어떠한 문제 해결을 할 때 사용하는 것입니다.

뭐.. 말씀드린 것두 있구요... 총 4가지입니다... 객체지향 방법론에서는 이러한 방법을

통해서 문제를 해결하구요.  이를 우리는 프로그래밍 관점에서.. 적용시켜서 공부하는거죠..


그 방법은..


1. 추상화(abstraction) :  큰 문제에서중요하지 않은 것을 제외하고 중요하고 필수적인것만 다룸

2. 캡슐화(encapsulation) : 세부적인 구현 방법을 숨시고 간단한 인터페이스만 드러냄

3. 모듈성(modularity) : 작은 단위로 개발 -> 개체 독립성

4. 계층성(hierarchy) : 객체로 나눌 때, 공통된 성향을 가진 것을 상위,

                                구체적인 것이 하위로 계층을 이루게 됨.


이 4가지입니다. ^^


그냥 우선은 객체지향에서는 위와 같은 방법으로 문제를 해결한다고만 알아두시구요..

앞으로.. 하나씩.. 어떻게 적용되는지에 대해서 알아보게 될 것입니다. ^^


그럼 첫 번째 강좌를 이만 마치구요~ ^^


캡슐화(은닉)의 두 번째 강좌에서 다시 뵙죠~~ ^^


모두 안뇽~~



                                          Pride Of PlmingZIGI™