2010년 12월 1일 수요일

new delete로 메모리 할당해주기

C++이 기존의 C보다 더 강력한(효율적인이 맞나?ㅋㅋ)기능중에 하나가 바로 new와 delete이다.

C에서는 free와 malloc을 가지고 메모리 분배를 하였지만 이능 굉장히 비효율적이고 코드의 가독성을 엄청나게 떨어트리는 주범이었다.

이를 극복하기위해 C++에서는 new와 delete라는 명령어가 생겼다. 이름에서도 알수 있듯이 new는 메모리 할당이고 delete는 메모리 회수다 ㅋㅋ

1차원 array일 경우에는 메모리 할당과 회수가 아주 쉽다.
int n = 100;
int *a;
a =  new int [n]
...
delete []a;

2차원일때는 조금 복잡하다ㅋㅋ
int n = 100, m = 200;

//분배 시작
int **a;
a = new int *[m];

for(int i=0; i<m; i++)
{
a[i] = new int [n];
}
//분배완료

...

//회수 시작
for(int i=0; i<m; i++)
{
delete []a[i];
a[i] = NULL;
}

delete []a;
a = NULL;
//회수 완료

똑같은 방법을 사용해서 3,4,5,...차원 array를 정의할수 있다 ㅋㅋ



아 그리고 여기서 분명히 왜 int a[100]이런 방법을 안쓰고 new혹은 malloc을 사용하는게 좋은지 물어보는 사람들이 있을거다. 분명 int a[100] 이라는 방식은 굉장히 편하다. 하지만 이 방법은 공간의 크기를 상수로 정해줄수밖에 없다. 즉
int n = 100;
int a[n];

위와 같은 명령은 에러로 간주된다. 왜냐하면 n은 상수가 아니기 때문이다. 하지만 new나 malloc은 []괄호 안에 꼭 상수를 안 써넣어도 사용할수 있다.






Operator Overload - 연산자 중첩

C++에서 operator overload(연산자 중첩)는 아주 자주 쓰이는 기법이다

 - operator overload란?
C++에 기존에 있는 연산자 부호 +,*,-,++,+=등이 숫자에만 사용되지 않고 임의로 만든 class나 struct에도 사용될수 있도록 하는 기법이다.

- operator overload를 쓰는 이유
연산자 자체의 의미에 맞게 operator overload를 하게되면 코드의 가독성이 높아져 가독성이 높은 코드를 만드는데 큰 도움을 준다.


아무리 이렇게 얘기해봤자 너무 추상적이어서 이해하기 힘들거다. 그래서 얘를 들어보도록 하자.

코딩을 하다가 Vector를 쓸 일이 나와서 아래와 같이 Vector 클래스를 정의하게 됐다.
class Vector
{
public:
...
private:
double e1;
double e2;
};
이 class를 써서 프로그램을 구현하다보면 Vector 더하기,빼기 그리고 Vector간의 내적,외적을 구하는 연산을 진행하게된다. 하지만 모든 함수들을 다 Vector Plus(Vector v1, Vector v2); 이런식으로 구현한다면 코드의 가독성은 굉장히 떨어지게된다. C++에서는 이런 코딩에 대해서 편의를 주기위해 +,-,*등의 부호를 프로그래머 맘대로 정의할수 있게 해준다. 즉 아래와 같은 코드가 의미있도록 프로그래머가 설계할수 있다.
void main(void)
{
Vector v1,v2;
...
Vector v3 = v1+v2;
...
}

그렇다면 이런 코드를 설계하려면 어떻게 해야 하는지 알아보자.
operator overload를 하기 위해서는 operate라는 선언방법을 사용해야 한다.
operator들은 class안에도 선언할수 있고 밖에도 선언할수 있다. 밖에 선언할때는 friend방식으로 선언해야 한다. 아래에서는 비교적 간단한 안에 선언하는 방법에대해서만 설명하겠다.
몇가지 operator의 선언방법은 아래와 같다(Vector class를 얘로 들었을때)
class Vector
{
public:
...
const Vector operator+(const Vector &v) const;
Vector &operator+=(const Vector &v);
double operator*(const Vector &v) const;
Vector &operator=(const Vector &v);
Vector &operator++(void);
const Vector operator++(int);
private:
...
};


'+' operator의 정의함수는 아래와같이 쓸수 있다.
const Vector Vector::operator +(const Vector &v) const
{
Vector temp;
temp.e1 = e1 + v.e1;
temp.e2 = e2 + v.e2;

return temp;
}

이렇게 한 후 main함수에서 v1 = (3,4), v2 = (1,9)  (※주의, 이건 코드가 아닙니다 ㅋㅋ) 이 두 벡터를 아래와 같은 코드로 더하게 되면 v3 = (4,13)이된다.
void main(void)
{
...
v3 = v1+ v2;
...
}

다른 operator들도 똑같은 방식으로 선언하고 정의하여 사용하면 된다.

다른 operator정의의 예는 이 글에 다 쓰지 않고 첨부파일에 붙여놓아야겠다. 글이 너무 길어지면 쓰는 나도 읽는분도 너무 힘드니까 ㅋㅋ

위 operator들을 보면 const,&가 붙는 위치가 뒤죽박죽이다. 다음 글에서는 const와 &가 어떤 규칙으로 붙여지는지 간단하게 설명하도록 하겠다.





2010년 11월 30일 화요일

블로그 방문자수 급증

한 4달동안 건들지도 않은거 같은데...
이번달 블로그 방문자수가 장난아니게 많다

이제 여유가 좀 생겼으니 열심히 관리해야지 ㅋㅋ

2010년 7월 23일 금요일

신기한 단어들

만약 A = 0.01, B = 0.02, C = 0.03, ..., Y = 0.25, Z = 0.26이라고 했을때

Hard work (노력)
  H+A+R+D+W+O+R+K = (8+1+18+4+23+15+18+11)/100 = 98%
 

Knowledge(지식)
  K+N+O+W+L+E+D+G+E = (11+14+15+23+12+5+4+7+5)/100 = 96%


Love(사랑)
  L+O+V+E = (12+15+22+5)/100 = 54%


Luck(운)
  L+U+C+K = (12+21+3+11) = 47%


Money(돈)
    M+O+N+E+Y = (13+15+14+5+25)/100 = 72%


Leadership(리더쉽)
     L+E+A+D+E+R+S+H+I+P = (12+5+1+4+5+18+19+9+16)/100 = 89%
돈도,노력도,지식도 100%가 아니라면 무엇이 100%일까?
바로 태도이다!

ATTITUDE(태도)
   A+T+T+I+T+U+D+E = (1+20+20+9+20+21+4+5)/100 = 100%


신기하지 않은가?
언제나 긍적적인 태도로 세상을 대해야 100%의 삶을 살수 있지 않을까?

2010년 5월 22일 토요일

[C++] 비트연산자

C++에서는 bit연산자를 지원한다.
여기서 비트 연산자는 2진수에서 자주 쓰이는 연산을 말한다.
즉 and,or,xor,not이 그들이다.

1. and: A and B를 C++에서는 아래와 같이 계산한다.
Result = A & B

2. or: A or B를 C++에서는 아래와 같이 계산한다.
Result = A | B

3.xor: 이 A xor B를 C++에서는 아래와 같이 계산한다.
Result = A^B

4.not: not(A)를 C++에서는 아래와 같이 계산한다.
Result = ~A

나머지 bit연산자는 (예nor,nand등등) 이 기본적인 연산자로부터 파생하여 계산할수 있다.

[C++] 16진수 8진수 출력하기

C++은 C와 달리 cout이라는 출력방법을 쓰기 때문에 변수의 유형을 지정해줄수 없다.
그래서 cout << value << endl 을 그냥 실행하게 되면 변수의 유형 그대로 출력이 되게 된다.

그렇다면 C++에선 10진수 16진수 8진수등으로 출력할수는 없는것일까?
답은 아니다.

C++에서도 16,10,8진수중 하고싶은걸 골라서 출력할수 있다.

C++에서 16진수 출력방법
cout << hex << value

C++에서 8진수 출력방법
cout << oct << value

C++에서 10진수 출력방법(이건 default이기 때문에 위 연산자( hex와 dec)를 쓰지 않았다면 안써도 된다)
cout << dec << value

아쉽지만 C++에서는 이진수 출력은 지원해주지 않는다(C도 마찬가지 이다), 이진수는 스스로 프로그램을 짜서 출력하거나 이진수 관련 해더 파일을 불러서 그 라이브러리에 있는 함수를 써야 한다.

[Matlab] 메트릭스 역순으로 바꾸기

한 메트릭스를 역순으로 바꾸는데는 2가지 방법이 있다, 세로 역순과 가로 역순이다.
이 두가지에 대해서 각각 함수가 존제한다.

1.세로 역순
a = flipud(b);

예를 들어서 b = [1,2,3;2,7,6]이라면 a는 [2,7,6;1,2,3]이 된다. 말그대로 세로 역순이 된다.


2.가로 역순
a = fliplr(b);
예를 들어서 b = [1,2,3;2,7,6]이라면 a는 [3,2,1;6,7,2]가 된다. 말그대로 가로 역순이 된다.