2012년 1월 23일 월요일

Part1 (1장+2장) C기반의 C++

열혈강의 C++프로그래밍을 읽고, 주관적으로 기억이 잘 안난다거나, 중요하게 생각하거나, 참조할만한 내용을 정리해서 올린 내용이다.

08년도에 구입해서 앞부분은 최소 4번이상 읽었으니 우려먹을만큼 우려먹은 책이다..
앞부분은 기본적인 내용뿐이고, 이미 알고있는 내용이 8할이다. 때문에 남은 2할때문에 다시보는 일을 피하고자 2할부분만 정리해 놓고자 한다.
각설하고, 시작하자.



1-1 printf()와 scanf()를 대신하는 입/출력 방식
  • endl을 출력하는 경우 추가로 출력버퍼를 비우는 효과도 얻게 된다.
  • <iostream.h>과 <iostream>의 차이는 C++표준에 존재하던 일부 내용이 변경되었고, 구버전의 헤더파일과 신버전의 헤더파일 구분을 뜻한다.
  • cin에서 input data간의 경계는 공백(탭, 스페이스바, 엔터)에 의해 나눠진다.
1-2 함수 오버로딩
  • C컴파일러는 호출하고자 하는 함수를 찾을 때 오로지 함수의 이름 정보만을 가지고 찾는다. 하지만 C++컴파일러는 이름뿐 아니라 매개 변수의 정보까지도 참조한다.
  • 리턴 타입만 달라서는 함수가 오버로딩되지 않는다.
1-3 디폴트 매개변수
  • 함수헤더가 'int func(int a=0)'과 같이 변수를 0으로 선언하는 것이 디폴트 매개변수
  • 위와 같이 정의된 함수는 func() == func(0)이 같은 의미를 지닌다.
  • 함수 선언이 함수 정의 이전에 존재하는 경우 디폴트 매개변수는 선언부에 놓여져야 한다.
  • 'int func(int a=0)'함수와 'int func(void)'함수가 공존하게되면 func()호출시 Ambiguous 에러가 난다.
1-4 인-라인(in-line) 함수
  • 매크로(#)에 의해 전처리 과정에 의해 변경된 소스코드가 입력된다.
  • C++기반 함수 in-line화 : 'inline int SQUARE(int x)' 이와 같이 사용한다.
  • 매크로를 이용한 함수의 inline화는 전처리기에서 일어난다.
  • 키워드 inline을 이용하면 컴파일러에 의해 처리된다. (컴파일러판단에 따라 성능 저해로 판단되면 inline화를 무시하기도 한다.)
1-5 Namespace
  • 'namespace 이름 {}'으로 특정 영역(공간)의 범위를 지정하고 이름을 붙여준다.
  • 이름공간(namespace)이 다르면 같은 이름의 변수나 함수의 선언이 허용된다.
  • 이름공간::함수명(혹은 변수명)으로 접근 가능
  • 'using namespace 이름;'을 통해서 ::접근 없이 특정 이름공간을 사용할 수 있다.
  • 전역변수에 대한 접근의 경우 '::변수명'으로 접근이 가능하다.(지역변수에 같은 이름의 변수가 존재하는 경우 유용)
2-1 들어가기에 앞서서
   Const 위치에 따른 의미 파악
   :const int n=10;의 경우 n의 값은 상수로 취급되어 n의 값은 더이상 값의 변경이 불가하다.

                              지칭대상 변경여부         지칭대상의 값 변경여부
const int* n;                        O                                      X
int* const n;                        X                                      O
const int* const n;              X                                       X 

2-2 bool 자료형
  • 최근 표준에서는 bool자료형이 C언어 표준에도 포함되었다.
2-3 Reference의 이해
  • 레퍼런스의 선언 :  int &ref = val (val이 int형 변수라 가정)
  • 레퍼런스 선언이란 이름이 존재하는 메모리 공간에 하나의 이름을 더 부여하는 행위
  • 레퍼런스와 변수는 생성되는 방법만 차이 있을뿐 생성된 후에는 완전히 같은것이다.
  • 레퍼런스는 선언과 동시에 반드시 초기화 시켜줘야 한다.
2-4 Reference와 함수
  • 포인터를 이용한 Call-by-Reference, 레퍼런스를 이용한 Call-by-Reference 
  • 포인터를 이용한 경우    : 함수호출부를 보고 Call-by-Ref 인지 확인 가능, 잘못된 포인터연산으로 에러발생.
  • 레퍼런스를 이용한 경우 : 함수호출부만 보고 Call-byRef 파악불가, 주소값연산걱정이 없다.
2-5 레퍼런스를 이용한 성능 향상
  • Call-by-Value의 경우 매개변수의 메모리를 새로 할당하기 때문에 매개변수의 용량이 큰 경우 부담될 수 있다. 이런 경우 레퍼런스로 받게되면 메모리 성능을 향상시킬 수 있다.
  • 레퍼런스를 사용하는 경우 실수로 함수 내부에서 값의 변경이 일어난 경우 프로그램전체에 영향을 미칠 수 있다. 이런 경우을 예방하기위해 매개변수를 const로 받아오면 된다. : 'void showData(const Person &p)' Person은 덩치가 큰 Class
2-6 Reference를 리턴하는 함수의 정의
  • 레퍼런스와 타겟 변수는 완전 같기때문에 똑같이 사용하면 된다.
  • 단, 지역변수는 레퍼런스로 리턴해 줄 수 없다.(지역변수는 함수의 종료와 함께 사라지기 때문이다.)
2-7 new와 delete
  • C++에서 new 연산자가 메모리 할당에 실패했을 경우 bad_alloc 예외를 발생시킨다. (구체적인 설명은 13장에서...)

댓글 없음:

댓글 쓰기