시작...

블로그 이미지
mutjin

Article Category

분류 전체보기 (148)
기록 (3)
개발새발 (8)
2010년 이전 글 (133)

Recent Post

Recent Comment

Recent Trackback

Calendar

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Archive

My Link

  • Total
  • Today
  • Yesterday
  1. 2012.07.30
    db2 컬럼이름 바꾸기
  2. 2011.07.19
    getCurrentTime() 함수
  3. 2011.02.18
    postgreSQL 에서 oracle의 rowid 같은 값 이용하기
  4. 2010.04.26
    참조카운팅과 String
  5. 2010.04.12
    메모리 지정 new(placement new)
  6. 2010.04.09
    parameter & argument
  7. 2010.04.02
    const 정리
  8. 2010.04.01
    Prologue...
and

이게 최선일지는 모르겠다.


string getCurrentTime()
{
 time_t curr;
 struct tm *t;
 char timeStr[128];
 curr=time(NULL);
  t=localtime(&curr);
 
  sprintf( timeStr, "%d-%02d-%02d %02d:%02d:%02d" , (t->tm_year +1900),(t->tm_mon + 1),t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec );
 
  return string(timeStr);
 }

'개발새발 > 기초' 카테고리의 다른 글

postgreSQL 에서 oracle의 rowid 같은 값 이용하기  (0) 2011.02.18
참조카운팅과 String  (0) 2010.04.26
메모리 지정 new(placement new)  (0) 2010.04.12
parameter & argument  (0) 2010.04.09
const 정리  (0) 2010.04.02
and
row 단위로 중복된 데이터를 가지는 테이블이 있어서.. 중복된 데이터만 골라내고 싶은 마음에 찾아봤다.
오라클의 rowid 처럼 postgreSQL에서도 oid, ctid 같은 시스템 컬럼이 존재한다.
근데 PostgreSQL 8.1 이상에서는 디폴트로 oid가 없다.
그래서 ctid 를 사용했다.
데이터가 좀 특이하다 duple 형식이라는데..
어짜피 한 테이블에서만 유니크한건 문제 없기 때문에 그냥 사용 했다.

select *, ctid from esm_rpt_tra_d where ctid = '(0,8)'



http://www.postgresql.org/docs/9.0/static/ddl-system-columns.html


 



간만에 글쓰는구나

'개발새발 > 기초' 카테고리의 다른 글

getCurrentTime() 함수  (0) 2011.07.19
참조카운팅과 String  (0) 2010.04.26
메모리 지정 new(placement new)  (0) 2010.04.12
parameter & argument  (0) 2010.04.09
const 정리  (0) 2010.04.02
and

코드 내용은 MEC++ 의 항목 29[각주:1] ( 258p~266p ) 를 뱃겼다.

  1 #include <iostream>
  2
  3 class MyString {
  4   public:
  5     MyString( const char * in_str = "" ) : value( new StrValue( in_str ) ) {
  6     MyString( const MyString& rhs ) : value( rhs.value ) {
  7       ++value->refCount;
  8       printf(" init refCount : %d\n", value->refCount );
  9     }
 10
 11     ~MyString() {
 12       printf(" dest refCount : %d\n", value->refCount );
 13       if(--value->refCount == 0 ) delete value;
 14     }
 15     MyString& operator=( const MyString & rhs );
 16
 17     const char* c_str() { return value->data; }
 18
 19   private:
 20     struct StrValue {
 21       int refCount;
 22       char * data;
 23
 24       StrValue( const char * in_str ) : refCount(1)
 25       {
 26         printf( "new called\n" );
 27         data = new char[strlen(in_str) + 1];
 28         strcpy( data, in_str );
 29       }
 30       ~StrValue() {
 31         printf( "delete called\n" );
 32         delete [] data;
 33       }
 34
 35     };
 36
 37     StrValue *value;
 38 };
 39
 40 MyString& MyString::operator=( const MyString& rhs )
 41 {
 42   if( value == rhs.value ) return *this;
 43
 44   if( --value->refCount == 0 ) delete value;
 45
 46   value = rhs.value;
 47   ++value->refCount;
 48
 49   return *this;
 50 }
 51
 52 int main()
 53 {
 54   MyString s1( "abc" );
 55   printf(" 1 .......... %s \n", s1.c_str() );
 56   MyString s2(s1);
 57   printf(" 2 .......... %s \n", s2.c_str() );
 58   MyString s3;
 59   printf(" 3 .......... %s \n", s3.c_str() );
 60
 61   s3 = s2;
 62   printf(" 3-2 .......... %s \n", s3.c_str() );
 63
 64   return 0;
 65 }
 66

결과

new called
 1 .......... abc
 init refCount : 2
 2 .......... abc
new called
 3 ..........
delete called
 3-2 .......... abc
 dest refCount : 3
 dest refCount : 2
 dest refCount : 1
delete called

결과 분석
54번 라인에서 s1이 생성되면서 26라인이 출력 되었다.
56 라인에서 s2가 생성되면서 참조카운트(refCount)가 2로 증가 하였다.
58 라인에서 s3가 생성되면서 다시 26 라인이 출력되었다.
그러나 61 라인에서 s2의 값 복사가 발생해서 s3의 값(빈문자열)이 삭제되어 31 라인이 출력 되었다.
끝으로 main이 끝나며 객체가 하나씩 파괴되고 마지막으로 실제 data도 삭제된다.


[] 연산자나 포인터, 참조자 등등을 추가 해야 하지만, 책을 참조하자 ^^;



  1. 도서에 대한 내용은 http://mutjin.com/159 를 참고하자 [본문으로]

'개발새발 > 기초' 카테고리의 다른 글

getCurrentTime() 함수  (0) 2011.07.19
postgreSQL 에서 oracle의 rowid 같은 값 이용하기  (0) 2011.02.18
메모리 지정 new(placement new)  (0) 2010.04.12
parameter & argument  (0) 2010.04.09
const 정리  (0) 2010.04.02
and

공유 메모리나 메모리 맵 I/O를 사용하는 어플을 만들 때 유용한 방식이다.

char *myBuffer = new char[1024];
myClass *pMyClass = new (myBuffer) myClass( 10 );


대신, 객체를 삭제할 때에 소멸자를 직접 호출 해야 한다.

pMyClass->~myClass();  // 파괴자 직접 호출
delete[] myBuffer;           


참조자료 : MEC++ 83 page, http://fromdj.egloos.com/3545830

'개발새발 > 기초' 카테고리의 다른 글

postgreSQL 에서 oracle의 rowid 같은 값 이용하기  (0) 2011.02.18
참조카운팅과 String  (0) 2010.04.26
parameter & argument  (0) 2010.04.09
const 정리  (0) 2010.04.02
Prologue...  (0) 2010.04.01
and

parameter : 매개변수, 함수를 선언 할 때 괄호 안에 명시하는 데이터 변수
argument : 인자, 함수를 호출할 때 넘기는 실제 데이터 값

명칭이 혼용되서 사용되는 경우가 있는데, 명확한 구분이 필요하다고 한다.

'개발새발 > 기초' 카테고리의 다른 글

postgreSQL 에서 oracle의 rowid 같은 값 이용하기  (0) 2011.02.18
참조카운팅과 String  (0) 2010.04.26
메모리 지정 new(placement new)  (0) 2010.04.12
const 정리  (0) 2010.04.02
Prologue...  (0) 2010.04.01
and


코딩 하다보면 const 를 사용해야 하는 경우가 있다.
그러나 정확하게 기억나지 않아서 좀 헷갈리고, 결국 안 쓰고 넘어가게 된 적이 몇 번 있다ㅠㅠ
이런 저질 기억력...

첫번째 컨닝 페이퍼다.


constant 의 약자이다.



C 에서의 const는 전처리 단계에서 상수라기 보단 읽기 전용 변수로 취급하기 때문에 define 과 같은 의미로 사용할 수 없지만 C++ 에서는 완전한 상수로 취급하므로 define을 대체해서 사용할 수 있다.
즉, 배열의 열 갯수로 사용 할 수 있다는 얘기다.


1. 일반 변수에서의 const

const int val = 10;
int const val2 = 20;

위의 코드는 동일한 동작을 한다.


2. 포인터 변수에서의 const

char aBuf[10];
char bBuf[10];
const char * ptrBuf1 = aBuf;   // char const * ptrBuf1 = aBuf; 와 같다
char * const ptrBuf2 = aBuf;

*ptrBuf1 = 'a'; // 에러
ptrBuf1 = bBuf; // 성공

*ptrBuf2 = 'a'; // 성공
ptrBuf2 = bBuf; // 에러

*(포인터 기호?) 을 기준으로 ptrBuf1은 포인터 변수이므로 포인터 주소 값을 변경할 수 있지만, 데이터 형이 const형이므로 주소가 가르키는 실제 값을 바꿀 수는 없다.
ptrBuf2 역시도 * 을 기준으로 const 포인터 변수이므로 포인터 주소 값을 변경할 수는 없지만, 데이터형의 값은 바꿀 수 있다.

추가적으로 const char * const pBuf = aBuf; 처럼 주소와 주소가 가르키는 값 모두 const로 만들 수도 있다.

아...이래도 헷갈린다 ㅠㅠ

 

3. 일반 변수와 const 변수

int num = 10;
const int * const pNum = &num; // 성공

const int num = 10;
int * pNum = &num; // 에러
const로 선언된 변수의 주소는 일반 포인터 변수에 대입할 수 없다.


4. 참조와 const

int num = 10;
int const &refNum = num;
refNum = 20; // 에러
num = 20;    // 성공
const 참조 변수는 직접적으로 값을 변경 할 수 없지만, 원본을 통해서는 변경할 수 있다.

int & const refNum2 = num;
refNum2 = 20;
이 경우는 컴파일시에 참조가 무시된다.(vc2005 기준)


5. 함수와 const

const int func()  // 이건 무의미하다.
const
int * func() // 상수화된 int 포인터 주소를 리턴
int * const func() // 위와 같음
int const & func( const int * arg ) // 상수화된 참조형식으로 리턴


6. classconst

6-1. 맴버함수 뒤에 붙는 const

class
TestClass
{
public:
 TestClass() { num = 100; } // 100으로 초기화
 int func() const;
 int func(){ num = 2; return num; }
 int func2(){ num = 10; return num; }
 int func3() const { return num; }
protected:
 int num;
};

int TestClass::func() const
{
 int a = 1;
 int b = a++;
 num = b; // 에러
 return num;
}

class의 맴버 함수 정의 뒤에 const가 붙으면, 해당 함수 내부에서 해당 클래스의 맴버변수를 변경할 수 없다.


6-2. 객체에 붙는 const

const TestClass test;
int num = test.func(); // const func() 함수가 호출됨.
test.func2(); // 에러

TestClass test2;
int num2 = test2.func(); // func() 함수가 호출됨.
test2.func3(); // 성공

cout << "num : " << num << endl << "num2 : " << num2 << endl;

결과
num : 100
num2 : 2

const 객체는 const 맴버 함수만 호출 할 수 있고, 함수 오버로딩 된 경우도 const 함수가 호출된다.
const 객체는 const 함수를 호출 할 수 있다.

 
7. cast

const num = 10;
num = 20; // 에러
int * num2 = const_cast<int*>(&num);

상수형 포인터를 비 상수형 포인터로 변경할 때 사용된다.
const 는 가급적 변경하지 않는게 바람직 하다.
간혹 함수의 비 상수형 인자로 상수형 변수를 전달하여야 할 경우에 사용된다.



글의 내용이 100% 정확하다고는 못 하겠다. 참고한 책이 좀 오래된 책이기도 하고.. 생각 나는데로 작성한 것이기도 하고...

시간내서 검증좀 해보고 수정이 필요하면 수정 하고 뭐 더 추가할 만한게 있나 생각해보고 있으면 추가도 해야겠다.

p.s. 또 6시 넘었다. 퇴근!!

'개발새발 > 기초' 카테고리의 다른 글

postgreSQL 에서 oracle의 rowid 같은 값 이용하기  (0) 2011.02.18
참조카운팅과 String  (0) 2010.04.26
메모리 지정 new(placement new)  (0) 2010.04.12
parameter & argument  (0) 2010.04.09
Prologue...  (0) 2010.04.01
and


나름 개발자 인생 8년(대학4년, 회사4년).
그러나 난 기초가 부족하다.
아니, 원래 부족하진 않았다.
단지 까먹었을 뿐이다ㅠㅠ
이런 돌머리...
그래서 컨닝페이퍼를 작성하고자 한다.

완전 처음부터 시작하고 싶지만,  시간적 여유가 넘치는 건 아니니까.
좀 헷갈리는 것들, 가~~끔 쓰여서 자꾸 까먹지만 중요한 것들, 한번 쯤 공부해 봤으나 잘 기억나지 않고 있는 도움될 만한 것들... 위주로 Reference 처럼 작성해 보려고 한다.
물론, 기준은 완벽히 내맘이므로, 쓸데 없을 수도 있다ㅋㅋ

과연, 게으른 내가 몇 개의 글을 포스팅 할 수 있을지ㅋㅋ
하루에 하나씩, 20개만 쓰자!

p.s.
오예~ 6시 넘었다. 퇴근!ㅋㅋ

p.s.2
사진은 글의 내용과 무관하다.

'개발새발 > 기초' 카테고리의 다른 글

postgreSQL 에서 oracle의 rowid 같은 값 이용하기  (0) 2011.02.18
참조카운팅과 String  (0) 2010.04.26
메모리 지정 new(placement new)  (0) 2010.04.12
parameter & argument  (0) 2010.04.09
const 정리  (0) 2010.04.02
and