'c++'에 해당되는 글 7건

  1. 2008.04.07 :: 이름이 뭐길래 - 프로그래밍 습관(programming naming)
  2. 2008.04.02 :: 집합(차집합, 교집합, 합집합) - cpp
  3. 2008.03.04 :: ADT array 구현
  4. 2008.02.26 :: C++ (OOP개념들)
  5. 2008.02.26 :: C++ (객체)
  6. 2008.02.26 :: C++ (OOP개념)
  7. 2008.02.26 :: C++ (개요)

예전에 선배가 시집을 선물해준 적이 있었다. 'love adagio'란 책으로 시인의 이름이 '박상순'이었는데 한동안 그분이 여성작가인줄 알았다. 이름으로 인한 오해는 확실히 알아보기 전에는 계속 작용하기 때문에 그만큼 위험하다. 이름을 잘 붙이는 것은 코딩할 때 상당히 까다롭고 중요한 일이다. 내가 이 카테고리를 만들고 책을 사서 정리하는 이유가 사실은 작명 때문이다.

이름은 다음 3가지를 나타낸다.
identity(신원) : 무엇인지 나타내는 기본적인 것으로 주로 변수(혹은 속성)
begavior(행동) : 무엇을 하는 것인지 나타내는 것으로 주로 함수(혹은 메쏘드)
recognition(인지) : 추상적인 것을 표현함(사상, 우주등 실체를 확인하기 힘든 것들)
이름만 잘 지어도 특별한 주석이나 추가 설명문 없이도 이해하기 쉬운 코드가 된다.

잘못 지어진 이름은 자칫 커다란 위험이 될 수도 있다. 책에는 이런 예를 들었다
void checkForContinue(bool weShouldContinue)
{
      if (weShouldContinue) abort();
}

argument로 넘어오는 weShouldContinue은 이름만 봐도 계속 진행할 필요가 있으면 true, 정지해야 하면 false가 들어오는 것을 예상할 수 있다. 그런데 if문에서 만약 true면 중단하라고 하고있다. 정말이지 어이가 희박한 상황이다.
그렇다면 잘못 지어진 이름 말고 대강 아무런 생각 없이 지어진 이름은 어떨까?

void fun(bool a)
{
     if( a ) b();
}
난 이 함수가 의도하는 것을 도무지 이해할 수가 없다. 처음 언어를 배우는 사람들이 실습용 코드를 작성할 때 변수명을 x,y,z,a,b,c.. 이런 식으로 이어가는 경우가 있다. 이렇게 이름을 짓는다면 무슨 기능을 하는지 하나하나 다 설명해줘야 한다. 설명이야 귀찮지만 하면 된다. 그러나 작성하는 프로그래머조자 코드를 작성하는 도중에 헷갈린다. (인간인 주제에 헷갈리지 않을 것이라고 장담하지 마라.)

* 이름을 붙이는 대상
 - 변수(속성, attribute)
 - 함수(메쏘드, method)
 - 타입: class, enum, struct, typedef
 - C++의 namespace, JAVA의 package
 - 매크로
 - source file(파일명)

기본원칙

묘사적인 이름 :
무엇을 나타내는지 정확해야 한다.

적법한 이름 :
이름도중 공백불가, 대소문자구분 허용, 특수문자불가, (언어에 따라 길이와 사용하는 문자셋(unicode,ascii등)의 차이가 있을 수 있다), 예약서 사용불가. C언어에서는 코드 중간에 선언불가, C/C++에서는 global식별자는 str로 시작하고 다음에 소문자나 밑줄불가하며, std namespace에 속하는 이름도 사용불가.

관용구 사용 :
많은 사람들의 코드를 보고 일반적으로 사용하는 이름이 무엇인지 알면 그걸 지어라. 많이 사용하는 이름 일수록 더 알아보기 쉽다.

정확한 이름 : 사전에 없는 단어를 사용하지 마라. 영어 사용에 약한 한국과 일본에서 간혹 영어대신 자국어를 발음나는대로 적어서 사용하는 경우가 있다. 주문을 나타내는 order대신 jumoon이나 joomoon, jumun(주문)이라고 적어버리는 경우가 있다는 말이다.(허접한 인터넷 사이트에서 간혹 보인다.) 심지어 위의 보기에서 jumoon과 joomoon을 같이 사용하면 다른 기능을 표현하는 경우도 있다.(미친 짓이다.) 사전에 없는 단어를 새롭게 만들어내면 나중에 본인도 무엇을 나타내는지 알아보지 못하는 수가 있다. 뭔지 몰라서 사전을 찾아도 소용 없다.

적절한 길이 : 프로그래머는 단어를 짧게 줄이고 싶어하는 충동을 가지고 있다. 하지만 그렇다고해서 함부로 줄이면 큰일난다. 가능하면 모든 이름에 있어 사전을 따라는 것이 좋다.
단, 줄일 때는 몇가지 규칙이 있다.
 - 반복문의 카운터 : 보통 i,j등으로 사용한다. 이것도 짧은 반복문일 경우에 적당하다.
 - 짧은 범위 : 짧은 범위에서는 지나치게 긴 이름대신 짧은 이름을 사용하고 주석을 달아주면 더 이해하기 쉬울수도 있다.

처음부터 잘 지어라 : 나중에 고치지 뭐..같은 건 없다. 임시로 급하게 작성하는 코드라 해도 생각보다 오래가는 경우가 많다. 나중에 창피당하지 말고 첨부터 잘해라.

-다음번엔 대상별로 이름 붙이는 방법을 알아보도록 하자...

posted by bluelimn

신중히 생각해서 나누지 않고 바로 코딩에 들어갔더니 역시 구성이 마음에 들지 않는다. 쩝..
사소한 것을 코딩하더라도 천천히 생각해보고 하도록 하자!!

static을 사용해서 집합연산을 만들어봤는데 static에 관한 문법이 다른 언어들과 달라서 멈칫했었다.

element.h



mySet.h


mySet.cpp



insertSortWithSets.cpp

'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++ (OOP개념)  (0) 2008.02.26
C++ (개요)  (0) 2008.02.26
posted by bluelimn
  • Design and implement (in C++) an ADT Array that can dynamically grow and shrink as integers are data is inserted and removed. // ADT array 을 하나 맏르어줘서 엄청나게 커질수도 작아질수도 있게 만들어 주는거네요 . Access time to any item in an array (via it's index) should be constant. The cost of an insert into the middle of an array may be O(n). Indexes need not start at zero and may be negative.
  1. The ADT should include the following:
    1. -A default constructor that creates an empty array starting at index 0.
    2. -A constructor taking an intdata [] array that builds an array populated with the items in the array starting at index 0.
    3. -A constructor taking a range int low, int high that builds an empty array ranging from the low index to the high. (Pre: high >= low.)
    4. -A copy constructor array( const array& that ) .
    5. -A destructor. 
    6. -An accessor int size( ) that returns the size of (number of entries in) the array. 
    7. -An accessor int find( intdata n ) that returns the index of element n in the array.
    8. -An accessor int at( intdata n ) that returns the integer at the given index n. 
    9. -A mutator void insert( intdata n ) that inserts the element n at the end of the array.
    10. -A mutator void insert( intdata n, index i ) that inserts the element n into the array at index position i. 
    11. -Amutator void erase( int index ) that removes the element at the given index position in the array. 
    12. -A mutator void clear( ) that empties the array.
    13. Overload the [] operator
    14. Overload the assignment operator =
    15. Overload the operator == to test array equality.
    16. Overload the operator != to test array inequality.

ADT란게 자료의 type에 무관하게 사용하겠다는 겁니다. 뎃글에 자료형을 물어보신 글이 있던데 특정한 자료가 정해진 것아닙니다. C++ 문법에 template이 있는데 이 부분은 표준이 제대로 안되어 있어서 컴파일러마다 조금씩 다르기도 합니다.

배열의 크기가 동적으로 커졌다고 줄었다가 한다고 되어 있습니다. 배열로 지정하고 크기에 따라 deep copy를 통해 크기가 다른 배열로 바꿀 수도 있습니다만 문제에서 O(n)이 예상된다고 하니 링크드리스트를 원하는 것으로 보입니다.


한시간 넘게 붙잡고 있었는데 엉망이다. 귀찮아서 다 inline으로 해버렸고
A constructor taking a range int low, int high that builds an empty array ranging from the low index to the high. (Pre: high >= low.)
이부분... 생성자에서 low와 high값을 argument로 던져주고 배열사이즈를 계산해서 생성하란 것 같은데 무슨 뜻인지, 왜 필요한지 몰라서 제대로 못했다.
그리고 test결과 =연산자가 제대로 작동하지 않는다. 제대로 연산은 되는데 const &로 parameter를 맞추니까 오류나고 그냥 해버리니까 연산이 끝난 후 R-value의 링크가 사라진다. 뭐냐고..

아무튼 문제에 보면 Indexes need not start at zero and may be negative. 이렇게 되어 있는데 그러면 생성할 때 배열의 low와 high를 정하는 것이 아니라 method중에 begin을 결정하는 method가 있으면 되는거 아닌가? 문제를 만든 사람은 뭘 생각한 거지? 내 영어실력이 문젠가?
아무튼 제대로 이해한 사람 있으면 좀 알려주..

'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++ (OOP개념)  (0) 2008.02.26
C++ (개요)  (0) 2008.02.26
posted by bluelimn
객체, 정보은닉, 캡슐화, 상속, 다형성

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

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

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

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

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

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

'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++ (OOP개념)  (0) 2008.02.26
C++ (개요)  (0) 2008.02.26
posted by bluelimn
객체, 정보은닉, 캡슐화, 상속, 다형성


객체에 대해 생각해보자. 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;
}
=================================================================

'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++ (OOP개념)  (0) 2008.02.26
C++ (개요)  (0) 2008.02.26
posted by bluelimn

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

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

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

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

'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++ (OOP개념)  (0) 2008.02.26
C++ (개요)  (0) 2008.02.26
posted by bluelimn
이곳에 올리는 글들은 두서없고 대책없는 bluelimn style의 C++ study다. C언어는 학교에서 mentor로 2학기간 후배들을 가르쳤으니 깊이는 없어도 어느정도 가르치는 체계가 잡혀 있다고 할 수 있지만 객체지향에 관해서는 나도 아직 남들을 가르치는 수준은 커녕 내가 제대로 사용하는 수준에도 미치지 못했다. 그리하여 나도 공부해볼 겸 해서 이곳에 글을 올리면서 하나씩 정리해 나가볼까 한다.
이곳에서 도움을 얻고자 하는 사람들은 두서없고 대책없다하여 불만을 가지지 말고 제대로 된 공부를 하려면 다른 곳으로 가길 바란다.
목표는 안드로메다에 출장 가버린 개념을 복귀시키는 작업이다.
대상은 프로그래밍에 대해서 기초는 알고 있는 사람이다. (if, for, while과 함수가 무엇인지 정도는 아는 사람이다.)
그럼 객체지향 언어에 대한 개념을 중심으로 도구는 C++을 사용해서 시작해보자. 언어는 C++, JAVA, C#등 객체지향 언어면 어떠한 것이든 상관없다. 단, visual basic은 구조적 언어와 객체지향 언어의 중간정도 되므로 조금 곤란하다. 사실 C++도 완전객체지향 언어라고 할 수는 없으나 아직까지는 회사측에서 직원을 채용할 때 C/C++을 익숙하게 사용하는 사람을 요구한다. 웹개발 쪽에서는 JAVA를 더 선호하고 있다.(application 개발 분야에서는 C#이 꾸준히 따라가기 때문에 향후 어떤 언어가 많이 잡아먹을 지 모른다. C#은 JAVA에 대응해 MS에서 강력히 밀고 있지만 MS계열 OS에서만 작동하므로 어떻게 될지 두고볼 일이다.)
그럼 필요없는 말은 이만 줄인다. 시 ~ 작!!

'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++ (OOP개념)  (0) 2008.02.26
C++ (개요)  (0) 2008.02.26
posted by bluelimn