삼항연산자(? :)와 같은경우 일부 초급 프로그래머들은 익숙치 않을 수 있습니다.
혹은 알긴알고있으나 사용법을 모른다. 고 축약할 수 있습니다.

왜냐! 하면 많이 쓰지 않기때문이라기보단 그 프로그래머가 사용을 자주 하지 않아서 그런것입니다.
물론 저도 잘 모르니까 여기에 글을 써서 복습의 의미를 다지는것이지만..

삼항연산자는
? : 로 구성됩니다.
(조건1) ? (식1) : (식2) ;
와 같이 사용될때도 있습니다.

조건 1이 true이면 식1이 실행됩니다.
조건 1이 false라면 식2이 실행됩니다.

간단한 예를 하나 보여드리겠습니다.

int x = (1>2) ? 1 : 2 ;
이 선언문은 x에 대입을 하는 문장입니다.

(1>2)이 식은 false입니다. 고로 2가 x에 들어가게됩니다.

같은일을 하는 코드를 만들어보면

int x;
if(1>2) x=1;
else x=2;

고로 삼항연산자는 위와같은 코드의 축약형이라 단정지을 수 있습니다.
위와같은 코드를 if문으로 쓴다면 가독성을 오히려 해칠수 있습니다.
고로 삼항연산자를 사용해 준다면 도움이 될 수 있죠 ^^.


'개발' 카테고리의 다른 글

뇌 크기 측정하기 App.  (2) 2011.03.31
이놈(enum)! 넌 무얼하는 놈이냐!  (0) 2010.10.10
goto! 좋은놈? 나쁜놈? 이상한놈?  (0) 2010.10.10
포인터(pointer).. 이 건방진놈을 파헤쳐보자!  (0) 2010.10.10
typedef 는?  (0) 2010.10.10

흠.. 요즘들어 goto문이 좋다. 라는 말이 많이 나오는 것 같습니다.

실제로 저도 나쁘다. 라고 생각하고 있진않습니다.

어느부분에서는 goto문을 활용하면 정말 편하게 문제를 해결할 때도 있죠. (경험이 많진 않지만)

goto문을 무작정 쓰지 마!! 라고 한다고 해서 안쓸리가 없죠. 

썻을 때 쉽게 해결되고 프로그램의 가독성이 높아진다고 하시면 할말이 없습니다.

하지만 goto문을 쓰는것은 프로그램이 스파게티 코드 혹은 실뭉치코드 가 되버릴 수 있죠.
(하지만 문제는.. 제 경험상으로 프로그래밍 공부를 한지 몇개월쯤 되신분들이 조금 문제를 풀기 힘들어지면 goto문을 쓰려고 하더군요.. 자제하십쇼...  저도 물론.. 그때 썻읍니다.ㅋ;)

뭐.. 저도 goto문을 그렇게 싫어하진 않습니다. 사용을 최대한 자제할 뿐이죠.

별로 쓸 말도 없어서 반복문을 goto문으로 수정하여 코드를 작성해보겠습니다.

#include <iostream>
using namespace std;

int main ()
{
    int result=0;
    int cnt=100;

LOOF:  if(cnt<=200) {
if(cnd%2==0)    result++;
cnt++;
    goto LOOF;
  }
    //for(int cnt=100; cnt<=200; cnt++)
    //    if(cnt%2==0) result++;

    cout << "100부터 200까지 두 단위씩 세어보는 프로그램이다." << endl
        << "총 카운트 수는 " << result <<"이다." << endl;

    return 0;
}

어때요 참 쉽죠?

쓰면 안됀다고해서 모르면 안됍니다.
그러니 꼭 기억해두시기 바랍니다 ㅎㅎ.

'개발' 카테고리의 다른 글

이놈(enum)! 넌 무얼하는 놈이냐!  (0) 2010.10.10
?: 삼항연산자... 뭐였더라?  (0) 2010.10.10
포인터(pointer).. 이 건방진놈을 파헤쳐보자!  (0) 2010.10.10
typedef 는?  (0) 2010.10.10
중첩함수가 뭘까요~?  (0) 2010.10.10
일단 포인터에 대한 의견은 분분합니다. 어떤사람은 포인터는 의미없는 놈이다. 어떤사람은 포인터덕분에 프로그래밍이 날로 발전한다. 꼭 필요하다. 라는 분도 계십니다.

뭐 쨋던 확실한건 포인터로인해 C언어에서 하드웨어를 직접 관리할 수 있고, 메모리를 조금 더 세세히 관리, 활용 할 수있다는 점입니다. (당연히 그에 받쳐주는 코딩실력과 지식이 있을때..)

일단 포인터는 선언방법이 간단합니다.
int형을 넣고싶다면
int * point; 라고 선언하면 됩니다. 간단합니다.
변수선언과는 다르게 *(포인터연산자 [곱하기가아닙니다.] 혹은 에스크립터 연산자라고도 합니다.) 를 넣어주시면됩니다.
int* point;
int * point;
int *point; 이 셋은 모두 같은 선언입니다.

포인터는 어떠한 형을 넣던지 4byte임을 기억해두시기 바랍니다. (연산체계에 따라 다를 수 있습니다.)

왜나하면 메모리의 주소가 4byte이기때문입니다. (마찬가지로 연산체계에 따라 다릅니다.)

포인터는 크게보면 스택과 힙으로 나뉘어있습니다.
자세히보면 전역 공간, 자유 기억 공간(Heap 힙), 레지스터, 코드 영역, 스택 이죠.
(레지스터는 잡다한일을 합니다. 스택의 꼭대기와 명령 포인터를 계속 추적하는 등)

지역변수, 함수의 매개변수는 스택에 저장되고, 코드는 코드영역에, 전역변수는 전역공간에 저장되지요. 그리고 나머지는 자유 기억 공간(free store)로 분류됩니다. 이는 힙이라고 부르기도 합니다.

지역변수는 영원히 지속되지 않는다는 문제점이 있고, 함수가 반환되면 지역 변수들은 버려집니다. 또한 전역 변수들은 그 문제를 해결했지만 프로그램의 모든 부분에서 제한없이 접근할 수 있다는 대가를 치러야 합니다. (이는 이해하기 어렵고 유지보수를 어렵게 합니다.)

스택의 내용은 함수가 반환되면 자동적으로 지워집니다. 자유 기억 공간은 프로그램을 끝낼 때 까지 지워지지 않습니다. 메모리 사용을 끝냈을 때 그 공간을 유지하느냐 버리느냐를 결정해야하죠.

포인터는 정말 처음할때는 햇갈립니다...; 여러번보고, 읽고 쓰기밖에 답이 없습니다.
또한 포인터는 정말 조심히 다뤄야합니다. 자칫 잘못하다가는 운영체제가 뻑날수도있죠..
(물론 낮은 확률이지만..)
포인터는 조심히 다뤄야 하고 필수로 잘 다뤄야 한다고 할 만큼 중요합니다.
매우 좋은 것이라고 저는 생각합니다.

^^;;..


포인터가 싫으시다면 자바쪽을 공부하십쇼.
물론 포인터가 없지 않습니다.
내부 포인터(접근자)라고 존재합니다만, 외부 포인터가 없으므로 크게 신경쓰실것 없으실겁니다 ^^.

'개발' 카테고리의 다른 글

?: 삼항연산자... 뭐였더라?  (0) 2010.10.10
goto! 좋은놈? 나쁜놈? 이상한놈?  (0) 2010.10.10
typedef 는?  (0) 2010.10.10
중첩함수가 뭘까요~?  (0) 2010.10.10
클래스(Class) 란?  (0) 2010.10.10
Typedef 는 Type Definition의 약자입니다.

흠..

자료형중 short나 long는 뒤의 int를 생략한 축약어입니다.
short 나 long를 unsigned로 선언한다면.

unsigned short int가 되죠. 하지만 이걸 계속 써야한다면?
귀찮겟죠. 물론 그럴일은 별로 없겠지만 unsigned만 하더라도 귀찮아하는사람이 있죠.

그렇다면 해결책은
typedef unsigned short int USHORT 나 typedef unsighed long int USHNG 와 같이 할수있죠.

unsigned short int A;

USHORT A;
를 해도 같은 선언이 되죠.

물론 다른 용도도 있습니다.

Class, enum등에서도 이용할 수 있죠 ^^.
간단한 예제를 보여드리겠습니다.

enum alpha {a,b,c};
//typedef enum {a,b,c} alpha;
typedef class {
public:
 char member;
} test;
/*
class test {
public:
 char member;
};
*/
중첩함수란.
같은 이름의 함수이지만, 반환형과 매개변수가 다른걸 말합니다.

예를들어 전달된 인자의 배를 출력하는 함수라고 해봅시다.
만약 실수를 입력했는데 나의 함수는 정수형만을 계산할 수 있다면..
원치 않는 값이 나올 수 있습니다.
Double라는 입력된 인자의 배를 반환하는 함수가 있습니다.
만약 정수, 실수 둘다 계산하기위해 중첩함수를 사용하지 않고 코딩을 한다면..

if(사용자가 입력한 수가 정수)
result = 정수용Double(사용자 정의 수);
else
result = 실수용Double(사용자 정의 수);
가 될테지요.
하지만 중첩함수를 사용한다면..

int Double (int);
double Double (double);

Double(사용자 정의 수);    //자동으로 실수와 정수를 판별해주는것이 아니라 매개변수의 자료형을
이렇게 하면 되겠지요.    //보고 판단하는 것입니다. int형이라면 1번째 Double을 사용하죠.
일단 클래스는 멤버 변수 혹은 자료 멤버라고 하는것과 멤버함수 혹은 메소드 (클래스 안의 함수)로 이루어져있다.

그리고 클래스를 실체화 혹은 객채화 한 것을 인스턴스(instance)라 칭한다.

클래스에는 전용(private)와 범용(public)라는 또 다른 예약어가 사용된다.

대부분 클래스는 hpp 또는 h, hp (헤더파일)에 본체를 정의하고,
cpp또는 c에 메소드를 정의한다.

모든 클래스의 멤버(자료, 메소드)는 기본적으로 private이다.
private멤버는 그 클래스 안의 메소드들에 의해서만 접근될 수 있다.

생성자 및 소멸자는 반환값을 갖지 않는다. void조차 갖지 않는다.

생성자는 매개변수를 받을 수 있다.
ex) Cat A (인자1, 인자2 ..);

만약 메소드가 자료 멤버나 멤버 변수를 건들지 않는다면 상수화(const)를 사용하자.
사용하는 방법은 반환형 클래스::함수명 (매개변수) const ;이다.

메소드도 inline이 될 수 있다.
사용법은 inline 반환형 클래스::함수명 (매개변수); 이다.
또한 클래스 본체 정의때
반환형 함수명 (매개변수) {메소드 본체} 세미콜론 생략.
으로 만들면 자동으로 inline형으로 만든다.

'개발' 카테고리의 다른 글

typedef 는?  (0) 2010.10.10
중첩함수가 뭘까요~?  (0) 2010.10.10
자유기억공간(스택, 힙)을 활용해 봅시다!  (0) 2010.10.10
Const 포인터! 상수포인터의 용도는?  (0) 2010.10.10
참조자가 뭐지?  (0) 2010.10.10
이것은 포인터의 심화(?)라고 할 수 잇습니다. 고로 포인터를 이해해야 이것을 수월하게 이해할 수 있다는 소립니다. ^^

일단 C에서는 malloc()이라는 함수가 있죠. 이 함수를 통해 자유기억공간을 할당받을 수 있었습니다.
하지만 C++에서는 new라는 예약어로 자유기억공간을 할당 받을 수 있습니다.
new 자료형 을 하면 자유기억공간에 자료형의 byte를 할당후 주소값을 반환합니다.

unsigned short int *point;
point = new unsigned short int;     //이런식으로 사용하시면 되죠.

그 메모리를 갖고 작업을 다 하셨다면 그 포인터는 delete를 사용하여 반환해야 합니다.
만약 이 포인터가 선언된 함수가 끝났다면 포인터는 사라질것입니다. 그렇다면 당신이 자유기억공간에 할당한 메모리를 참조할 방법을 잃는거죠. 그렇게되면 그 메모리는 프로그램이 끝날때 까지 아무것도 못하고 굳어있게될것입니다. 이것을 가리켜 "메모리 누출(memory leak)"라고 칭합니다. delete의 사용법은

delete point;
물론 이 포인터를 선언한 함수 내에 (포인터가 사라지기 전에) 해야합니다.

여기서 주의할점은 다시 delete를 해버린다면 프로그램이 깨지게 됩니다.
그것을 방지하기 위해 한 줄을 추가합니다.
delete point;   //delete로 메모리를 반환합니다.
point = 0;      //프로그램이 깨지는 것을 방지하기위해 0(NULL)로 초기화해줍니다.

포인터를 NULL로 초기화했다면 delete를 수행해도 아무 이상이 없습니다. ^^
//만약 당신이 포인터 변수 1개로 2개의 메모리공간을 활용한다고 시도했다면 욕심쟁이~!
//될리가 없다는소리입니다.;; 저 상황도 같이 메모리 누수가 발생됩니다.

당신은 이제 객체(Class)를 자유기억공간에 할당 할 수 있습니다. 선언법도 위의 일반 변수와 다른점은 거의 없습니다.

Class *cPoint;
cPoint = new Class;
이제 사용법이 문제입니다 일단이론적으로 말해봅시다. 포인터의 메모리에 접근한 후 객체의 자료멤버 혹은 메소드를 호출하면 될것입니다. 말그대로 해본다면
(*cPoint).member;       //괄호 연산자의 사용 이유는 포인터의 메모리에 먼저 접근이 필요하기 때문입니다.
하지만 C++은 이것을 축약형으로 만들었습니다.바로 -> 연산자입니다.
cPoint->member; // 이것은 위의 (*cPoint).member; 와 같은 역할의 문장입니다.

'개발' 카테고리의 다른 글

typedef 는?  (0) 2010.10.10
중첩함수가 뭘까요~?  (0) 2010.10.10
클래스(Class) 란?  (0) 2010.10.10
Const 포인터! 상수포인터의 용도는?  (0) 2010.10.10
참조자가 뭐지?  (0) 2010.10.10

예약어 const를 포인터에 쓸수 있습니다.
const int * point;  //상수형 정수에 대한 포인터입니다. 포인트 된 값은 변할 수 없습니다.
int * const point; //정수형에 대한 상수형 포인터 입니다. 포인트된 정수 값은 바뀔 수 있지만, 다른 주소를 가리킬 수 는 없습니다.
const int * const point;  //상수형 정수를 가리키는 상수형 포인터입니다. 가리키게 되는 값은 바뀔 수 없고 포인터도 다른 주소를 바꾸어 가리킬 수 없습니다.

이를 쉽게 보자면. const가 붙은 바로 오른쪽의 것을 상수화. 시킨다고 보시면 편할듯 합니다.
const int* point; 는 상수형 정수를 담는 포인터인것이구요.
int* const point;는 정수를 담는 상수형 포인터 인것이 되지요.

예제를 통해 사용법을 알아보자.

//상수 메소드를 가진 객체를 포인터로!
#include <iostream>
using namespace std;

class Rectangle
{
public:
 Rectangle ();
 ~Rectangle ();
 void SetLength (int length) {itsLength = length;}
 int GetLength () const {return itsLength;}
 void SetWidth (int width ) {itsWidth = width;}
 int GetWidth () const {return itsWidth;}

private:
 int itsLength;
 int itsWidth;
};

Rectangle::Rectangle ()
{
 itsWidth = 5;
 itsLength = 10;
}

Rectangle::~Rectangle ()
{}

int main ()
{
 Rectangle *pRect = new Rectangle;
 const Rectangle *pConstRect = new Rectangle;
 Rectangle *const pConstPtr = new Rectangle;

 cout << "pRect width: " << pRect->GetWidth() << " feet \n";
 cout << "pConstRect width: " << pConstRect->GetWidth() << " feet \n";
 cout << "pconstPtr width: " << pConstPtr->GetWidth() << " feet \n";

 pRect->SetWidth(10);
 //pConstRect->SetWidth(10);    //이것은 상수객체의 포인터를 선언한것이라 허용되지않는다.
 pConstPtr->SetWidth(10);

 cout << "pRect width: " << pRect->GetWidth() << " feet \n";
 cout << "pConstRect width: " << pConstRect->GetWidth() << " feet \n";
 cout << "pConjstPtr width: " << pConstPtr->GetWidth() << " feet \n";

 delete pRect;
 delete pConstRect;
 delete pConstPtr;
 return 0;
}

'개발' 카테고리의 다른 글

typedef 는?  (0) 2010.10.10
중첩함수가 뭘까요~?  (0) 2010.10.10
클래스(Class) 란?  (0) 2010.10.10
자유기억공간(스택, 힙)을 활용해 봅시다!  (0) 2010.10.10
참조자가 뭐지?  (0) 2010.10.10
 

참조자는 &(앤퍼센트연산자, 주소연산자)를 사용하여 선언할 수 있습니다.
int &a; 또는 int & a; 도 무방합니다.  //참조자는 선언후 초기회되지않는다면 컴파일러는 에러를 출력합니다.

//예제를 보시면서 밑의 내용을 읽어보시기 바랍니다.
1 예제를 보시면 아시겠지만 포인터와 참조자는 다르다는 것 
그리고 참조자는 자신이 참조하는 것의 주소를 반환하지만
포인터는 자신의 주소를 반환한다는점 입니다.

참조자는 먼저 초기화된 변수가 있을때. 다른 변수로 초기화 되지 않습니다.
반면에 포인터는 다른 변수를 참조하는게 가능하죠.
// 객체에 대한 다른 이름을 만들 때 참조자를 사용합니다.  이 참조자를 이용하여 함수의 한계(반환값은 한개이고 매개변수는 값만 받을 수 있다.) 를 극복할 수 있습니다.
C++에서는 참조 전달 방식은 2가지가 있습니다. 포인터와 참조자로 하는법이죠.
2 예제를 보시면서 보시죠.
예제를 보시면 포인터로 만들었을 때완 달리 특별한 연산자가 사용된점은 없습니다.
(매개변수 선언시 앤퍼센트연산자를 제외하고)

이처럼 참조자는 포인터를 사용할 때의 강력함 과 일반 변수를 사용할 때 의 간편성과 편리성을 제공합니다.

이제 한개만을 반환할 수 있던 함수의 한계를 극복해봅시다. 아마도 눈치빠른 몇몇 분들은 예상하셨을 수도 있을겁니다. 바로반환받을 변수(혹은 객체)를 넘기는것입니다. 이로인해 return예약어는 다른 곳에 이용할 수 있습니다. 함수의 에러를 반환한다던가 를 할 수 있죠.

이제 한개만을 반환할 수 있던 함수의 한계를 극복해봅시다. 아마도 눈치빠른 몇몇 분들은 예상하셨을 수도 있을겁니다. 바로반환받을 변수(혹은 객체)를 넘기는것입니다. 이로인해 return예약어는 다른 곳에 이용할 수 있습니다. 함수의 에러를 반환한다던가 를 할 수 있죠.

1 예제를 보시면 이해하실 겁니다.
나열형을 이용하여 오류 처리를 명확하게 하기도 하고, 참조자를 이용하여 매개변수를 다루기 쉽고 이해하기 쉽게 만들었습니다.

효율성(Efficiency)을 위하여 참조자를 사용합시다.
매번 함수에 객체를 값으로 전달할 때마다 그 객체에 대한 복사가 일어납니다. 또, 매번 함수로부터 객체를 값으로 하여 반환할 때마다 복사가 일어나죠. 이 객체들이 복사될때마다 시간과 메모리가 소요됩니다. 내장된 정수형 같은 객체를 쓸 때 이러한 과정은 별 일이 아닐 수 있습니다. 하지만 큰 객체의 경우에는 그에 대응되는 대가가 매우 크죠.

3예제를 보시면 그것을 느끼게되실겁니다.

소스의 객체는 그렇게 크지 않습니다. 하지만 만약 이것이 커졌을때를 생각해보신다면 끔찍하실것입니다.


'개발' 카테고리의 다른 글

typedef 는?  (0) 2010.10.10
중첩함수가 뭘까요~?  (0) 2010.10.10
클래스(Class) 란?  (0) 2010.10.10
자유기억공간(스택, 힙)을 활용해 봅시다!  (0) 2010.10.10
Const 포인터! 상수포인터의 용도는?  (0) 2010.10.10

+ Recent posts