달력

11

« 2018/11 »

  •  
  •  
  •  
  •  
  • 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
  •  



원래 자주 검색해서 쓰고 그랬는데 요즘엔 그것도 귀찮고

하나 놔둬야겠다 ㅠ

 

strcpy -> wcscpy -> _tcscpy (문자열을 복사)

strncpy -> wcsncpy -> _tcsncpy ( 사이즈 만큼 복사)

strlen -> wcslen -> _tcslen (문자열 길이 확인)

strcat -> wcscat -> _tcscat (두 문자열 이어 붙이기)

strncat -> wcsncat -> _tcsncat (사이즈 만큼 이어 붙이기)

strcmp -> wcscmp -> _tcscmp (문자열 비교) (반환 값(-1, 0, 1))

strncmp -> wcsncmp -> _tcsncmp ( 사이즈 만큼 문자열 비교)

stricmp -> wcsicmp -> _tcsicmp (대소문자를 구별하지 않고 문자열을 비교)

strnicmp -> wcsnicmp -> _tcsnicmp (사이즈 만큼 대소문자를 구별하지 않고 문자열을 비교)

strchr -> wcschr -> _tcschr (문자 찾기)

strrchr -> wcsrchr -> _tcsrchr (문자 찾기 (문자열 끝에서 부터 검색))

strstr -> wcsstr -> _tcsstr (문자열 찾기)

strpbrk -> wcspbrk -> _tcspbrk (문자 찾기 (두번째 인수를 찾고자 하는 문자들의 집합(문자열)으로 구성)

strtok -> wcstok -> _tcstok (문자열 자르기 (두번째 인수를 집합(문자열)으로 구성 가능)) => 해당 문자가 NULL로 치환 됨

strset -> wcsset -> _tcsset (문자 치환, 첫째 인수의 모든 문자를 두번째 인수 문자로 변경함) => "abc" -> "bbb"

strnset -> wcsnset -> _tscnset (사이즈 만큼 문자 치환)

strupr -> wcsupr -> _tcsupr (대문자로 치환)

strlwr -> wcslwr -> _tcslwr (소문자로 치환)

strrev -> wcsrev -> _tcsrev (문자열 역정렬) => "가나다라마" -> "마라다나가"

 

 

Posted by 안식의후크
2010.04.04 18:32

예외 처리(try, catch, throw) 프로그래밍/C++2010.04.04 18:32






코드에서 예외 처리를 하는 방법은 많이 존재한다.

주로 조건문을 사용해서 예외 처리를 하게 되지만,

C++에서 예외 처리 메커니즘인 try, catch, throw문에 대해서 살펴 보도록 하자.

순서는 try안에서 throw를 해주면

catch에서 예외를 처리 한다고 보면 된다.

예제는 다음과 같다.


구문 자체가 어색하게 느껴질 수도 있지만, 사용법이 어려운것은 아니다.
예외가 발생하면 throw b를 통해 catch에서 b를 인자로 받게 되고,
그 밑에 예외 처리문을 실행하게 되는 것이다.
단지 특이한 점은 예외 처리가 일어 나면 throw를 기준으로 그 밑 라인들은 실행을 하지 않는 다는 것이다.
이런 상황을 Stack Unwindung(스택 풀기)라고 한다.
좀더 상황을 만들면 다음과 같다.

이 처럼 예외가 전달되는 과정이 함수의 스택이 풀리는 순서와 일치 한다.
하지만 만약 try 나 catch가 없다면 어떻게 될까?
당연히 오류 메시지를 출력하고 프로그램을 강제 종료 하게 된다.
어떤식으로 메시지가 뜨는지 확인 하고 싶다면,
stdlib.h를 추가해서,
abort();
를 실행해 보자.

이런 식의 메시지를 확인 할 수 있을 것이다.
또 한가지 주의점은 catch에서 받는 매개변수의 타입이다.
catch( int excption ) 다음 처럼 int 형의 예외를 처리하는 catch문에을,
catch( char excption )로 변경한다면,
예외가 발생했을 때 그것을 처리하지 못하게 된다.
즉 abort가 또 실행된다.
그리고 가독성을 위해서 함수 옆에 throw가 발생 할 수 있는 예외에 대해서 설정할 수가 있는데,
처럼 함수 내부를 다 찾아서 throw를 찾지 않아도,
함수 처음 부분만 보고도 어떤 예외가 돌아올 수 있는지 파악하여,
미리 catch문을 작성할 수 있게 도와준다고 한다.
throw에 대해서 클래스를 사용할 수도 있는데,
다음 예제를 보자.

따로 출력 결과를 표현하지는 않겠다. 여러 상황이 나올 수 있으니까,
한가지 확실한건 클래스를 사용해서 예외처리시에 인자로 넘겨 주었다는 것이다.
주의 할 점은 catch문은 받아 오는 인자에 따라 오버로딩 처럼 사용할 수 있지만,
실제로는 if처럼 순차적으로 검사한다는 것을 알아야 한다.
만약 AAA<-BBB<-CCC 라는 식으로 상속 구조가 되어 있다면
catch( AAA& a ) 안에서 모두다 허용할 수 있따는 것이다.
만약 이와 같은 구조를 피하고 싶다면.
catch( AAA& a );
catch( BBB& a );
catch( CCC& a );가 아닌

catch( CCC& a );
catch( BBB& a );
catch( AAA& a );로 해야 할 것이다.
Posted by 안식의후크
2010.04.04 16:05

템플릿(template) 프로그래밍/C++2010.04.04 16:05







변수 형에 대해서 오버로딩을 해서 여러가지 기능을 수행하는 함수를 중복정의를 할 수 있다.

하지만 그것 보다 더 좋은것이 존재 하니,

그것은 템플릿,

개념 자체는 어렵지 않다.

예제를 보자.

이 처럼, 실행이 되면 T1은 int로 T2는 char*로 파악하여 생성자나, 함수들을 실행한다.
그리고 템플릿 특수화 라는 것이 존재하는데,
템플릿을 통해 타입을 정할 때 특정 타입에 대해서만 다시 재정의 하는 것이 가능하다.

마찬가지로 함수 템플릿 특수화도 존재한다.


주의 할 점은, 만약
일반 함수 템플릿의 경우
로 선언을 해 주었다면,
특수화 템플릿에서도
으로 해 주어야 한다는 것이다.
Posted by 안식의후크
2010.04.04 14:23

임시 객체 생성 프로그래밍/C++2010.04.04 14:23







특별히 어려운 내용은 아니고,

임시 객체, 말 그대로 잠깐 생겼다 사라지는 객체라고 보면 되겠다.

'프로그래밍 > C++' 카테고리의 다른 글

예외 처리(try, catch, throw)  (0) 2010.04.04
템플릿(template)  (0) 2010.04.04
임시 객체 생성  (0) 2010.04.04
연산자 오버로딩(operator overlonding)(2)  (0) 2010.04.04
연산자 오버로딩(operator overloading)(1)  (0) 2010.04.04
가상 복사 생성자  (0) 2010.04.03
Posted by 안식의후크





연산자 오버로딩에 대해 알아 보았다, 하지만 아직 연산자 오버로딩에 대해 완벽하게 알고 있는 것 같진 않다.



그렇다면 저 구문에 대해서 실행을 해주고 싶다면 어떻게 해야 할까?
이런 부분에 대해서는 전역으로 연산자 오버로딩을 해 주어야 한다.


다음은 [] 연산자에 대해서 연산자 오버로딩을 해보자.

비슷한 내용이지만 이번엔 int가 아닌 객체를 직접 저장하는 배열이 존재한다고 하고,
조금 소스를 변경해 보자.

조금 길게 느껴질 수도 있겠지만 큰 틀은 비슷하다.
단지 객체를 담기 위한 클래스와,
배열 안에 들어갈 클래스를 나눈것 뿐이다.
스스로가 스스로를 담기 위해선,
*를 통해서 해야 될 것으로 생각된다.

다음은 대입 연산자(=)를 오버로딩 하는 것에 대해서 살펴 보자.
실제로 연산자 오버로딩이 이루어진 곳에,
p1=p2;
를 하게 되면 p2에 값이 p1으로 이동 된 것을 알 수 있는데,
실제로 이것은 디폴트 대입 연산자 오버로딩? 정도로 표현 할 수 있을 것이다.

어찌 보면 복사 생성자와 같은 맥락이지만,
당연히 기본적인 디폴트 대입 연산자는 얕은 복사가 이루어 진다.
무슨 의미인지 알겠는가?
완벽하게 해주기 위해선,
깊은 복사가 이루어 져야 한다는 것이다.

'프로그래밍 > C++' 카테고리의 다른 글

템플릿(template)  (0) 2010.04.04
임시 객체 생성  (0) 2010.04.04
연산자 오버로딩(operator overlonding)(2)  (0) 2010.04.04
연산자 오버로딩(operator overloading)(1)  (0) 2010.04.04
가상 복사 생성자  (0) 2010.04.03
virtual(가상)  (0) 2010.04.03
Posted by 안식의후크






기존에 존재하는 +, ++, == 등의 연산자를 프로그래머가 중복 정의가 가능하다.

operator+, operator++ 등으로 오버로딩이 가능한데,

멤버 함수내에 선언할 수도 있고, friend 키워드를 사용해서 전역으로 사용 할 수도 있지만,

멤버 함수에 선언해서 사용하는 것에 대해서 먼저 살펴 보자.

연산자 오버로딩의 사용 예,


operator++을 보면 인자를 받지 않고 return *this를 해주고 있다.
설명이 필요 없을지도 모르겠지만, 멤버 함수 내에 선언되어 있는 존재이기 때문에 자신의x,y를 증가 시키고
*this를 넘겨 줌으로써 값을 받아 온다.
만약 *this를 쓰지 않고 return tmp; 같은 식으로 하게 된다면,
++(++p);의 경우,
++p(1증가);
다시 1 증가
총 2증가를 하게 되지만,

복사본을 사용한다면,
++(++p);의 경우,
++p(p의 복사본,1증가);
p의 값은 1 증가,
p의 복사본이 1증가,
결론은 1밖에 증가가 되지 않는다.
다음은 전역에 선언한 operator에 대해서 살펴 보자.

이 처럼 사용이 가능하지만,
가능하면 객체지향적인 코딩을 생각해서 멤버 변수에 연산자 오버로딩을 하는 것이 옳은 방법이라고 생각한다.


그리고 ++p와 p++에 대해서 차이점이 존재한다.
실제로는 선연산 , 후연산이지만 operator를 사용해서는 그 의미가 불문명 해지게 된다.
이럴 경우를 대비해
Point& operator++(); ++p와 같고,
Point& operator++(int); p++과 같다.
예제를 잠깐 보자.

하지만 이 방법에는 큰 문제점이 존재하는데,
위에서 언급 하였던
(++(++p))와
((p++)++)우리가 예상 했던 결과가 나오지 않는 다는 것이다.

연산자 오버로딩이 안되는 경우도 존재 하는데,
. .* :: ?: sizeof 는 할 수 없다고 한다.
마지막으로 주의점에 대해서 이야기 하겠다.
1. p+3;
이 부분은 p의 값들에 3을 더할 수도 있겠고,
또는 p에 3을 더해서 새로운 객체를 생성해서 리턴하는 것일 수도 있다.
즉 저 부분만 봐서는 어떤 일을 하는지 알 수 없다는 것이다. (직접 operator+함수를 보기 전까진.)

2. p+3*3;
연산자는 계산시에 우선 순위가 존재 한다.
만약 저렇게 연산자 오버로딩을 하였다고 하더라도, 순서는 *3 이후 +3을 하게 된다는 것이다.

3. void operator+(int val=10);
이 처럼 연산자 오버로딩은 디폴트 매개 변수를 가질 수 없다. 만약 가능하다면,
p+; 이런 구문이 나올지도 모르고 이는 분명 프로그래머가 원하는 방향은 아닐 것이다.

4. int operator+(int a, int b){ return a+b+3 }
이것 또한 안된다. 연산자 오버로딩을 하지 않은 (int)3+(int)4라는 기본 연산에 대해서 다시 오버로딩을 하는 것은 불가능하다.

마지막으로 전역으로 선언된 연산자 오버로딩과, 멤버 함수로 선언된 연산자 오버로딩은 조금의 불러오는 차이가 존재 하는데,

++p -> 멤버 함수의 경우( p.operator++(); ) 와 같고,
++p -> 전역 함수의 경우( operator++(p); ) 와 같다는 걸 기억해 두자.

'프로그래밍 > C++' 카테고리의 다른 글

임시 객체 생성  (0) 2010.04.04
연산자 오버로딩(operator overlonding)(2)  (0) 2010.04.04
연산자 오버로딩(operator overloading)(1)  (0) 2010.04.04
가상 복사 생성자  (0) 2010.04.03
virtual(가상)  (0) 2010.04.03
함수 오버라이딩(overriding)  (0) 2010.04.03
Posted by 안식의후크
2010.04.03 21:17

가상 복사 생성자 프로그래밍/C++2010.04.03 21:17






상황에 따라서 새로 생성한 이 후 그 내용을 복사해 주고 싶다면 어떻게 할까?

가상 복사 생성자,

어디서 뭘 설명해야 할지 모르겠지만,

객체 포인터 배열 A와
객체 포인터 배열 B가 존재 한다고 했을 때

A에 값을 삽입 후

B = A; 를 해주었을 때

B에 A의 내용이 그대로 복사 되길 원한다고 하자.

그때 사용한다.

나머진 소스 코드로 ㅠㅠ

'프로그래밍 > C++' 카테고리의 다른 글

연산자 오버로딩(operator overlonding)(2)  (0) 2010.04.04
연산자 오버로딩(operator overloading)(1)  (0) 2010.04.04
가상 복사 생성자  (0) 2010.04.03
virtual(가상)  (0) 2010.04.03
함수 오버라이딩(overriding)  (0) 2010.04.03
객체 레퍼런스  (0) 2010.04.03
Posted by 안식의후크
2010.04.03 13:14

virtual(가상) 프로그래밍/C++2010.04.03 13:14







virtual 이라는 키워드는 클래스에서 사용을 하게 되는데

존재 하지만 존재 하지 않는?

소스로 설명하겠다.

추가로,
static binding과 dynamic binding 이라는 것이 존재 하는데,

'프로그래밍 > C++' 카테고리의 다른 글

연산자 오버로딩(operator overloading)(1)  (0) 2010.04.04
가상 복사 생성자  (0) 2010.04.03
virtual(가상)  (0) 2010.04.03
함수 오버라이딩(overriding)  (0) 2010.04.03
객체 레퍼런스  (0) 2010.04.03
객체 포인터  (2) 2010.03.29
TAG C, C++, C언어, virtual
Posted by 안식의후크
2010.04.03 12:49

함수 오버라이딩(overriding) 프로그래밍/C++2010.04.03 12:49






오버로딩과 비슷한 그 이름

오버라이딩,

하지만 엄연히 틀리다.

한글로 표현하자면, 음,

오버로딩 = 함수 중복 정의?
오버라이딩 = 함수 재 정의?

정도로 표현 할 수 있을까 모르겠다.


크게 어려운 부분은 없다.

'프로그래밍 > C++' 카테고리의 다른 글

가상 복사 생성자  (0) 2010.04.03
virtual(가상)  (0) 2010.04.03
함수 오버라이딩(overriding)  (0) 2010.04.03
객체 레퍼런스  (0) 2010.04.03
객체 포인터  (2) 2010.03.29
IS-A, HAS-A 관계  (1) 2010.03.27
Posted by 안식의후크
2010.04.03 12:39

객체 레퍼런스 프로그래밍/C++2010.04.03 12:39







객체 포인터와 큰 차이는 없다.

객체 포인터 처럼 ClassA의 레퍼런스는 ClassA 객체뿐만 아니라 ClassA 클래스를 상속하는 하위 클래스 객체도 참조가 가능하다.

라고 보면 된다.

말이 어렵지만 소스를 보면 크게 어렵지 않다.

객체 포인터가 최상위 객체 포인터를 통해 하위를 받는다면,
이번엔 최 하위 객체 레퍼런스를 통해 상위 클래스에 오버라이딩 전 함수를 사용하기 위함으로 쓰면 좋지 않을까?
하는 생각을 조심스레 해본다.

'프로그래밍 > C++' 카테고리의 다른 글

virtual(가상)  (0) 2010.04.03
함수 오버라이딩(overriding)  (0) 2010.04.03
객체 레퍼런스  (0) 2010.04.03
객체 포인터  (2) 2010.03.29
IS-A, HAS-A 관계  (1) 2010.03.27
상속의 형태  (0) 2010.03.26
Posted by 안식의후크