'기반지식 > 객체지향 개념' 카테고리의 다른 글
[강좌 : 객체지향 - 6] 상속성 (1) | 2009.11.10 |
---|---|
[강좌 : 객체지향 - 5] 캡슐화 (0) | 2009.11.10 |
[강좌 : 객체지향 - 3] 객체지향 프로그래밍의 4대 특징 (0) | 2009.11.10 |
[강좌 : 객체지향 - 2] 객체지향 프로그래밍이란? (0) | 2009.11.10 |
[강좌 : 객체지향 - 1] 객체지향에 대해 (0) | 2009.11.10 |
[강좌 : 객체지향 - 6] 상속성 (1) | 2009.11.10 |
---|---|
[강좌 : 객체지향 - 5] 캡슐화 (0) | 2009.11.10 |
[강좌 : 객체지향 - 3] 객체지향 프로그래밍의 4대 특징 (0) | 2009.11.10 |
[강좌 : 객체지향 - 2] 객체지향 프로그래밍이란? (0) | 2009.11.10 |
[강좌 : 객체지향 - 1] 객체지향에 대해 (0) | 2009.11.10 |
[강좌 : 객체지향 - 5] 캡슐화 (0) | 2009.11.10 |
---|---|
[강좌 : 객체지향 - 4] 추상화 (0) | 2009.11.10 |
[강좌 : 객체지향 - 2] 객체지향 프로그래밍이란? (0) | 2009.11.10 |
[강좌 : 객체지향 - 1] 객체지향에 대해 (0) | 2009.11.10 |
객체지향언어 - C# (0) | 2009.11.10 |
[강좌 : 객체지향 - 5] 캡슐화 (0) | 2009.11.10 |
---|---|
[강좌 : 객체지향 - 4] 추상화 (0) | 2009.11.10 |
[강좌 : 객체지향 - 3] 객체지향 프로그래밍의 4대 특징 (0) | 2009.11.10 |
[강좌 : 객체지향 - 1] 객체지향에 대해 (0) | 2009.11.10 |
객체지향언어 - C# (0) | 2009.11.10 |
[강좌 : 객체지향 - 5] 캡슐화 (0) | 2009.11.10 |
---|---|
[강좌 : 객체지향 - 4] 추상화 (0) | 2009.11.10 |
[강좌 : 객체지향 - 3] 객체지향 프로그래밍의 4대 특징 (0) | 2009.11.10 |
[강좌 : 객체지향 - 2] 객체지향 프로그래밍이란? (0) | 2009.11.10 |
객체지향언어 - C# (0) | 2009.11.10 |
4. 객체지향언어 - C#
4.1 맛보기
Java, C++, C#등을 공부하고 있는 많은 학생들이 오해하고 있는 부분이 있다. 심지어 필자가 실무에서 학생들을 가르치면서 필자에게 닷넷을 배우러 오는 학생들 중에 1년 안팎의 실무 경력을 가진 학생들에게 다음과 같이 질문을 해보면 너무도 놀라운 대답을 한다.
필자 : 본인들이 하고 있는 C#의 "객체지향 언어"라는 것이 어떤 의미이지?
학생 1 : 글쎄요... 그거 class를 사용하여 프로그램 하는 것 아닌가요?
학생 2 : 음, 모든 프로그램의 중심이 객체라는 것 아닌가요?
필자 : 그렇다면 객체란 무엇이지?
학생 1 : 음 사물이요......
학생 2 : 프로그램에서 실 생활과 같이 객체를 class로 만들어 사용하는 것 아닌가요?
필자 : 그렇다면 객체지향 언어와 그렇지 않은 프로그램 언어는 뭐가 다른 거야?
학생 1 : 음...
학생 2 : 객체지향 언어는 모두 class로 코딩을 하지만 아닌 언어는 그렇지 않아요.
필자 : 그 차이 밖에는 없는 건가?
학생 2 : 아닌가?
위의 대화 내용을 보면서 여러분들은 어떻게 생각하는가? 물론 초심자들은 위의 내용조차도 생소할지 모른다. 하지만 혹 대학에서 전산학을 전공하면서 약간의 프로그램적 경험이 있다면 생소하지는 않을 것이다.
위의 대화 내용에서 필자의 질문에 여러분은 어떻게 대답할 것인가?
위의 대화 내용에서 학생들이 대답한 것은 절대로 틀리지 않았다. 하지만 필자가 답답함을 느끼는 이유는 객체지향 언어 라는 단어중에 객체지향이라는 단어가 절대로 코딩을 하는 기법을 이야기 하는 것이 아니기 때문이다.
그런데도 위 두 학생은 모두 마치 객체지향 이라는 의미가 프로그램 실제 코딩을 하는 하나의 기법으로 오해하고 있다는 것이다.
실제 컴퓨터 프로그램에서 객체지향 이라는 개념을 처음으로 도입한 회사는 바로 마이크로소프트 사이다.
마이크로소프트 사는 하드웨어 통제를 하기 위해 1972년 만들어진 C 라는 언어를 조금더 효율적으로 사용할 목적으로 C++ 이라는 컴퓨터 프로그램 언어를 만들어 발표하였고 이 C++이라는 언어에 처음으로 객체지향 개념을 도입하였다.
그렇다. 위의 내용을 다시 한번 잘 읽어 보라. 마이크로소프트사가 C++ 이라는 언어를 만들면서 객체지향 개념을 도입한 것이지 마이크로소프트사가 객체지향 개념을 만든 것은 아니다. 즉 원래 객체지향 개념은 컴퓨터 프로그램을 만드는 기법으로 만들어 진 개념이 아니라는 것. 이미 객체지향 이라는 개념은 지구상에 존재하고 있었던 개념이지 새롭게 만들어진 개념이 아니라는 것이다. 이 개념을 마이크로소프트사는 컴퓨터프로그램이라는 곳에 적용시킨 것이다. 그리고 선(SUN)사에서, 이런 C++ 이라는 언어가 가지고 있던 최대 단점인 “문법적으로 사용자가 접근하기가 쉽지 않다” 라는 점을 최대한 보완하여 만들어 낸 것이 바로 JAVA 이다.
도대체 이 사람 무슨 말이 하고 싶은 거야? 라고 하는 사람도 있겠지만, 객체지향이라는 개념을 마이크로소프트사가 C++에 적용한 것은 바로 설계 기법이다. 프로그램을 만들때 프로그램적 설계 기법에 객체지향 이라는 개념을 도입한 것이다.
그리고 우리가 배우고 있는 C#도 마찬가지이다.
생각을 한번 해보자. 우리는 앞에서 닷넷 프레임워크를 배우면서 BCL 이라는 마이크로소프트사가 만들어 놓은 클래스 라이브러리를 MSDN을 통해서 잠깐 접해 보았다. 그리고 공부를 조금 진행해 보니까 우리가 그렇게 아무렇지도 않게 사용하던 데이터 타입 int 형 조차도 BCL 내부에 정의되어 있는 하나의 struct 타입 이라는 것도 알게 되었다.
그렇다. 이미 마이크로소프트사도 BCL 을 객체지향 이라는 개념으로 아주 크게 라이브러리를 설계해 놓은 것이며, 그 덕분에 우리는 BCL 내부에 있는 class 등을 우리가 사용하고 싶을 때 마음 대로 사용하는 것이다.
초심자들은 어렵게 생각할 것 없다.
Console.WriteLine("안녕하세요");
이제 위의 코딩을 모르는 사람은 없을 것이다. Console 이라는 명령어를 우리가 사용할 수 있는 이유는 바로 이 명령어가 BCL 내부에 정의 되어 있기 때문이다.
이쯤 되면 아마도 이런 질문을 할 분이 있을지 모르겠다. 그렇다면 프로그래머는 마이크로소프트사가 정의해 놓은 객체지향 개념의 BCL내부의 내용을 그냥 가져다 사용하면 되는 것 아닌가요 라고 말이다.
위의 질문은 맞는 말이면서 틀린 말이다. 이 궁금증을 풀어야 한다. 그리고 필자가 던진 “위의 질문은 맞는 말이면서도 틀린 말이다” 라고 하는 이 한 문장을 여러분들이 필자의 강좌를 보면서 이해한다면 정말 필자도 보람을 느낄 것 같다.
자, 이 시점에서 필자는 차후 강좌 진행을 위해서 한 가지 예제를 진행해보고자 한다. 도대체 객체지향 이라는 개념이 C#이라는 프로그램에 어떤 모습인지 말이다. 그릐고 필자가 앞에서 이야기 하고 있는 부분들이 어떤 내용인지 말이다.
지금 진행하려고 하는 예제는 초심자들에게는 좀 어려울 수도 있다. 하지만 혹 이해가 되지 않는다고 하더라도 그냥 좀 따라해 주기 바란다.
예제 진행과 동시에 차후 확실한 개념 이해를 위해서 필자는 스토리를 만들었다.
* 스토리 1
- 4칙연산을 할 수 있는 계산기를 만들자.
- 테스트를 위하여 콘솔에서 일단 만든다.
- 이 계산기는 2개의 숫자를 입력받아 +,-,*,/ 라는 4칙연산중에 하나를 선택하면 그 결과를 보여준다.(단 나눗셈은 소수점 계산은 하지 않고 몫과 나머지를 보여준다.)
자, 위의 내용을 보면 바로 비쥬얼스튜디오를 열고 콘솔 응용프로그램을 선택하는 분들이 있다. 절대로 그렇게 해서는 안된다. 앞에서 필자가 이야기 했듯이 객체지향이라는 개념은 설계적 개념이다. 즉 프로그램에 앞서 어떤 특정 프로그램을 작성하려면 우선 객체지향 개념으로 설계부터 해야 한다라는 것이다.
차후 다음 강좌에서 조금 더 자세하게 진행 하겠지만 일단 필자를 믿고 따라와 주길 바란다.
위의 프로그램을 작성하려 할 때 객체지향 개념으로 프로그램을 작성하려면 프로그래머는 선택부터 해야 한다.
우리는 C# 이라는 언어를 배우고 있지만, 앞에서 계속 언급했듯 "객체지향"이라는 개념을 도입한 언어라면 상관없다. 자바든 C++ 이든 즉 우선 어떤 프로그램으로 위의 프로젝트를 진행할지 결정한다. 우리는 객체지향 개념이 도입되어 있는 언어 중에서 특히 C# 을 선택한 것이다.
C#을 선택했다면 비쥬얼 스튜디오를 열면 되는가?
아니다. 오히려 이 시점에서 우리에게 필요한 것은 아주 깨끗한 A4지 한 장과 볼펜이다.
다시 한번 강조하지만 객체지향은 하나의 설계기법이라고 보는 관점이 맞다. 즉 객체지향언어인 C#으로 어떤 프로그램을 만든다고 한다면 당연히 설계를 먼저 해야 한다는 의미와 일맥상통한다.
자, 여러분은 지금 A4지와 볼펜을 준비하자. 그리고 필자가 시키는 대로 따라 해보자.
위의 스토리를 보면서, 저 계산기를 만들때 필요한 객체를 모두 적어보자.
이렇게 하면 모두들 혼란스러워 한다. 심지어 조금 프로그램 경력이 있는 사람들은 필자의 의도와는 완전히 다른 쪽으로 생각을 접근한다.
초심자는 무슨 말인지 이해하지 못하고 좀 아는 분들은 이미 머릿속에 본인들이 사용할 BCL 내부에 있는 명령어들부터 떠 올린다.
윈폼을 주로 한 사람들은 윈폼에서 버튼을 몇 개 만들 것이며, 디자인은 위해서 GDI+를 사용하면 좀 더 예쁜 계산기를 만들 수 있겠구나 머 이런 고민을 하고, 웹폼을 주로 한 프로그래머는 Html은 어떻게 구성하고 차후 렌더링 되면 어떻게 되나 머 이런 것들을 고민할 지 모르겠다.
그러나 이것은 필자가 요구한 것이 아니다. 이런 내용들은 이미 설계의 단계를 지나쳐 버렸다. 벌써 어떻게 구현할 건지를 고민한 것이다.
필자가 요구한 것은 오히려 "실생활에서 본인이 계산기를 만든다면 필요한 것이 무엇이냐"라는 개념에 대한 질문을 한 것이다.
실제 필자가 실무에서 학생들을 가르치면서 특히 데이터베이스 수업을 진행해 보면 오히려 처음으로 배우는 초심자들이 오히려 데이터베이스 설계 수업은 이해가 빠르고 차후 문법적용으로 들어가면 경력자들이 우세하다는 사실을 알게 되었다. 경력자들은 오히려 설계를 하라고 하면 먼저 구현부터 생각한다. 그래서는 안된다. 오히려 설계는 순수하게 접근하는 것이 맞다.
그리고 필자가 앞에서 언급했듯이 객체지향 이라는 기법은 원래부터 컴퓨터 프로그램을 위하여 도출되어진 이론이 아니다. 이미 실생활에서 여러 분야에서 사용되던 하나의 이론이다. 그것을 마이크로소프트 사가 컴퓨터 프로그램 분야에 적용시킨 것이다.
이 계산기 예제에서 객체를 골라 보라고 한다면 설계 단계에서는 오히려 순수하게 실생활에 근접하게 객체 즉 사물을 떠올리는 것이 타당하다고 하겠다.
자, 이제 다시 생각해 보라. 어떤가?
공대를 다니는 공학생이라면 공학용 계산기를 떠올릴지도 모르지만 우리는 4칙 연산만을 제공하는 계산기를 만들자고 한정하였고 그렇다면 차라리 우리 어머니들이 주로 집에서 가계부를 작성하실 때 사용하는 계산기를 떠올려 보자. 그렇다면 이렇게 정리해 볼 수 있지 않을까?
* 어머니가 사용하시는 계산기를 보면서 떠 올린 객체(사물)
1. 계산기 몸체
2. 계산기 버튼들
- 1 ~ 9 까지의 숫자 버튼
- +, -, *, / 4칙연산 버튼
- = 버튼
- CLEAR를 위한 C 버튼
3. 선택된 버튼의 값이 표시된 LED 계기판
어떤가? 일단 이 정도만 있으면 계산기 몸체는 만들 수 있을 것 같다.
아직 필자가 객체지향에 대한 자세한 설명을 하지 않았기 때문에 초심자들은 이해가 좀 어렵겠지만 따라해 주길 바란다. 여기서 우리가 계산기를 완성하려면 다음과 같은 과정을 이해해야 한다.
1. 계산기 사용자가 본인이 필요한 버튼을 누르면 LED 에 그 값이 표현된다. (사용자의 행위)
2. LED에 표시된 값은 계산기의 메모리에 저장되어야 한다. (계산기가 스스로 할 행위)
3. 그렇게 2개의 값과 하나의 연산(+,-,*,/)의 값이 기억되고 드디어 = 버튼을 사용자가 누른다. (사용자의 행위)
4. 2개의 값과 연산을 기억한 계산기 4개의 연산중에 적당한 연산을 찾아 두 개의 값을 연산한다 (계산기가 스스로 할 행위)
5. 결과값이 LED에 명시된다. (계산기가 처리해야 할 행위)
이렇게 지구상의 모든 것을 사물(객체) 중심으로 받아들이는 것이다. 그리고 각각의 객체의 특성과 행위를 찾아서 그 객체를 설명하는 것이다.
현재 위의 프로젝트에는 실제 아주 크게 보면 2개의 객체가 존재한다.
1. 계산기
2. 사용자
위의 두 개의 객체 중에 계산기를 만드는 것이 우리의 목적이다.
하지만 우리가 만든 계산기는 어쩔 수 없이 사용자(사람)와 서로의 상호 작용을 일으킨다. 그것을 무시할 수 없다. 그러나 강좌의 진행을 위해 우선 사용자는 무시하고 순수하게 계산기 쪽으로만 객체를 바라보자.
그렇다면 앞에서도 언급한 것처럼 계산기라는 객체는 다시 여러개의 객체로 이루어 져 있슴을 알 수 있다.
1. 계산기 몸체
2. 버튼들
3. LED 계기판
그리고 객체는 각각 속성과 행위로 나누어 표현되어 진다고 했다. 계산기 몸체부터 한번 살펴보자.
계산기 몸체는 특별하게 위의 설명에서 보듯이 특별하게 자기가 하는 행위는 없다. 다만 특성은 있다. 예를 들면 계산기 몸체 크기 정도가 되지 않을까? 즉 다음과 같다.
계산기 몸체 | |
특성 | 행위 |
가로길이 | 없음 |
세로길이 |
표 1
그리고 이제 버튼을 표현해 보자.
버튼도 앞에서 언급했던 것처럼 숫자버튼, 4칙연산버튼, =버튼, C버튼 으로 나뉘어진다. 각각의 특성과 행위를 살펴보자.
숫자 버튼 | |
특성 | 행위 |
가로길이 | 사용자가 누르면 눌려진다. |
세로길이 | |
버튼에 명시될 값 |
표 2
4칙 연산 버튼 | |
특성 | 행위 |
가로길이 | 사용자가 누르면 눌려진다. |
세로길이 | |
버튼에 명시될 값 |
표 3
= 버튼 | |
특성 | 행위 |
가로길이 | 사용자가 누르면 눌려진다. |
세로길이 | |
버튼에 명시될 값 |
표 4
C 버튼 | |
특성 | 행위 |
가로길이 | 사용자가 누르면 눌려진다.. |
세로길이 | |
버튼에 명시될 값 |
표 5
객체지향적 개념으로 접근할 때, 설계에서 프로그램적 사고는 배제되어야 하는 것이 당연히 옳다. 즉 계산기를 만든다고 했으면 우선 우리가 해야 할 일은 순수하게 계산기의 속성과 행위를 생각하는 것이다. 사실 실제 우리가 실생활에서 위와 같은 재료들을 구입하여 조립한다면 실제 버튼이 하는 일은 한 가지밖에 없다. 바로 사용자가 누르면 눌려지는 것, 그 한가지 뿐이다. 이렇게 바라보는이 바로 객체지향적 관점에서 계산기를 바라보는 것이다.
물론 이렇게만 한다면 우리는 계산기의 가장 중요한 기능을 빼먹게 된다. 즉 "계산을 한다" 라는 행위 말이다. 위의 경우 4칙 연산 이라는 행위를 빼 먹고 단순히 겉으로만 계산기를 완성시켰다. 즉 기능은 없고 모양만 있는 계산기의 모형이 되는 셈이다.
실제 계산기를 만들기 위해서는 필자가 닷넷을 설명하면서 언급한 바와 같이 비록 성능이 떨어지는 CPU라고 할지라도 CPU도 있어야 하며, 당연히 메모리도 있어야 하고, 프로그래머가 실제 짠 프로그램을 저장할 저장장치도 필요하게 된다.
여기서 우리는 컴퓨터 프로그램이라는 것에 대한 관점을 이해해야 한다. 컴퓨터 프로그램이 전지전능한 것은 아니다. 즉 프로그래머는 이미 컴퓨터라고 하는 하드웨어가 존재함을 인정하고 프로그램을 작성하는 것이다. 우리가 계산기를 실제 현실세계에서 만든다고 한다면 이미 여러분은 계산기 틀부터 버튼, 회로 등은 이미 만들어진 것들을 사서 조립하게 되지 않겠는가? 아무리 성능이 떨어지는 것이라고 해도 CPU 및 메모리를 우리가 직접 만들 수는 없지 않겠는가? 당연히 사야 한다.
프로그래머 역시 이미 틀이 완성된 상태에서 4칙 연산을 하는 프로그램만 만들어, 그 틀에 맞추어 넣게 되는 것이다.
다시 위의 계산기 프로그램을 생각해 보자.
위의 표로 명시된 5개의 객체를, 이미 만들어진 부품을 샀다고 한다면 여러분은 산 것들을 조립만 하면 된다.
그리고 CPU도 사고 메모리도 사고 보조기억장치도 샀다고 하고, 그것들을 모두 조립했다고 가정해 보자. 그러면 여러분은 이제 회로, 즉 4칙연산을 하는 프로그램만 작성하면 되는 것이다.
“아 도대체 이 사람이 무슨 말을 하는 거야” 라고 생각할지도 모르겠다. 그러나 굉장히 중요한 관점의 차이이다. 사실 우리가 만들어 내는 모든 프로그램은 일단 기본적으로 CPU, 메모리 등과 같은 컴퓨터 하드웨어는 존재한다고 인정하고 개발에 임하는 것이기 때문이다.
즉 프로그램에서 객체지향 언어라고 하는 것은 이미 기본적인 객체는 존재한다 라고 가정하고 시작한다는 것이다.
그렇다면 위에서 우리가 설계한 계산기의 몸체와 버튼은 어떻게 구한단 말인가? 라고 반문하겠지만, 닷넷이라는 플랫폼 자체에 계산기를 만들기 위하여 사용하게 될 물건들은 이미 마이크로소프트사가 제공하고 있다는 뜻이다.
즉 위에서 계산기의 틀이니, 버튼이니 하는 것은 이미 마이크로소프트사가 제공하는 것들을 가져다가 사용하면 된다는 것이다. 그리고 우리는 다만 그 제공하는 틀을 잘 활용하여 4칙연산 프로그램만을 작성하면 되는 것이다.
자, 정리해 보자.
1. 컴퓨터 프로그램이라는 것으로 계산기를 만들려고 한다.
2. 우리가 만든 계산기는 실제 생활에서 사용하는 것이 아니라 이미 컴퓨터 라는 공간에서 운영체제가 설치되어 있는 컴퓨터에서 사용자가 이미 컴퓨터를 시작한 상황에서 사용할 계산기이다.
3. 컴퓨터 프로그램 중에 어떤 언어를 사용할까?
- 우리는 마이크로소프트사가 제공하는 C# 이라는 언어를 사용할 것이다.
4. C#은 객체지향 언어이다.
- 그래서 우리는 앞에서 계산기에 필요한 객체들과 그 객체들의 속성 및 행위를 정리해 보았다.
5. 그렇다면 계산기 몸체와 버튼을 우리가 만들어야 하나?
- 아니다. 이미 마이크로소프트사가 닷넷 내부에 정의해 놓은 객체들을 가져다 조립만 하면 된다.
6. 어떻게 가져다 쓰지?
- 여기서 우리는 다시 한 가지를 결정해야 한다. 이 계산기를 사용하는 사용자가 인터넷을 통해 웹에서 사용할 것인지 아니면 일반 응용 프로그램으로 사용할 것인지 말이다.
7. 만약 웹에서 사용하려면?
- 그렇다면 닷넷 내부에서 제공되는 객체들 중에 계산기 틀과 버튼들을 모두 웹폼으로 사용해야 한다.
8. 만약 일반 응용 프로그램으로 사용하려면?
- 당연히 이 경우는 윈폼으로 작성되어야 한다.
9. 그런데 그것이 객체지향과는 무슨 연관인가?
- C#은 이미 마이크로소프트사가 BCL 내부에 클래스 등을 활용하여 객체지향 기법으로 설계된 내용을 이미 완성시켜 놓았다. 그래서 프로그래머는 현실 세계에서 계산기 틀을 구매하는 것처럼, BCL에 정의되어 있는 객체들을 가져다 사용하기만 하면 되는 것이다.
10. 그렇다면 프로그래머는 할 일이 없는 것 아닌가?
아니다. 현실 세계에서 계산기 조립을 마치고, 컴퓨터처럼 CPU 등을 설치했다고 해도 사용자는 아직 계산기를 사용할 수 없다.
여러분이 아무리 좋은 컴퓨터를 사도 윈도우와 같은 운영체제를 설치하지 않으면 컴퓨터를 사용할 수 없는 것과 같다.
필자는 위의 10가지로 정리해 보았다.
즉 마이크로소프트사는 이미 닷넷 프레임워크 내부의 BCL 에 많은 것들을 만들어 놓았다. 그 BCL 내부에 정리 되어 있는 프로그램 방식, 즉 설계 기법이 객체지향 방식이다.
그래서 우리가 그 내부에 있는 객체들을 가져다 사용함에 있어 효과적으로 운영하고 사용하려면 그 객체지향 기법에 대하여 이해력을 가지고 있어야 한다.
생각해 보라. 실생활에서 식당이라는 것을 운영하고 김치찌개를 만들어 판다고 해도 좀 더 맛있는 김치를 담기 위해서는 여러분은 좋은 배추를 고르는 방법에서부터 많은 지식들을 가지고 있어야 한다.
마찬가지이다. 단순히 그냥 아무 것이나 막 가져다 쓸 수는 없지 않은가. 이것이 바로 프로그래머가 객체지향 개념을 이해해야 하는 첫 번째 이유이다.
아마 초심자들은 도대체 무슨 말인지 이해가 잘 되지 않을 것이다.
이 강좌에서 초심자들까지 이해시킬 수 있도록 계산기 폼을 만든다는 것은 정말이지 실현 불가능이다. 왜냐하면 그래도 윈폼에 대한 기본적 지식은 있어야 하기 때문이다.
그래서 일단 객체지향 개념의 이해 차원에서 설명하기 위해서라도 그냥 간단하게 흉내만 내 보려 한다.
* 비쥬얼 스튜디오를 열자.
* 파일 -> 새로만들기 -> 프로젝트 를 차례대로 선택하자.
* 그리고 그림 1에서 처럼 윈도우 응용 프로그램을 선택하자.
그럼 그림 2처럼 나온다.
그림 1
그림 2
윈폼을 한번쯤 다루어 본 분들은 이해가 쉽겠지만 처음이라면 그냥 일단 필자를 믿고 따라해 보자.
그림 2의 왼쪽에 상단에 보이는 도구상자라는 탭을 선택해 보자.
그림 3
위의 그림 3처럼 나올 것이다. 필자가 빨간색 사각형을 칠한 Button 이라는 글자를 더블 클릭해 보라.
그림 4
그림 4처럼 오른쪽 디자인 페이지에 Form1 위에 하나의 버튼이 생성될 것이다.
그렇다면 저 버튼을 클릭해서 크기를 조절해 보자. 크기를 조절하는 것은 어렵지 않을 것이다.
그림 5
그림 5처럼 만들어 지는가?
그림 6
버튼을 클릭한 상태에서 왼쪽에 있는 속성 탭을 선택해 보자. 그러면 그림 6처럼 나올 것이다.
거기서 스크롤을 활용하여 아래로 내려보자. 그러면 그림 7처럼 text 라는 속성이 보일 것이다. 그 값을 숫자 1로 변경해 보자 (지금은 button1 이라고 되어 있다)
그림 7
그럼 아마도 다음 그림 8처럼 바뀌어 있을 것이다.
그림 8
어떤가? 초심자들은 신기할 지도 모르겠다. 그렇다. 필자가 앞에서 계속해서 이야기했듯이 우리가 현실 세계에서 계산기를 만든다고 했을 때, 가게에서 계산기 모양의 틀과 버튼을 구매하는 것처럼 마이크로소프트 사는 이미 이런 툴을 여러분에게 제공하고 있는 것이다.
자, 좀 더 확실히 이해하기 위해서 Ctrl + F5 를 눌러보자.
그러면 여러분이 만든 프로그램이 실행되면서 결과물이 나올 것이다. 그러면 그 결과물의 1 이라는 버튼도 한번 클릭해 보자. 어떤가? 잘 클릭되는가? 클릭은 잘 될 것이다. 그렇다면 여러분은 왼쪽 도구상자를 이용하여 잘 하면 계산기의 모양은 만들 수 있지 않겠는가?
이쯤 되면 혹 일부 초심자들은 아 별거 아니구나 하는 생각을 할 것이다. 그러나 그렇지 않다는 것을 미리 이야기 하고 싶다.
하여튼 우리는 이렇게 마이크로소프트사가 제공하는 툴을 활용하여 디자인을 할 수 있는 것이다.
그러나 이러한 디자인 역시, 이미 BCL 내부에 정의되어 있는 객체지향적 개념으로 설계된 클래스 등을 우리가 가져다 사용하고 있다는 사실을 알아야 한다. 또한 왼쪽 도구 상자에서 Button 이라는 객체를 더블 클릭하면 Form1 이라는 객체 내에 자동으로 생성되어지지만 사실 내부적으로 이미 프로그램이 코딩되고 있다는 사실도 알아야 한다. 이 부분에 대해서는 차후에 이야기 하겠다.
방금 우리가 만든 Button은 이미 프로그래머가 사용하기 편하게 하기 위해서 닷넷 프레임워크 내부의 BCL 에 정의 되어 있다는 것이다. 실제로 그런 것인지 확인해 보자.
우선 MSDN 사이트를 방문하자.
http://msdn.microsoft.com/ko-kr/default.aspx
그리고 검색란에 그림 9 와 같이 Button이라고 치고 검색해 보자. 그림 10과 같이 나올 것이다.
그림 9
그림 10
그림 10에서 보면 알수 있듯이 버튼(Button)도 여러 종류가 있다. 우선 여기서는 네임스페이스가 System.Windows.Forms 라고 되어 있는 (필자 검색 결과에서는 맨 위의 것)을 클릭하고 페이지를 이동해 보자. 그리고 오른쪽 설명 부분에서 C# 부분을 필자는 캡쳐했다.
그림 11에서 보면 알겠지만, 우리가 만든 그것도 아주 쉽게 툴에서 만들었던 그 버튼도 결국 class 라는 데이터 타입으로 이미 BCL 내부에 정의되어 있다. 그리고 우리가 툴을 이용하여 디자인을 만들었지만 실제 내부에는 이미 Button 이라는 클래스가 사용되어 지고 있는 것이다.
뭐 그 내부까지 우리가 알 필요가 있습니까? 라고 되묻고 싶은 사람도 있겠지만 물론이다. 지금 필자는 객체지향 개념과 필요성에 관한 강좌를 하고 있고 초심자들을 위하여 계산기를 만들 때 객체지향의 개념 접근 방식에 관하여 설명하다 보니 이렇게 예를 들고 있을 뿐 차후 객체지향 개념의 강좌가 끝날 무렵에는 분명히 다를 것이기 때문이다.
그림 11
우리는 계산기를 만들기 위해서 이미 앞에서 필요한 객체를 찾아 보았고 그 객체의 속성과 행위를 찾아 보았다.
그런데 앞에서 우리가 정리했던 표 다섯 개의 객체는, 결국 우리가 현실세계에서 계산기 틀과 버튼을 구입하듯이 이미 마이크로소프트사가 제공하는 윈도우 응용프로그램으로 해결할 수 있다는 것을 알았다.
그렇다. 결국 우리가 앞에서 종이와 볼펜을 활용하여 설계해 보았던 객체들은 결국 마이크로소프트사가 제공하고 있다는 것을 알았다. 그리고 이 객체들은 결국 BCL 내부에 객체지향적 개념으로 설계되어 이미 만들어져 있다는 사실도 알게 되었다.
그렇다면 프로그래머는 무엇을 한단 말인가?
아직 초심자들에게 정확히 이 개념을 전달하기란 어렵다. 하지만 일단 다시 한번 필자를 믿고 우리가 찾아 놓은 MSDN 을 조금 더 살펴보자.
그림 11의 내용중 Button 이 선언되어 있는 코딩 부분을 좀 살펴보자.
[ComVisibleAttribute(true)] [ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)] public class Button : ButtonBase, IButtonControl |
표 6
위의 코드가 잘 이해 되는가? 도대체 저게 무슨 소리인지 말이다.
정답부터 이야기 하면 저 코딩 모두가 바로 객체지향 개념에서 시작되는 코딩 기법이다. 즉 객체지향의 개념이 이해되어야 이해할 수 있는 부분이라는 것이다.
저 내용을 이해해야 하다 못해 앞에서 우리가 했던 계산기 틀을 만드는 과정에서 좀 더 멋지고 이쁘고 기능이 다양한 계산기틀을 만들 수 있는 것이다.
좀 이해가 되는가? 아직 어려울 것이다.
정리해 보자.
* 우리는 계산기를 만들려 했다.
* 그리고 C#으로 만들기로 했다. 그래서 계산기에 필요한 객체들과 속성들, 행위들을 정의하고 정리했다. 그리고 그 정리된 내용대로 마이크로소프트사가 제공하는 윈도우 응용 프로그램을 활용하여 만들 수 있다는 것을 알았다.
* 그런데 우리가 막연하게 사용하는 툴도 결국 닷넷 프레임 워크 내부의 BCL에 이미 정의 되어 있는 클래스들을 활용하고 있는 것이라는 것도 알았다.
* 그런데 그 클래스들도 결국 객체지향적 설계로 이루어져 있다.
* 그래서 비록 우리가 MSDN을 찾았음에도 아직 그 내용을 이해하기가 쉽지 않다.
여기까지 이해가 되는가? 자, 원점으로 돌아오자. 어째든 우리는 계산기 모양을 완성했다고 치자. 그러나 아직 계산기는 동작하지 않는다.
우리는 이제 겨우 마이크로소프트사가 제공하는 툴을 활용(엄밀히 말하면 BCL에 정의 되어 있는 내용을 활용)하여 계산기 외부만을 만든 것이다. 즉 프로그램 관점에서 보면 이미 우리는 클라이언트에게 보여줄 부분(VIEW)을 완성한 것이다.
이제 이렇게 만들어진 계산기의 계산을 하는 것은 우리가 직접 만들어야 한다. 즉 로직부분, 계산기의 가장 핵심인 회로 부분이이 필요하게 된 것이다.
그래서 또다시 설계가 필요하게 된다.
다만 이 시점에서는 앞에서 생각했던 여러 개의 객체를 하나로 줄일 수가 있다. 왜냐하면 우리는 여러 개의 객체를 모아서 "계산기"라는 하나의 모양으로 완성시켰기 때문이다.
그래서 이제 우리의 눈앞에는 단 하나의 객체만이 있다. 그것이 바로 계산기이다.
그러면 이제 그 계산기가 가지는 속성과 행위를 찾아보자. 다음과 같다.
계산기 | |
특성(속성) | 행위 |
계산기 크기 크기는 이미 정해졌다. 계산기 틀이 완성되었기 때문에. | 덧셈을 한다. |
버튼의 크기 이것도 완성되었다. | 뺄셈을 한다. |
LED판 여기서는 신경 끄자. | 나눗셈을 한다. |
위에서 보았듯, 계산기의 기본 특성은 이미 틀이 만들어질 때 완료되어 버렸다. | 곱셈을 한다. |
표 7
앞에서 표 5개로 설계해 본 것과 같이, 다시금 위 표 7 처럼 설계하는 과정을 객체지향적 설계라고 하는 것이다.
그리고 이렇게 설계된 내용을 프로그램으로 표현해야 한다. 객체지향 언어에서 위와 같이 설계된 내용을 표현하기에 가장 적절한 데이터 타입이 바로 class와 앞에서 배웠던 struct 라고 하는 것인데, 물론 아직 class에 관해서는 언급하지 않았다. 계속 설명해 나갈 것이다.
프로그램은 이미 앞에서 언급했듯이 필요한 값을 메모리에 저장했다가 적절한 시기에 CPU에게 연산을 시키는 과정이라고 했다.
다음의 코드를 잠시 보자.
using System;
namespace Plus_Ex01 { class Program { static void Main(string[] args) { int i = 16; int j = 8; int plus = i + j; int minus = i - j; int cross = i * j; int devide = i / j; Console.WriteLine("덧셈결과 : {0} - 뺄셈결과 : {1} - 곱셈결과 : {2} - 나눗셈결과 : {3}",plus,minus,cross,devide); } } } |
예제 1
위의 코딩은 결국 4칙연산을 모두 하고 있다. 그러나 단점이 있다. 결국 16과 8의 4칙연산만을 할 수 있을 뿐 우리가 원하는 결과는 아니다. 즉 위의 코딩은 객체지향적 코딩이 아니다.
우리는 이미 계산기라는 객체를 설계하였다. 그리고 우리가 말하는 계산기라는 객체는 어떤 상황 속에서도 두 개의 변화되는 값을 주면 계산을 해내야 한다.
그래서 객체지향적 프로그램에서는 그 객체를 표현하는 수단으로 두 가지를 제공하고 있다. 그것이 바로 위에서 이야기한 class 와 struct 이다.
좀 더 자세한 것은 앞으로 강좌에서 하나씩 언급하겠다. 우선 다음 예제를 보도록 하자.
using System;
namespace Chapter04_Ex02 { class Cal { public void Plus(int a, int b) { int p = a + b; Console.WriteLine("덧셈 결과 : {0}",p); } public void Minus(int a, int b) { int m = a - b; Console.WriteLine("뺄셈 결과 : {0}", m); } public void Cross(int a, int b) { int c = a * b; Console.WriteLine("곱셈 결과 : {0}", c); } public void Devide(int a, int b) { int d = a / b; Console.WriteLine("나눗셈 결과 : {0}", d); } }
class Program { static void Main(string[] args) { Cal MyCal = new Cal(); MyCal.Plus(16, 8); MyCal.Minus(16, 8); MyCal.Cross(16, 8); MyCal.Devide(16, 8); } } }
|
예제 2
물론 아직 위의 코드가 낯설 것이다. 우리는 정확히 class 가 무엇인지에 대해서도 배우지 않았으니까.
필자는 표 7에서 설계한 계산기를 class 라는 데이터 타입을 사용하여 정의하였다. 그리고 그 계산기가 행하는 행위를 4개의 메써드(METHOD) Plus(덧셈), Minus(뺄셈), Cross(곱셈), Devide(나눗셈)으로 표현했고, Main()함수에서 다음과 같이 코딩하였다.
Cal MyCal = new Cal(); |
위 코딩은 차후에 다시 자세히 설명하겠지만 메모리에 위의 class 내용을 모두 Heap공간에 할당하고 그 주소값을 stack영역의 MyCal 이라는 곳에 저장하라는 의미이다. 이해가 되지 않는다면 그냥 쉽게 위의 Cal 이라는 계산기의 코드 모두를 메모리에 저장한다고 이해해 주기 바란다.
MyCal.Plus(16, 8); MyCal.Minus(16, 8); MyCal.Cross(16, 8); MyCal.Devide(16, 8); |
차례대로 4개의 메소드를 호출하여 그 결과값을 화면에 출력하였다.
앞에서 이미 우리는 계산기 모양은 만들어 두었다. 그리고 이번에는 실제 계산기 로직이 포함된 코딩을 해 보았다. 즉 모양과 내부 회로(실제의 프로그램)를 따로 설계한 것이다. 그리고 class 라는 새로운 데이터 타입을 활용하여 설계되어진 객체를 프로그램으로 표현하였다.
그렇다면 이제 우리가 할 일은, 미리 만들어 놓은 계산기 모형에다가 나중에 만든 프로그램을 연결하는 것이다.
몇번이나 말했듯 객체지향이란 개념은 설계적 개념이다. 즉 모형과 로직을 따로 설계하는 것이다. 그리고 지금은 이 두 개를 합치는 일만 남았다.
아직 어려울 것이다. 도대체 무슨 말을 하는 거야 라고 말이다. 그래서 앞으로 하나씩 배워야 한다. 이번 강좌는 차근 차근 읽고 따라 할 것들은 반드시 따라해 보길 권한다.
정리해 보면 우리는 계산기 프로그램을 짜려고 했다. 그래서 객체지향 개념으로 설계도 했다. 그런데 그 설계가 두 가지로 나뉘었다. 하나는 계산기 모형이었고 하나는 실제 계산을 하는 로직이었다.
그리고 그러한 객체를 표현하는 수단은 이미 앞에서 찾아본 것처럼 마이크로소프트사가 제공하는 것도 class 라는 데이터 타입이었고, 우리가 사용한 것도 class 이었다.
즉 객체지향 프로그램은 결국 객체를 중심으로 설계를 하고, 그 설계를 기반으로 프로그램을 작성하는 것이다.
다음 강좌부터는 본격적으로 객체지향 개념과 객체지향 개념을 프로그램에서 어떻게 표현하며 객체지향 프로그램의 장점은 무엇인지에 대하여 하나씩 알아보겠습니다.
이 강좌의 예제 파일은 업로드 되어 있는 파일을 받으셔서 압축을 푸시면 들어 있습니다.
--------------------------------------------------------------------------------
혹 퍼가시거나 배포하실분은 출처를 반드시 표시해 주세요
부산직업전문학교 닷넷 전임강사 이지완 카페 - cafe.naver.com/busanitnet
--------------------------------------------------------------------------------
[강좌 : 객체지향 - 5] 캡슐화 (0) | 2009.11.10 |
---|---|
[강좌 : 객체지향 - 4] 추상화 (0) | 2009.11.10 |
[강좌 : 객체지향 - 3] 객체지향 프로그래밍의 4대 특징 (0) | 2009.11.10 |
[강좌 : 객체지향 - 2] 객체지향 프로그래밍이란? (0) | 2009.11.10 |
[강좌 : 객체지향 - 1] 객체지향에 대해 (0) | 2009.11.10 |
|
아하... 그랬었군요... ^^;................... (도움은 못드려서 ㅈㅅ.... 쩌비... )
상황파악이 되셨으니, 어렵지않게 해결하시리라 생각되네요...
하루에 한시간씩 시간투자를 하는데... gl study 할시간은.. ㅡ,ㅡ;;;;;;;;;;;..........
힘 내세요...
^^;...................................
저도 굉장히 궁금한 부분이네요.
역시 cocos2d를 사용하고 있고..게임의 규모가 커지다보니 슬슬 메모리의 압박이 시작되는 것 같아서요..
혹시 알게 되시면 소중한 정보 공유해주시면 정말 감사하겠습니다. (_ _);;
해결했습니다. 대충 답이 맞는지 어쩐지는 확신은 없으나 일단 용량문제나 실행상의 문제는 전혀없게됐습니다.
대충 문제의 원인에 대해 말씀드리자면.. 해당 이미지를 불러올때..
_texture[0] = [[Texture2D alloc] initWithImage:[UIImage imageNamed:@"A.png"]];
이런식으로 불러옵니다. [Texture2D alloc] <- 이부분에서 한번 메모리를 추가하죠..
[UIImage imageNamed:파일이름] 이녀석의 정의를 보면 + (UIImage *)imageNamed:(NSString *)name; 입니다.
안을 열어볼순없지만 alloc를 한다는 거죠; initWithImage안을 보면 UIImage ImageNamed:""로 불러온 녀석의 메모리를
해제하는 코드가 없더군요.. 해결방법은 맨 마지막줄 reutrn self; 전에 [uiImage release]; 한줄 추가해주시면 됩니다.
cocos2d라이브러리 템플릿 사용하시는 분은 처음 라이브러리 만드시는 단계에서 수정하셔서 시뮬레이션 - cocos2d
디바이스 - cocos2d 를 해주신후에 나온 라이브러리 파일과 함께 Texture2D.h파일을 복사해서 덮어쓰시면 됩니다.
^^;.................... 그렇군요... ㄳㄳ...
[MammothHunting] - Cocos2D를 사용한 아이폰 게임 개발 튜토리얼 1 (0) | 2010.07.02 |
---|---|
코코스2D엔진에서 스프라이트 에니메이션을 특정프레임만 재생하고 싶습니다. (2) | 2010.01.20 |
Cocos2D - 각종 레퍼런스 (0) | 2009.11.06 |
cocos2D로 시작해보자 (0) | 2009.11.06 |
Cocos2d 애니메이션 구현하기 3 (0) | 2009.11.06 |
코코스2D엔진에서 스프라이트 에니메이션을 특정프레임만 재생하고 싶습니다. (2) | 2010.01.20 |
---|---|
cocos2d 이미지 메모리 사용 절약 (0) | 2009.11.07 |
cocos2D로 시작해보자 (0) | 2009.11.06 |
Cocos2d 애니메이션 구현하기 3 (0) | 2009.11.06 |
Cocos2d 애니메이션 구현하기 2 (0) | 2009.11.06 |
cocos2d 이미지 메모리 사용 절약 (0) | 2009.11.07 |
---|---|
Cocos2D - 각종 레퍼런스 (0) | 2009.11.06 |
Cocos2d 애니메이션 구현하기 3 (0) | 2009.11.06 |
Cocos2d 애니메이션 구현하기 2 (0) | 2009.11.06 |
Cocos2d 애니메이션 구현하기 1 (0) | 2009.11.06 |
Cocos2D - 각종 레퍼런스 (0) | 2009.11.06 |
---|---|
cocos2D로 시작해보자 (0) | 2009.11.06 |
Cocos2d 애니메이션 구현하기 2 (0) | 2009.11.06 |
Cocos2d 애니메이션 구현하기 1 (0) | 2009.11.06 |
메뉴 만들기 (0) | 2009.11.06 |