728x90
script language중에서 Python은 구조적 프로그래밍언어이고 Ruby는 객체지향언어이다. 파이썬은 함수를 나누어 작성하는 것이 루비는 클레스를 지원한다는 정도로 알아두면 된다.
구조적 언어와 객체지향적 언어의 개념은 대부분의 프로그래밍 언어를 이해하는데 base가 되므로 시간이 날 때마다 조금씩 공부해두는 편이 좋다.
파이썬을 아주아주 잠시 사용해보다가 루비로 넘어온 결정적인 이유!

1. 대세는 루비다.
리눅스 공개버젼에서 대부분 루비를 탑제한 채 배포한다. 루비가 널리 퍼진 것은 얼마되지 않았지만 이미 많은 프로그래머가 세계적으로도 많은 프로그래머가 파이썬에서 루비로 옮겨왔다.

2. Python에서 coding은 한번에 잘해야 좋다.(수정이 어렵다.)
나한테만 해당되는 말이니 말도 안되는 소리라고 생각되더라도 그냥 넘어가라. Python은 문법에서 indentation(들여쓰기)이 매우 중요하다. {}등으로 scope(범위)지정을 지원하지 않기 때문에 indentation으로 구분한다. 즉 들여쓰기만으로 범위를 결정하고 스페이스 하나 차이로 소스가 아주 엉뚱하게 작동하는 경우가 많다. 사실 이 부분이 결정적인 이유다. 나는 실수가 많은 사람이라 자꾸 고쳐줘야 한다. 단순무식한 열혈 프로그래머에게 Python은 산이 높다.

Why use the script language?
스크립트언어는 Perl이 87년(CGI에서 사용되는 것은 91년), PHP와 Ruby는 95년에 나왔다.
무지 늦게 나왔다는 말이다.
스크립트언어는 문자열처리에 강력하고, 디버그와 수정이 쉽다는 특징을 가지고 있다.
유닉스와 함께 걸어왔으며 웹편집에 이용되면서 엄청난 힘을 얻었다. web2.0이 퍼지면서 스크립트 언어는 더욱 힘을 얻어 2007년 초 컴퓨터잡지 microsoft에 중심주제로 다루어지기도 했다.

속도
는 컴파일하는 언어들보다 느리다. 인터프리터로 해석하는데 다른 언어들보다 script언어가 조금 더 느린 듯 보인다. 하지만 웹이라면 말이 달라진다. 요청이 있을 때마다 컴파일하기엔 시간이 너무 걸린다. 한번 컴파일해서 올려두기엔 부담이 너무 크다. 웹에선 인터프리터를 사용하는 것이 좋고 스크립트언어가 느리다고는 해도 통신회선을 통해 요청되는 시간과 비교하는 극히 짧은 시간을 사용하므로 크게 무리가 없다.

문자처리는 할 때마다 놀란다. 장점이자 단점이기도 하지만 script language는 변수의 선언이 필요없고 변수형의 구분이 없다. 알아서 적당히 맞추어 사용해버린다. 심지어 변수의 이름을 프로그래밍 도중에 만들어나갈 수도 있다.(이런건 나중에 천천히..) 게다가 문자열 처리와 array에 필요한 연산 대부분은 이미 만들어져 있다. 그냥 쓰면 된다.

에 있어선 엄청난 힘을 가지고 있다. 웹을 통해 널리 알려진 언어이기도 하지만 루비를 gem과 함께 사용하면 뽀빠이가 시금치를 먹는 효과를 낼 수 있다. 혹자는 3분이면 웹페이지 충분히 만든다면서 동영상을 만들어 친절히 영어로 설명하면서 천천히 만들었는데도 시간이 남았다.(난 할줄 모른다.ㅡㅡ;)

Python을 이용해서 잠깐 일을 했었고, ruby를 이용해서 프로젝트를 진행하긴 했지만 웹과 연동하는 것은 해본 적도 없고 언어 자체에 대해서도 잘 모른다.
블로그에 글을 하나씩 올리면서 나도 같이 공부해야겠다.
728x90

'Programming > ruby의 편리함' 카테고리의 다른 글

eclipse에서 ruby하기(RDT-Ruby Development Tool설치)  (0) 2008.03.01
Ruby 설치하기  (0) 2008.03.01
728x90
객체, 정보은닉, 캡슐화, 상속, 다형성

객체에 대해선 앞에서 미리 말했다. 정보은닉, 캡슐화, 상속, 다형성... 이 개념들을 결국 같은 말을 하고 있다.
프로그램도 클레스를 만드는 사람과 그것을 객체로 사용하는 사람이 나누어져 있다는 개념으로 이해하면 되겠다.
(여담이지만 요즘은 클레스를 만들어서 파는 회사도 많이 있다. 특히 자바같은 경우가 흔히 그렇다. 그래서 개발자들은 그런 것들을 가져와서 잘 붙이기만 하면 레고블록 조립하듯이 프로그래밍을 할 수 있다.)

그렇다면 클레스는 작성하는 사람은 클레스 내부가 어떻게 구현되어 있는지 보여줄 필요가 없다. 어떻게 사용하는지 설명만 해주면 그만이다. (사실 소스 보여주는거 창피할 것 같다.) 이것이 정보은닉의 핵심이다.

캡슐화는 말 그대로 캡슐처럼 만드는거다. 알약에 보면 조그만 알갱이들이 잔뜩 들어있다. 그게 뭔지 몇개가 들어있는지 관심없다. 그냥 "콘텍600주세요."그러고 만다. 클레스의 이름만 가지고 그 클레스를 믿을 수 있도록 이것저것 다 집어넣고 내부는 관심가지지 못하도록 하라는 말이다. 결국 정보은닉과 같은 말이다.

상속..무진장 중요하다. 하지만 개념은 간단하다. A라는 클레스를 B에서 상속한다면 A를 그대로 가져와서 살을 더 붙여서 사용하겠다는 말이다. 다만 프로그래밍할 때 약간의 신기한 문법적 기술들이 들어간다. 정말 개념적으론 이게 전부다. 그대로 가져와서 살을 더 붙인다.

다형성..내가 객체지향 언어를 좋아하는 것은 다형성의 힘이 크다. 객체로 구분한다는 것 다음으로 다형성이 강력한 힘을 가지기 때문에 OOP가 너무 좋다. 다형성이란 overloading, overwriting과 같은 기능을 말하기도 하고 template과 같은 기능도 다형성이라고 볼 수 있겠다.
overloading : 똑같은 이름을 사용하는 method를 가지고 argument(인자)를 다르게 해서 다른 내용으로 사용한다는 개념이다. 하지만 메쏘드의 구현을 다르게한다고 생각하지 말고.. 인자가 값에 맞추어 해당 메쏘드가 알아서 작동한다고 생각하는것이 편하다. 객체가 기능을 수행하는데 argument(인자)를 어떻게 줘도 거기에 맞추서 잘 작동하도록 만들어준다는 뜻이다.
overwriting : 이건 상속과 이어지는 개념이다. 부모가 가지고 있는 것과 이름, argument까지 같은 method를 만들수 있다는 말이다. 이때 객체가 사용하는 method는 당연히 자식class의 method다.

이로써 OOP의 기본 개념들에 대해서는 다 이야기했다. 지금부터는 얼마나 많이 만들어보느냐에 달렸다.
앞으로 예제를 중심으로 하나씩 공부해보자..
728x90

'Programming > C++은객체지향언어다' 카테고리의 다른 글

error C2220: warning treated as error - no object file generated  (0) 2011.07.29
g++ for windows  (0) 2008.11.07
집합(차집합, 교집합, 합집합) - cpp  (0) 2008.04.02
ADT array 구현  (0) 2008.03.04
C++ (객체)  (0) 2008.02.26
C++ (OOP개념)  (0) 2008.02.26
C++ (개요)  (0) 2008.02.26
728x90
객체, 정보은닉, 캡슐화, 상속, 다형성


객체에 대해 생각해보자. OOP에서 객체는 '유형, 무형에 있어 인간이 인지하는 모든 것으로 속성과 행동으로 표현할 수 있다'라고 어려운 말로 표현되어 있다. 그리고 클레스는 빵틀로 비유되며 똑같은 모양의 붕어빵을 만들어내는 틀이라는 아는 사람만 아는 표현을 해놨다. 뭐 개념을 먼저 이해하고 보면 적절한 표현인데 처음 접하는 사람은 무슨 소린지 영 안드로메다다. 내 방식대로 말하자면 저런 표현은 오히려 머리만 아프게 한다.
그렇다면 내가 말하는 객체와 클레스는 무엇이냐?

구조적프로그래밍(C언어등)을 할때는 프로그램에서 필요한 기능이 무엇인지 생각하고 나누어 함수를 잘 만들어내는 것에 초점을 뒀다. 프로그램이 어떠한 순서에 무슨 일을 하느냐가 중심이 되었다.
OOP에서는 누구에게 일을 시킬까 하는 것이 중심이다. 뜬금없다고 생각하겠지만 객체란 자기가 자료랑 기능들을 가지고 있으면서 시키는 일을 충실히 하는 심부름꾼이다. 물론 다른 객체로부터 필요한 정보를 주고받을 수(message passing)도 있다.
프로그램을 하나의 회사로 생각해보자. 그럼 생산, 인사, 회계등 여러 부서가 있고 책임자들이 다 있다. 사장은 자기가 직접 그 일들을 하는 것도 아니고 관련 자료들을 직접 관리하지도 않는다. 책임자들을 잘 부리기만 하면 된다. 책임자들을 그 밑에 있는 직원들을 잘 부리면 된다. 실제적으로 일을 어떤 식으로 하건 결과가 잘 나오면 책임을 묻지 않는다. 이런 방식이 바로 OOP의 개념이다.

말이 길어졌는데 객체의 개념을 한마디로 정의하자면 '심부름꾼' 혹은 '부하직원'정도 되겠다. 일을 시키면 자료를 찾고, 일을 한다. 그리고 그에 대한 책임도 자기가 진다.

그렇다면 클레스(class)란 무엇인가? 객체지향 언어를 클래스의 모음(set of classes)라고도 한다. OOP는 클레스를 잘 설계하는 과정이라고 볼 수 있다. 클레스와 객체의 개념을 많이 헷갈려 하지만 그건 모두 책에서 어렵게 설명하기 때문이지 개념 자체는 무지 쉽다. 앞에서 말한 회사를 다시 가져오면 객체는 회사에서 일을 하는 사람이라고 했다.

하지만 우리는 프로그래머기 때문에 그들을 고용하는게 아니라 만들어낸다. 인간 대신 로봇으로 대체할 필요가 있다. 객체가 일을 하는 각기 다른 로봇들이라면 class는 로봇을 만드는 회로도가 되겠다. 회로도에 따라서 로봇은 다른 생각을 하고 다른 행동을 한다. 그리고 같은 회로도로 똑같은 로봇을 몇개라도 만들어낼 수 있다.

====================================================================
#include <iostream>
using namespace std;

class Hello
{
private:
 int value;
public:
 Hello()     {value = 0;}   //생성자
 Hello(int n)  { value = n;} //둘다 하나의 class에 대한 생성자지만 다른 역할을 한다.
 void printHello();
 void printvalue();
 void addValue(int n) { value = value + n; }
 void subValue(int n)
 {
  value -= n;
 } //inner class method라고 해서 짧은 메쏘드 구현일 경우 클래스 내부에 직접 적어줘도 된다(장단점 있다)
};


void Hello::printvalue()
{
 cout << "value :" << value << endl;
}

void Hello::printHello()
{
 cout << "\nHello~" << endl; //\n과 endl은 비슷 endl은 end line을 의미
}

int main()
{
 int n;
 cout << "수 입력: ";
 cin >> n;

 Hello ho1;
 Hello ho2(n);

 cout << "ho1 value : ";
 ho1.printvalue();
 cout << "ho1 value : ";
 ho2.printvalue();

 ho1.addValue(50);
 ho2.subValue(10);

 cout << "ho1 value : ";
 ho1.printvalue();
 cout << "ho1 value : ";
 ho2.printvalue();
 
 return 0;
}
=================================================================

728x90

'Programming > C++은객체지향언어다' 카테고리의 다른 글

error C2220: warning treated as error - no object file generated  (0) 2011.07.29
g++ for windows  (0) 2008.11.07
집합(차집합, 교집합, 합집합) - cpp  (0) 2008.04.02
ADT array 구현  (0) 2008.03.04
C++ (OOP개념들)  (0) 2008.02.26
C++ (OOP개념)  (0) 2008.02.26
C++ (개요)  (0) 2008.02.26
728x90

OOP라 하면 객체지향프로그래밍의 개념을 말하는 거다.
새로운 개념을 익히기 위해서는 용어를 많이 알아두는 것이 유리하다. 난 이름같은거 정말 못외워서 개념을 잡으면 되지 무슨 용어가 그리 중요하냐고 자주 생각했었다. 하지만 개념을 제대로 잡으려면 용어를 제대로 알고 있는게 가장 빠르다.
이 글을 관심있게 보는 사람이라면 C언어가 무엇인지 대강 알고 있을 것이다.

객체지향 언어를 배우는데 있어서 구조적 프로그래밍의 습관은 오히려 방해가 된다. 전혀 새로운 세계에 푹 빠져든다고 생각해라. 얼마 되지도 않는 얕은 지식을 가지고 있으면서 그 지식을 활용하려고 들지 말고 그냥 새로운 세계에 들어왔으니 그냥 보고 그대로 받아들여라. 해석하지 마라. (정말 중요하니까 항상 염두해 두도록!)

C언어나 어셈블리어같은 녀석들을 구조적 프로그래밍이라 한다. 프로그램을 순서에 따라 진행시켜 나가면서 한가지 기능별로 함수를 만드는 것이 이 프로그래밍의 목표다. 하나의 함수는 하나의 기능을 가지는 것이 일반적인 방법이다. 필요에 따라 만들어진 함수를 재사용하여 효율을 높인다.

객체지향 언어는 말 그대로 객체를 다루는 언어다. 목표는 클레스를 잘 설계하는 것이다. 객체와 클레스에 대해선 뒤에 말하겠다.
OOP(객체지향프로그래밍)에서 중요한 개념은 객체, 정보은닉, 캡슐화, 상속, 다형성(over loading, over writing, template)등이 있겠다. (너무 길면 보기 귀찮으니까 짧게 잘라서 나가자.)

728x90

'Programming > C++은객체지향언어다' 카테고리의 다른 글

error C2220: warning treated as error - no object file generated  (0) 2011.07.29
g++ for windows  (0) 2008.11.07
집합(차집합, 교집합, 합집합) - cpp  (0) 2008.04.02
ADT array 구현  (0) 2008.03.04
C++ (OOP개념들)  (0) 2008.02.26
C++ (객체)  (0) 2008.02.26
C++ (개요)  (0) 2008.02.26

+ Recent posts