본문 바로가기
Java 객체지향 #안드로이드 (자바)

http://yooninsung.blog.me/30083226800

어쨌거나, 오늘은 객체지향에 대해서 이야기 해볼까 합니다.
조금, 길고 자세하게 할거라, Objective-C 강의를 이번 주는 진행하지 않습니다.
그리고, 거기서 말할게, 오늘 여기에 상속에 대한 개념도 하겠습니다 >ㅅ<
오늘 강의의 내용은….
“객체 지향 전체 개괄” 왜, 객체지향을 하고, 어떤 식으로 사용하는지..!
뭐 소프트웨어의 위기다, 어쩌구 모든 책에 써 있지만, 그걸 보면 “그래서 어쩌라구” 라는 말이 절루 나오죠 ~_~.. 그래서, 객체지향이 어떤거구, 왜 쓰는지에 대해 약간만 보고 시작하도록 합시다.
그건 그렇고, 제가 완전한 전문가는 아닌 관계로 틀린 부분이 있을지도 ~_~
그냥 웃어 넘겨주심 플리즈. 분석적 이해보다는, 그냥 쉽게 이해하는 쪽으로....
우선 간단하게, 모든 책에서 설명하는 객체지향의 특성에 대해 알아보도록 합시다.
객체지향의 특징을 기본적으로 "캡슐화, 추상화, 상속" 라고 합니다.
일단 대충 오늘 강의는 즐겁게 읽어보시면 됩니다 ㅇ_ㅇ
그럼 시작하도록 하죠 ~_~
오늘 학교에서 미분적분을 배웠습니다. 기초 공학수학이요.
왜 우리가 미분적분을 배우냐고 물어보면,
“우리가 사는 세계가 [연속성]이 있는 세계이기 때문” 이라고 답을 하죠.
그럼 우리가 왜 객체지향을 하냐,
“우리가 사는 세계가 [객체]로 이루어져 있기 때문”입니다.
그럼 객체가 무엇인지는 네이버 사전을 뒤져보도록하죠.
객체 : 주관에 대응되는, 인식 ·지식에서 자아(自我)의 대상.자, 이게 뭔 개소리일까요…ㅇ_ㅇ
객체란, 간단하게 그냥 하나의 대상입니다…! 다른 것과 구분할 수 있는 대상이죠.
코끼리면 코끼리, 사람이면 사람, 자동차면 자동차…
그렇게 객체를 구분합니다. 객체는 각각의 속성과 행위를 가지고 있습니다.
예로, 코끼리는 긴 코가 있고, 코가 손이래요. 코로 밥을 먹는다니까,
코라는 속성이 있고, 밥을 먹는다는 행위도 할 수 있는 겁니다.
객체변수를 “필드”라고 하고, 객체함수를 “메소드”라고 합니다.
즉, 코는 필드, 먹는다는 메소드..!
이 용어는 자주 쓰니까 기억해주시기 바랍니다 >ㅅ<
근데 왜 우리는 객체를 사용해서 만들어야 하는가…~_~
이 세상에는 객체들이 가득합니다. 세상은 객체들로 이루어져있죠.
불교에서는 인드라망이라는 용어가 있답니다.(어디서 굴러 들은건지......ㅡㅡ)
세상에는 객체와 객체가 있고, 그 객체가 서로를 반영을 하며 세상을 구성한답니다.
즉, 세상은 객체로 구성되어 있다는 거죠 ~_~
객체, 객체간의 상호작용, 프로그래머는 이걸 구현해야 하는 겁니다.
그럼 잡소리는집어치구고....
객체지향을 하면서 제가 제일 궁금했던건, 이걸 다 만들면서 하면,
"그게 시간이 더 오래 걸리지 않을까" 하는 거였는데요.
객체를 우리가 다 만들 필요는 없고, 있는것 가져다 쓰면 됩니다.
간단하게..레고블럭을 들어보도록 하겠습니다.
레고를 사면 그 안에 이미 만들어진 객체들이 가득 있죠.
우리는 그 객체들을 이러쿵 저러쿵 모으고, 붙이고, 설명서대로 꾸역꾸역 만들면 멋진 무언가가 만들어지죠..! 그리고 레고로 꽃병을 만든 다음에, 그 위에다가 내가 색종이로 열심히 만든 꽃을 올려두면, 내가 만든 객체와, 객체를 합친 객체와 조화를 이루겠죠.
우리는 객체를 직접 만들기도 했고(꽃), 만들어져있는 객체를 이리저리 조합하기도 하였습니다.(레고) 이것이, 객체지향 프로그래밍 입니다.
프로그래밍에서도, 미리 만들어진 객체와, 내가 만든 객체를 조합하여 무언가를 만들죠.
객체지향을 한다고 무조건, 우리가 객체를 만들어야 하는게 아닙니다.... !!!
오해하는 분이 많더군요, 있던 객체를 이용하는 것도 객체지향입니다.
정말 간단히, 객체지향이란 것은,
객체를 조합해서 만들면 객체지향입니다. 그냥 딱히 뭐 다른거 없습니다 ~_~
그럼 간단하게 몇가지 객체를 만들어보며, 위의 3개를 차례차례 설명해보도록 하죠.ㅎㅎ
인성이라는 객체를 만들어 보겠습니다.

…. 미친거죠 ~_~;; 아, 참고로 자바는 한글로 변수 선언이 가능합니다. ㅎㅎ
이렇게 된 이유는 필요한 것만을 추출한 것이 아니라 그냥 객체의 속성을 나열했습니다.
컴퓨터상에서, 자기가 원하는 속성을 추출하는 것을, “추상화”라고 합니다.
오키, 3개중에 하나 정복했죠?
다른 친구들과 동생들의 핸드폰을 보니 “윤지갑”, “윤밥통”으로 저장되어 있더군요.
…. 그래, 난 밥 사주는 지갑에 지나지 않는거였어……
그래서 인성이의 속성과 행위를 딱 추출해보도록 하죠.

….슬프다….아… 아…!!!
어쨌거나, 일단 위와 같이 했습니다.
그럼 객체지향을 조금이라도 했던 사람들이 딴지를 걸겁니다.
[“private”가 아니고 “public”이네 ㅋㅋ]
일단 private선언하는 이유에 대해서 책 같은데 이렇게 나옵니다.
“객체란 하나의 부품인데, 우리가 그 부품의 세부 속성을 알 필요는 없고, 실수를 할 수 있으니까 private선언을 합니다.”
그럼 그걸 보고 사람들이 말합니다. “아, 무조건 private 선언해야 하는구나.”
… 아닙니당 >ㅅ<, 그럼 그냥 쓰면 private되게 하지 왜 괜히 앞에 public이나 private, protected같은걸 쓰겠습니다 >
“이게 뭔 소리?” 그럼 자바 api docs를 보겠습니다.
private선언되어있는 것은 목록에 뜨지 않습니다.
위를 보면 필드가 여러 개 뜨죠, 즉, private선언 되지 않은 멤버도 있다는 거죠.
책을 자세히 보면 이렇게 나올 겁니다.
“기본적으로 private멤버를 쓰되, 필요한 경우에는 public을 사용한다.”
아, 이 강의를 객체지향 처음 하면서 보시는 분은 private, public이 뭔지 모르실텐데요…
Private는 마음대로 이용할 수 없는 “사생활”있게 만드는 거구요.
Public은 걍 함께 놀자는 겁니다.
뭐, 자세한 나중에 하도록하죠.
인성이 객체에서, 인성이가 퍽치기나 습격을 당하거나, 애들이 제 사지를 잡고 지갑을 뒤지면, money에도 접근을 할 수 있겠지만, 그럴 경우가 많지는 않고,
“오빠, 돈 줘!”
이럼, 제가 안 주겠죠….
“오빠, 내일 인아 미국에서 온데요 >ㅅ< 먹을거 사주세요.”
이럼, 생각을 해보게 되죠…..
후훗, 그럼 이제 private으로 선언해 봅시다.

 

조금 더 자세하게 해보았습니다.
……제길, 쓰고 나니 정말 슬프다…
자, 이제 인성이라는 객체가 만들어졌습니다.
인성이라는 객체는 외부에서 돈을 그냥 직접 가지고 갈 수 없습니다.
즉, 하나의 독립된 객체가 된 겁니다. 이러한 속성을 “캡슐화/정보은폐”라고 합니다.
캡슐화에 대해서 설명을 약간 해보면, 객체는 서로서로 “독립”되어 있다는 겁니다.
간단하게, 우리가 병원가서 약을 타오면 약을 쭈르쭈르 받죠.
그럼 어떤건 콧물, 어떤건 두통약, 서로서로 독립되어 작용을 하죠.
“감기약은 서로서로..”
닥치시오 >ㅅ<…..;;;
이렇게 독립되게 만드는 것을 “캡슐화”라고 하고 캡슐화를 가능하게 하는 것을 “정보은폐”라고 하는데요. Private 선언함으로써, 외부에 자신이 어떤 객체를 가지고 있는지 알려주지 않는 것을 정보 은폐라고 합니다. 그럼 왜 정보은폐와 캡슐화를 하는가에 대해 살펴봐야죠.
아, 원래 고리타분한 이야기 하지 않으려고 했는데… 객체지향이 등장한 배경에 대해 설명하겠습니다. 책보시면 다 나올 텐데, 하드웨어의 발전 속도에 비해, 절차식으로 프로그래밍 하는 소프트웨어의 발전 속도가 따라가지 못해 나오게 된 것으로써, 객체를 잘 하는 분이 만드시고, 저 같은 평범한 개발자들이 가져다 쓰게 하여, 개발하는데 요구되는 실력을 낮추어 개발속도를 향상시키고, 유지보수를 쉽게 한겁니다.(“갑자기 왠 유지보수가….”)(책 찾아 보셔요. 일반 시중의 책 보다 자세하게 쓰기 힘든 부분…)
여기서 중요한건. 대충 “쉽게 프로그래밍, 빠르게 프로그래밍, 유지보수 쉬운 프로그래밍” 이겁니다. 만약에, 외부에서 내부에 직접 접근을 하지 말랬는데…. 만약에, 정말 만약에, 정말 정말 만약에, 그렇게 된다면, 대충 아래처럼 보죠.

일단 보면, 뭘 의미하는지 알기도 쉽지 않습니다.
그랬다가, 인성이가 지갑 속의 돈을 쓰지 않구, 그냥 카드를 긁습니다.

만약 인성이가 월화수목금토일 먹을걸 사준다고, 각각의 객체를 만들고, 저런 짓을 했다면….
(코드가 엄청나게 길다면, 이란 뜻입니다 ~_~)
끔찍 하겠죠… 만약 이게 정말 실무의 막 엄청 긴 코드였다면 난리나는 겁니다.
전부 바꿔야겠죠 >ㅅ<
“찾아 바꾸기 같은 걸로, 지갑속돈->카드 하면 안됩니까?”
네, 안됩니다. 그랬다가 “지갑속돈”이 들어가는 곳이 같이 바뀌면 어쩝니까.
이런 명확한 이름의 경우 그렇지만, 예로 “food”라고 썼다가, 그거 바꾸는데 “Koreanfood”,”Italianfood” 이런것 까지 다 바뀌어 버리면 난리 나겠죠… 근데 위의 코드를 보면, 메소드는 몇 개만 쓱쓱 바꿔주면 됩니다. 그럼 전체코드에서 “빕스가기”가 1000번이 나왔어도 한꺼번에 바뀌는 거죠. 이렇게 되면 유지보수가 편리해지겠죠?!
(빕스 1000번이면 얼마냐....에휴...)
이런 점에서 객체지향이 관리에 편리하다는 겁니다 ~_~…
뭐, 저는 아직도 저렇게 접근하는걸 본적이 없는 관계로…… 넘어가죠 ㅎ
(처음 배우는 과정에서는 저런 실수를 할 수는 있어요.)
자, 그럼 이제 상속으로 넘어가죠…
제가 좋아하는 1945라는 게임입니다.
후우... 옛날에 아는분들이랑 스키장에 갔다가, 타라는 스키는 안타고 밤새서 이거한적이 있죠....
뭐, 보이면 보시구, 안보이면 나이스..
대충 요래요래 만들면...ㅡㅡ;;
(줄은 그냥 합쳐서 스크린샷...>ㅅ<)
그냥 대충 봅시다.
상속이란건, 부모의 것을 물려받아 그대로 물려받아서, 부모의 것을 이용하거나
부모의 것을 물려받은뒤 약간 변형하여 사용이 가능하게 만드는 겁니다.
이 부분은, 그냥 설명하면 힘드니, 나중에 자세히 보죠 ~_~

그래도, 대충은 설명을.......
대충 이렇게 만들어져 있는 겁니다.
Object에 대한 설명은 나중에, 하게 될거구요.
ObjectiveC에는 NSObject가 있죠.
비행기 아래에, 플레이어 비행기, 적비행기, 등등 있습니다.
그럼 이거 왜쓰냐.
"그냥 따로따로 만듬 안되요?"
됩니다.
"ㅡㅡ"
손가락 디빵 아프고  Ctrl+C/Ctrl+V 누르시면 됩니다.
그리고, 지금 설명하기는 힘들지만, 조금 뒤로가서, GUI 들어가면 "아, 이래서 상속" 하게 됩니다.
일단 이 아래처럼 사용도 가능하다는거, 대충 보시구요 ~_~
이럼, 하나의 반복문으로 전부다 돌려버릴 수 있지요 ~_~
자식을 부모로 취급해 버릴수 있으니까, 종류가 다른 녀석들이라도, 그 부모로 취급해서
루프를 돌려버릴 수 있습니다 ~_~...
메소드명도 같으니, 별로 문제 없고, 쉽게 되겠죠 ㅇ_ㅇ

그리고, 또 자바의 모든 객체는 Object의 상속을 받게 됩니다.
가만히 있어도 상속을 이용하게 되는거죠.
awt 대충 살피고, 안드로이드로 가는 루트 탈건데요.
거기가면 상속에 대해서 쭉쭉 개념 잡을 수 있을겁니다.
지금은 그냥 넘어가죠.
백날, 책에 나오는 [사람-학생,선생] 이나 [생물-동물,식물]이런거 해도
어디에 적용되는지 모르면 답답하죠 ~_~
그러니까, 나중에 알아보도록 하져.
(전 C++하면서 상속이 뭔 개소리인가 했는데,
MFC들어가서 뒹굴다보니 이걸 왜 쓰는지 이해가 되더군요.)
그럼 이제, 3가지를 다 잡았구요 ~_~, 대충 다형성 보고 넘어갑시다.
다형성이란 아나의 모양으로, 여러가지 일을 할 수 있다는 겁니다.
대충 보면, 아랫쪽 println은 그냥 하나의 메소드가 아니라,
아래와 같이 미친듯이 많이 정의되어 있습니다.
하나의 모양으로 여러개 할 수 있다는 거죠.
뭐, 버뜨버뜨, 가끔 오해가 또 있는데요....
무조건 다형성을 적용해야 한다는 강박관념에 사로잡힐 수도 있겠지만... ~_~
적용할 수 없는 부분에서조차, 다형성을 쓰려고 노력하시는 분이 있더군요...
아래처럼 불가능하거나, 힘들면 따로따로 만듭니다.
다형성을 맡춰서 객체를 만든다.
위의 모든 속성을 맞춰서 객체를 만든다.
힘들고 짓이구요. 거의 그럴 필요가 없습니다.
" ~_~ 왓? "

http://java.sun.com/javase/6/docs/api/

들어가시면 이미 무진장 잘 만들어진 객체들이 있구요.

http://developer.android.com/reference/packages.html

무진장 잘 만들어진 안드로이드 객체가 있어요.
"우아아, 그럼 우린 안 만들어도 됩니까?!"
"아뇨, 만들어야죠. 미친듯이 어려운거 만들필요 없습니다."
그러니까... 객체지향 공부하면서 어렵다고 하시지 마시구요.
"그럼 왜 배우는데요?"
만들어진 객체를 어떻게 하면 효율적으로 사용하는지도 배우구요.
간단한 객체 만드는 법을 배웁시다 >ㅅ<
(자, 그럼 간단하다가 어디까지인지...ㅡㅡ 후훗).. 자 장난이구요.....ㅡㅡ;;
그럼 다음 강의부터는 실제로 뿌요뿌요 하며 JAVA를 배워봅시다... >ㅆ<
쓰다보니 너무 길어져서 툭툭 잘라버립니다....~_~
자세한건 나중에 보죠.....ㅡㅡ;

댓글