전체 페이지뷰

레이블이 Tip인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Tip인 게시물을 표시합니다. 모든 게시물 표시

2014년 10월 23일 목요일

C++ 리터럴을 쉽게 알아보자.


"Literal" , 리터럴
이라고 불리는 이녀석은 도대체 누구일까.
쉽게 알아보도록 하겠다.

Literal 또는 Literal constant 라고 불리는이 녀석은
특정한 메모리공간에 이름이 없이 임시적으로 저장되어있는 값을 의미한다.

간단하게 예제를 보고 알아보자.

아주 간단하고 직관적으로 이해할수 있는 코드다.
여기서 num 은 무엇인가? 바로 '변수'이다. 이는 당연히 우리가 알고있다.
그러면 10 + 100; 여기서 10과 100은 무엇인가?
바로 이와 같이 사용되는게 리터럴이다. num = 10+ 100;을 하게되면
메모리공간엔 이름이 없이 10과 100이라는 값을 저장하게된다.
그리고 이값을 사용한후 다음줄로 넘어가게되면 메모리공간에서 사라지게된다.

리터럴은 상수(constant)다. 그렇기에 리터럴 상수(Literal constant)라고도 불리는 것이다.
10과 100은 자체적으로 바뀔수도없고 변할수도 없는 그냥 10과 100이 되는것이다.
num = 10+100;
num = 50;
을한다고해서 10+100 이 50으로 바뀌는게 아니라 num이 50으로 바뀌는 것뿐이다.
10과 100은 여전히 그대로인 값이다.

C&C++에서는 그럼 어떤것들은 리터럴 상수로 정의할까.

정수 리터럴 값 : 1, 5, 100, 10023, 39342
실수 리터럴 값 : 1.84, 4.52, 0.524, 044412
문자 리터럴 값: "안", "녕", "A", "B", "C" 
문자열 리터럴 값 : "안녕하세요", "HI", "HELLO"

위에 보인것과 같은 것들을 상수로 정의한다. 





















2014년 10월 21일 화요일

C++ 참조자 소멸에 관하여

반환형이 참조형인 함수에서

참조자의 소멸에 대해 정확히 이해하자.









반환형이 int& 이고 매개변수를 int &ref로 받는 Reference 라는 함수가 정의되어있다.
(ref 값을 1증가 시킨후에 참조자 ref를 반환한다.)

메인 함수 

"참조형 반환 1" 부분을 먼저 보도록하자.

int &n2 = Reference(n1) 에서 n2는 Reference 함수에서 반환된 참조변수를 참조하게된다. 다시말해, n2 는 ref가 참조하고 있는 n1을 참조하는것과 같다.
따라서 n1과 n2의 값은 같기때문에 "참조형 반환 1" 의 결과를 보면 n2++ 를 했을때 n1의 값과 n2의 값이 함께 증가함을 알 수 있다.

다음

"참조형 반환 2" 부분을 보도록하자.
int p2 = Reference(p1) 으로 정의된 부분이다. Reference 함수에서 반환된 참조변수 ref를 int형 변수 p2에 저장하였다. 참조자가 아닌 일반 변수를 선언하여 반환값을 저장하여도 된다는 것을 알 수 있다. 이렇게 된다면 "참조형 반환 1" 과는 다르게 p1과 p2는 각각 별개의 저장공간과 값을 가진 변수가 된다. p2++후 출력결과를 보면 p1 과 p2 각각 다르게 값을 가지는것을 알 수 있다.


결론 :
반환형이 참조형인 함수를 이용했을때, 반환된 값을 어떻게 저장하느냐에 따라 결과가 다른 상황이 발생한다. 그러므로 잘 생각하여 사용하도록 하자.




처음 예제와는 다르게 반환형이 int 형인 함수를 정의하였다. RefEx() 함수를 통해 얻게된 반환값을 각각 int val2, int &val3 에 저장하였다. 그랬더니 &ref 에서 에러가 발생.



에러 문구는 "int에서 int &로 변환 할수 없다"
당연하다 RefEx() 함수를 통해 반환된 값 int형을 가진 ref는
참조자 ref가 아니라
참조자 ref가 가리키는 변수 val1의 값이다.

따라서 int val2 변수에는 저장이 가능하지만
int &val3 에는 저장이 불가능 하다.
왜냐면 int &val3 = 10 이 된단소린데, 상수(number)는 const형태가 아닌이상 참조자로 선언 할 수 없다.











2014년 10월 20일 월요일

C++ 템플릿 사용시 error LNK2019


책에서 배운 그대로 프로그래밍하였는데

왜 에러가날까?

바로 선언과 정의 파일을 나누어 만들었기 때문이다.


간단한 예를 보도록 하자.




<Pos.h> 헤더파일에서 선언을



<Pos.cpp> 파일에서 정의를


<test.cpp> 메인함수에서 실행


 보이는것과 같이 error LNK2019 에러 발생.

위 문제의 해결을위해 클래스 템플릿의 선언과 정의를 구분하지 않고 한곳에서 해보기로 하겠다.
Pos.cpp 파일을 제거후에 헤더파일에 주석(/*  */) 부분 제거후 재 실행.




<Pos.h> 선언과 정의를 한번에한 헤더파일



위에 사용한 메인함수와 같음(변경x)



<실행결과>  문제없이 컴파일이 되었다.


  • 결론
 " C++ (Template)템플릿을 사용하여 구현한 코드는 선언과 정의를 같은 파일에서 해야한다. 왜냐면 컴파일할때 템플릿 소스코드를 만들어내는데 이때 템플릿의 정의가 헤더파일과 Cpp 파일에 나뉘어져있으면 제대로 템플릿 코드가 생성되지 않을 수 있기 때문이다. (런타임시 소스코드를 만들어내는게 아님) "


물론 Cpp파일을 메인Cpp파일이 컴파일시 참조할수 있도록 include 해주면 되긴한다. 하지만 그냥 편하게 헤더파일 하나에다가 정의해서 쓰도록 하자. 귀찮다.