2013년 1월 21일 월요일

배열과 포인터의 차이점


int ar[n];
int *pi;

배열과 포인터의 차이점

1. 포인터는 변수, 배열은 상수
pi는 고유의 메모리를 차지하고 있고 언제든지 다른 대상을 가리킬 수 있지만 ar은 선언할때 그위치가 이미 고정되므로 다른 대상
을 가리킬 수 없다. ar로 오로지 배열의 선두 번지를 읽을 수 있을 뿐이며 이 선두 번지를 기준으로 하여 배열 요소를 읽는다.

2. pi가 가리키는 배열의 크기는 동적으로 결정할 수 있지만 ar이 가리키는 배열의 크기는 선언할 때 정적으로 결정된다.
동적 할당 예 pi=(int *)malloc(n*sizeof(int));
고정된 길이의 배열이 필요하면 int ar[n]; 선언문으로 배열을 생성하는 것이 편리하고 가변 길이의 배열이 필요하면 int *형의
포인터 변수를 선언한 후 malloc으로 할당해서 사용해야 한다. 포인터로 할당한 배열은 실행중에라도 realloc으로 크기를 재 할당하여
변경할 수 있다.

3. 배열은 인수로 전달 할 수 없고 포인터는 인수로 전달이 가능하다.
배열은 그 자체가 크기 때문에 함수의 인수로 전달할 수 없다. 포인터는 대상체가 무잇이든간에 4Byte의 크기밖에 차지하지 않으므로
함수로 전달할 수 있다. 그래서 배열을 함수로 전달할 때는 반드시 포인터를 사용해야 한다.

4. 배열로 요소를 읽는 것과 포인터로 대상체를 읽는 동작은 속도 차이가 있다.
배열의 첨자 연산은 매번 배열 선두에서부터 출발하지만 포인터는 대상체로 직접 이동해서 바로 읽으므로 액세스 속도가 빠르다.
*pi는 pi가 가리키는 곳을 바로 읽지만 ar[n]은 *(ar+n)으로 일단 번지를 더한 후 읽어야 하므로 조금 느리다.
대단한 속도 차이는 아니지만 대규모의 반복적인 루프에서는 이 속도차도 결코 무시 못할 정도로 크다.
대략 포인터가 배열보다 두 배 정도 빠르다.

2013년 1월 17일 목요일

연산자 오버로딩


연산자 오버로딩

1. C++에서 기본 자료형으로 사용하고 있는 연산자를 재정의 하는 것을 말합니다.

2. C++에서는 연산자 조차 함수로 취급하기 때문에 함수를 정의하는 방법과 동일한 방법으로
재정의할 수 있습니다.

3. 연산자를 함수의 형태로 오버로딩하기 때문에 재정의된 연산자를 연산자 함수(operator function)
라고도 합니다.

4. 연산자에 있어서 피연산자가 함수를 오버로딩할 때에는 전달인자로 구현됩니다.

5. 연산자를 정의할 때 전달인수의 자료형에 의해 그 연산자를 사용할 수 있는 자료형이 결정됩니다.

연산자 정의 기본 형식
반환형 operator 연산자(인수1,인수2,....)//연산자 함수는 함수 이름이 operator 로 정해져 있다.
{
함수의 본체 
}


사칙 연산자를 오버로딩할경우에는 함수 반환형이 연산 대상과 같은 클래스이고
관계 연산자와 논리 연산자의 경우 함수 반환형은 bool이다.



연산자의 오버로딩시 주의할 점

1. C++에서 이미 사용하던 연산자만 오버로딩할 수 있습니다. $기호는 C++에서 연산자로 사용되지 않습니다. 그 때문에 operator$() 함수를 정의할 수 없습니다.

2. 이항 연산자로 쓰이던 연산자는 오버로딩할 경우 이항 연산자로만 정의할 수 있습니다.이항 연산자란 피연산자가 2개입니다. 예를 들면 10%4와 같이 %연산자는 이항 연산자 형태로 사용하여야 합니다.

3. 단항 연산자로 쓰이던 연산자는 오버로딩할 경우 단항 연산자로 정의하여야 합니다. 단항 연산자는 피연산자가 1개인 연산자입니다. 예를 들면 ++ 연산자가 단항연산자 입니다.

4. C++에서 사용하는 연산자들중 다음 연산자들은 오버로딩할 수 없습니다.
조건연산자(?:)
멤버 참조 연산자(.)
범위 연산자(::)
sizeof연산자(sizeof)
.*
5. 재정의돈 연산자는 적어도 하나의 사용자 정의형 피연산자를 가져야 합니다. 이는 기본 자료형의 재정의를 막기 위해서입니다.

6. 대부분의 연산자는 멤버 함수 또는 프랜드 함수로 재정의할 수 있습니다. 그러나 다음 연산자는 멤버 함수로만 재정의 할 수 있습니다.
대입 연산자(=)
함수 호출 연산자(())
첨자 지정 연산자([])
멤버 참조 연산자(객체 포인터에 대한, ->)

2013년 1월 15일 화요일

재귀 호출


재귀 호출 : 자기 자신을 호출하는 형식

1.팩토리얼 연산 처럼 재귀적인 구조를 가지고 있을때 재귀 호출을 사용한다.
2.종료 조건을 명시하여 반환점을 명확히 지정해야 한다.

 예제
int Factorial(int n)
{
     if (n <= 1) {//종료 조건
          return 1;
     } else {
          return n*Factorial(n-1);//하단 풀이
     }
}

void main()
{
     printf("1~5까지의 곱=%d\n",Factorial(5));
}



//풀이
5*Factorial(4)
5*(4*Factorial(3))
5*(4*(3*Factorial(2)))
5*(4*(3*(2*Factorial(1))))
5*(4*(3*(2*1)))
5*(4*(3*2))
5*(4*6)
5*24
120


예제 출처 : http://www.soenlab.com/

2013년 1월 13일 일요일

객체 선언시 구조체처럼 초기화 하기?


  1. using namespace std;
  2.  
  3. class Complex
  4. {
  5. public:
  6.  int real;
  7.  int image;
  8. public:
  9.        //Complex();
  10.  void init();
  11.  void show();
  12. };
  13.  
  14. void main()
  15. {
  16.  Complex x={2,5};//속성을 public 로 선언하면 구조체와 같은 방법으로 초기화 가능
  17.  x.show();
  18.  
  19.  _getch();
  20. }
  21.  
  22. void Complex::show()
  23. {
  24.  cout <
  25. }
  26.  
  27. void Complex::init()
  28. {
  29.  real = 2;
  30.  image =5;
  31. }


//소스 출처 : C++ 언어 30일 완성

//위 코드를 컴파일 하면 정상적으로 real,image가 초기화가 된다.
//그런데 명시적으로 생성자 함수를 작성할경우.....
//"이니셜라이저 목록을 사용하여 비집합체를 초기화할 수 없습니다."라는 오류가 난다.
//왜 그럴까.......?

2013년 1월 12일 토요일

메모리 영역, 기억 클래스




메모리 영역이란 프로그래밍에 필요한 데이터가 저장되는 영역을 뜻한다.

메모리 영역은 크게 4가지가 있다

Code(Text) : 명령어(Instruction Code)
Data : 전역변수,static 변수
Stack: 지역변수,매개변수,리턴값 등 프로그래머 할당
Heap : malloc 함수에의해 런타임에 동적으로 할당되는 공간  



Data 영역
정적으로 선언된 함수도 포함된다.
상수,전역변수,정적 변수 등등

상수
ex) 1,2,3(숫자 그 자체),"안녕하세요"(문자열 상수)
변수명 앞에 const 가 붙은 변수들

정적(static) 변수의 특징
프로그램이 생성될때 같이 생성되어 프로그램이 종료 될때 소멸한다.
선언시 한번만 초기화 가능
함수 내부에 선언된 Static 변수는 프로그램이 실행 될 때 공간만 할당되고, 그 함수가 실행 될때 초기화 된다.
가) 초기화 된 데이터는 영역
나) 초기화 되지 않은 데이터 영역 BSS (Block Started Symbol)

*초기화 된 데이터 영역, 비초기화 된 데이터영역을 정적 데이터 영역이라 말한다

Stack 영역
지역변수를 저장하는 영역
코드 실행중 함수부분의 위치에 대해서도 저장
기본적으로 약 1MByte의 공간을 지난다.(1MByte == 1024KByte == 1024*1024Byte)
후입선출(Last In First Out)의 데이터구조를 가지고 있다(스택 정의)

Heap
Stack에 담지 못할 정도로 큰 변수를 생성하여 사용할 때 사용
사용자가 원하는 부분을 할당 받아 사용하기 때문에 사용자가 꼭 해제도 해주어야 한다.


*Code, Data, Heap 영역은 하위 메모리부터 할당되고, stack 영역은 상위 메모리부터 할당 된다.







기억 클래스

지정자            저장 장소                  선언위치          범위                 파괴시기              초기값

외부변수
(extern)           정적 데이터 영역      함수의 외부     프로그램 전체   프로그램 종료시      0

지역변수
(auto)              스택                        함수의 내부     함수의 내부       함수 종료시        초기화되지 않음

정적변수    
(static)            정적 데이터 영역      함수의 내부     함수의 내부       프로그램 종료시      0
                                                      함수의 외부     프로그램 전체   프로그램 종료시      0

register          레지스터                  함수의 내부     함수의 내부       함수 종료시         초기화되지 않음