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]가 된다. 말그대로 가로 역순이 된다.




2010년 5월 14일 금요일

[C++] VS 2005, VS 2008: fatal error C1902 에러 해결법

원래 잘 되던 Visual Studio(난 2008을 쓰고 있다) 가 잘 안된다

빌드할때 "fatal error C1902: 프로그램 데이터베이스 관리자가 일치하지 않습니다. 설치를 확인하십시오." 가 계속 뜬다.

인터넷에서 한동안 찾아본 결과 해결법은 아주 간단했다.

fatal error C1902 가 뜨는 이유는 컴파일러가 mspdb80.dll , mspdbsrv.exe , mspdbcore.dll 을 찾지 못해서 생기게 된다. 이 파일들을 찾아서 "VS설치경로\VC\bin"에 복사해주면 된다.
이 파일들은 "VS설치경로\Common7\IDE" 에 있다. 머 그냥 VS설치경로에서 search를 해도 금방 나온다.

만약에 이렇게 해도 문제가 해결되지 않을경우 아래의 방법들도 시도해보기를 추천한다.(밑에 방법들을 사용하기 전에 위 3파일을 VS설치경로\VC\bin"에 꼭 복사해 주어야 한다. )
1. cmd로 command창을 띄워 "VS설치경로\VC\bin"에 들어가 vcvars32.bat를 실행시켜준다.(꼭 command창을 사용하여 실행해야 한다.)
2. C:\windows\system32폴더 안에 있는 mspdb80.dll과 mspdbcore.dll을 지워준다. 이 두 파일을 지우면 시스템에 문제가 생길지 모르니(아직 생긴 문제는 없지만 혹시 모르니까..) 백업을 해두자.

이래도 해결되지 않으신 분들은 댓글 남겨주시기 바랍니다^^

2010년 4월 26일 월요일

드디어 블로그 연지 7개월만에 방문자가 3000명을 넘었습니다.

여러분의 뜨거운 성원에 감사 드립니다~

이번달은 방문자가 700명가까이 되네요

하루 평균 20명정도 방문하면 이번달 700명의 목표는 무난히 넘길듯 하네요 ^^

다음달 목표는 1000명입니다!

1년안에 하루평균 방문자수 100을 넘길수 있는 블로그가 되자~!

2010년 4월 3일 토요일

[Matlab] - 소수를 정수로 바꾸기!

Matlab에서는 '소수 -> 정수' 로 바꾸는데는 네가지 명령어가 쓰인다.


1. n = ceil(x)
  소수점 뒤에 숫자를 무조건 올린다.
  예:
      ceil(3.9) = 4
      ceil(1.4) = 2
      ceil(2.001) = 3
      ceil(-3.9) = -3
      ceil(-3.1) = -3
   

2. n = floor(x)
    소수점 뒤에 숫자를 무조건 내린다.
    예:
        floor(3.8) = 3
        floor(3.01) = 3
        floor(4.9999) = 4
        floor(-1.2) = -2
        floor(-2.9) = -3

3. n = fix(x)
     x위아래 정수중에서 0에 가까운 정수를 택한다
     예
         fix(3.3) = 3
         fix(4.99) = 4
         fix(-1.2) = -1
         fix(-8.999) = -8

4. n = round(x)
     반올림을 한다
     예:
          round(3.5) = 4
          round(9.1) = 9
          round(-1.1) = -1
          round(-2.6) = -3

마우스 오른쪽 버튼 해제

네이버나 다음 블로그를 볼때면 퍼가고 싶은 그림이 많은데...

대부분의 그림들은 락이 걸려있어서... 우클릭이 금지되어 있다. ㅠㅠ

꼭 퍼가고 싶은 그림이 있어서, 우클릭 해제 방법을 찾았는데... 가장 간단한 방법은 이거였다.


즐겨찾기에

javascript:function r(d){d.oncontextmenu=null;d.onselectstart=null;d.ondragstart=null;d.onkeydown=null;d.onmousedown=null; d.body.oncontextmenu=null;d.body.onselectstart=null;d.body.ondragstart=null;d.body.onkeydown=null; d.body.onmousedown=null;};function unify(w){r(w.document);if(w.frames.length>0){for(var i=0;i<w.frames.length;i++){try{unify(w.frames[i].window);}catch(e){}};};};unify(self);

이 웹페이지를 추가한다.

그리고 우클릭이 막힐때마다 이 즐겨찾기를 한번씩 클릭해주면 끝!
그럼 우클릭이 안막히고 잘 될거다~ㅋㅋ

2010년 2월 19일 금요일

[Matlab] - 매트랩 랜덤함수

매트랩은 랜덤함수가 많은 편인대... help를 쳐봐도 머가먼지 알수가...

그래서 쓸때마다 하나하나 정리를ㅋㅋㅋ 앞으로는 내 블로그를 보면 어떤 랜덤함수를 쓰면 좋을지 알수가ㅋㅋㅋ


1. rand(m,n)

우선 rand(m,n)제일 간단한거

만들어지는 랜덤수의 범위는 [0,1]이고 m*n개만큼 만든다

랜덤수는 평균분포(Uniformly Distributed)에 의해서 만들어진다( X ~ U(0,1) )

즉 rand(3,4)를 실행하면 랜덤수 12개를 만든다.

하나 만들구 싶으면 rand(1,1)실행하면 되구ㅋㅋㅋ

 


2.randn(m,n)

mean = 0, variation은 1인 normal distribution 을 따르는 랜덤수를 뽑는다. 즉 X~N(0,1),그렇다 정규분포다!

그럼 X~N(mean, "standard deviation"^2) 은 어떻게 구할까?

그냥 x = mean + "standard deviation" * randn(m,n);

이렇게 구하면 된다



3.randperm(k)

이 함수는 1~k까지의 정수를 랜덤하게 배열해준다

만약에 1~k중에 임의m게의 숫자를 중복되지 않게 뽑고 싶다면 randperm(k)를 하고 그 결과의 1에서 m까지 값을 쓰면 된다.

2010년 2월 7일 일요일

[C++] - struct와 class의 차이점

이거 아마 C++초보라면 잘 모르는 문제일텐데...

struct와 class는 개발자 입장에서 봤을때 차이가 없는거나 마찬가지이다.
다만 메모리 공간까지 깊게 들어간다면 class와 struct는 조금의 차이가 있긴하다...(하지만 저는 잘 모릅니다....ㅠㅠ)

class는 함수도 만들수 있고 operator도 만들수 있고 그러지 않냐고 반문하시는 분들이 있을텐데...
struct에도 똑같이 함수고 operator고 선언이 가능하다. 그 문법은 class의 문법과 똑같다(당연히 이건 C++에 한해서다. 다른언어에선 class와 struct가 다를수 있다)
struct에도 변수는 public private protect로 나누어진다.

다만 여기서 단 한가지 obvious한 차이점을 얘기하자면....
....
....
struct에서 public private protect라고 안하고 변수를 선언하면 변수는 public변수가 되고(즉  default가 public이란 얘기)
class에서 그냥 변수를 선언하면 변수는 private변수가 된다(즉 default는 private란 얘기)

2010년 2월 5일 금요일

[Matlab] - 각종 Matrix 만들기

이번 글에서는 매트랩에서 함수로 만들수 있는 각종 Matrix에대해서 소개하려 합니다.

1.  A = zeros(n,m)
    말 그대로 모든 element가 0인 매트릭스를 만듭니다.
    참고로 A = zeros(n) 과 A = zeros(n,n)의 결과는 같습니다.


2.  A = ones(n,m)
     말 그대로 모든 element가 1인 매트릭스를 만듭니다.
     참고로 A = ones(n) 과 A = ones(n,n)의 결과는 같습니다.


3.  A = eye(n)
     이 함수는 왼쪽 위부터 오른쪽 밑까지만 1이고 나머지는 다 0인 n*n Matrix를 만들어 줍니다.
     즉 A = eye(3) 의 결과는
     A = 1 0 0
           0 1 0
           0 0 1
     이 되는거죠.



오늘은 여기까지 하고 나중에 더 소개해보도록 하겠습니다.~^^

[Matlab] - 다항식 계산 함수들

우선 설명해야 하는건:
매트랩에서 다항식(1차)을 표시할때는 계수만 표시함으로서 끝낼수 있는데
얘를 들어서 p = [1,7,9,8,3]; 이라면 p가 표시하고 있는 다항식은
y = f(x) = 1*x^4 + 7*x^3 + 9*x^2 + 8*x^1 + 3;
이 된다.

그럼 이걸 이해한다 하고 뒤의 함수들을 설명하겠다.


1.    y = ployval(p,x);
       말그대로 y = f(x)를 구한다. 얘를 들어 p = [1,3,10]이고 x=3일때 y = polyval(p,x)를 실행시킨다면
       y = 1*3^2 + 3*3^1 + 10 = 28
       이 된다.


2.    y = roots(p);
       이 함수는 방정식 y = f(x) = 0 의 근을 구한다. 근이 여러게 있으면 모든근을 다 구하고(솔직히 모든 근          을 다 구할수 있다고 생각하지는 않지만...이걸로 모든근을 다 구할수 있으면 어떤방정식이든 다 풀수          있다는 얘기인데...상식적으로 모든 방정식을 다 푼다는건 불가능한 얘기 아닌가!) 복소수 근이 있다면          복소수근도 구한다.


3.    poly2str(p,'x');
        말 그대로 다항식 p를 써준다. 얘를 들어 p = [1,3,10]이고 poly2str(p,'x')를 실행시키면
        x^2 + 3 x + 10
        가 나온다.


4.     q = polyder(p);
         다항식 미분함수이다. 당연히 결과도 하나의 다항식이어야 한다. 얘를 들어 p = [1,3,10]이고 이 식을 미분한다면(즉 q = polyder(p) 를 실행한다면)
         q = [2,3]
         이 나온다. (당연히 1*x^2 + 3*x + 10 을 미분하면 2*x + 3 이 나온다)