본문 바로가기

Programming/C&CPP

C/C++ 포인터 기본 C/C++에서 포인터는 처음에 이해하기 어려운 개념입니다.메모리의 어느 지점을 가리키는 포인터때문에 C/C++에 흥미를 잃고는 합니다.사실 포인터는 하나의 타입일 뿐입니다.C를 처음 공부할 때 쓰는 scanf()를 사용할 때는 printf()와는 다르게 변수명 앞에 &를 붙입니다. 이 &가 변수의 주소값을 나타내다는 것을 알고 있습니다.포인터는 바로 이런 메모리의 주소를 저장하는 타입입니다.변수는 메모리의 영역에 붙어있는 이름입니다. 변수가 선언되면 다음과 같이 메모리 영역이 확보가 됩니다.int형 변수를 선언하면 이렇게 4바이트의 메모리가 할당됩니다.포인터의 선언은 타입명* 변수명;의 형태로 선언합니다.포인터는 흔히 후라이팬과 손잡이로 표현이 많이 되곤 합니다.후라이팬의 중심부는 실제 할당된 메모리로 .. 더보기
64비트 Windows 환경에서의 int 사이즈 일반적으로 32비트 환경에서와 64비트 환경에서 int, long 형의 크기가 달라지는 것으로 생각을 합니다. 32비트에서는 32비트인 4바이트, 64비트에서는 8바이트로 변경되는 것으로 알고 있지만 실제로는 int, long형은 Windows 환경에서는 4바이트로 동일한 크기입니다. Linux 환경에서는 long형만 8바이트로 변경된다고 합니다.int가 4바이트기 때문에 실제 8바이트의 int를 사용하기 위해 Windows에서는 __int64를 사용하시는 것이 좋습니다.또한 4바이트 int인 __int32도 정의되어 있습니다.그렇기 때문에 정확한 구분이 필요하다면 __int64와 __int32를 구분해서 사용하면 됩니다.64bit와 32bit에 따라서 8바이트에서 4바이트로 크기가 변경되는 타입은 포인.. 더보기
C++ 동적 할당 new / delete 사용시 주의점 C++은 메모리 관리가 상당히 까다로운 언어입니다.사용자가 메모리의 동적 할당과 해제를 할 책임이 있기 때문입니다. 조금만 실수하면 메모리 누수나, 메모리 접근 위반으로 프로그램이 강제 종료됩니다.메모리 누수란 프로그램이 종료되기 전에 할당한 모든 메모리가해제가 되어야 하는데할당된 메모리가 해제가 되지 않을 때 발생하는 문제입니다.메모리 접근 위반은 초기화되지 않은 포인터 혹은 할당된 범위 밖을 호출할 때 발생합니다.초기화되지 않은 포인터는 어떻게 작동할 지 예측을 할 수 없습니다.대부분의 경우는 프로그램이 강제 종료됩니다. new 사용하여 메모리를 동적 할당할 시에 주의할 점은 다음과 같습니다.new는 delete로 해제하고, new[]는 delete[]로 해제해줘야 한다는 것입니다.간단한 규칙으로 보.. 더보기
ASCII 코드표 유니코드로 프로그램을 작성하는 습관을 기르는 것이 더 좋지만 현재에도 ASCII는 많이 쓰이고 있습니다.그리고 가끔 ASCII코드가 필요할 때가 있습니다.기본적으로 대문자 A는 65, 소문자 a는 97이라는 것 정도는 알아두면 좋습니다. 그리고 97에서 65를 뺀 32값은 공백(Space)입니다.아스키 문자집합은 영미권에서 문자를 표현하기에 적합한 문자입니다.영어의 몇 개 안되는 문자를 표현하기에는 1바이트만 갖고도 충분하기 때문이죠.실제는 7비트만 사용되서 보통 128개의 문자를 사용합니다.그 중에는 제어를 위한 문자도 포함이 되어 있습니다.아스키 코드로는 다양한 문자들을 수용할 수 없기 때문에 유니코드를 사용하는 것이 좋습니다.아스키 코드를 그대로 가져가는 유니코드 방식으로 UTF-8같은 형식도 존재.. 더보기
GUID(Global Unique Identifier) GUID는 Global Unique Identifer라는 용어의 약자로 응용 소프트웨어에서 사용하는 유사난수라고 합니다.이 숫자가 안 겹칠 확률이 100%는 아니지만, 거의 100%로 봅니다.2의 128승이라는 엄청나게 큰 수를 난수로 만들기 때문입니다.2128 = 3.4028×1038이라고 하니, 0이 최소 30개 이상은 뒤에 붙습니다.GUID의 유일성을 이용하는 것이 COM(Component Object Model)입니다.COM은 DLL 지옥을 해결하고자 나온 기술입니다.COM은 참조해야할 함수를 실행시간에 결정하게 해주는데 이것을 가능하게 해주는 것이 가상 함수 테이블입니다.가상 힘수에 대해서는 아래의 링크를 참조하시기 바랍니다.2014/12/03 - [Programming/C&C++] - 다형성과.. 더보기
재귀 함수 & 재귀적 함수호출(recursive function call) C언어든 C++을 공부하는 사람이라면 재귀 함수라는 용어 한 번정도는 들어봤을 것입니다.재귀적 호출은 함수가 자기 자신을 호출하는 호출 방식입니다.MIT 컴퓨터 프로그래밍 입문 교재인 SICP에는 재귀적 호출을 다음과 같이 이해하게 합니다.1. Wishful Thinking('내가 하려는 작업이 이미 있다.' 라고 생각)2. 문제를 작게 자른다.3. 더 이상 자를 수 없는 부분(base)만 처리재귀적 함수 호출을 이해하기 충분한 문장이라고 생각합니다.(프로그래밍에 대한 기본 개념을 익히는 데는 참 좋은 책인 거 같습니다.)그럼 더 자세히 알아보도록 하겠습니다.재귀 함수를 이해하는 데 가장 좋은 예는 역시 Factorial을 구하는 문제가 아닌가 싶습니다.Factorial이 널리 쓰이는 이유는 간단한 연산.. 더보기
함수 오버로딩(overloading)과 오버라이딩(overriding) C++을 배우면서 이 단어들을 들어 보지 못한 사람은 아마 없을 것입니다.단어가 비슷하기 때문에 처음 배우면 개념이 상당히 헷갈리기도 합니다.간단하게 오버로딩과 오버라이딩을 정의해보면 다음과 같습니다.오버로딩은 함수의 중복 정의, 오버라이딩은 함수의 재정의1. 오버로딩(Overloading)오버로딩은 다음과 같습니다. #include using namespace std; void func(int i) { cout 더보기
다형성과 가상함수 상속에서 중요한 사실은 부모는 자식을 가리킬 수 있다는 것입니다. 즉, 부모 클래스 B가 자식 클래스 D를 가리킬 수 있다는 말입니다.하지만 이런 방법은 부모에 없는 자식 멤버는 사라진다는 문제점이 있습니다.부모가 수용할 수 있는 것이 없기 때문에 버려지게 되는 것입니다.그리고 역으로 B = D는 될 수 있지만 D = B는 성립하지 않습니다.다음의 코드를 보도록 하겠습니다. #include using namespace std; class Base { public: void Output() { cout 더보기