더듬이의 헬로월드

Hello, World!

728x90

프로그래밍 언어/C++ [기본] 29

[C++기본] 28.연결 리스트

연결 리스트란? 연결 리스트는 가변 배열과 뭐가 다를까? 가변 배열은 힙 메모리 공간에 동적 할당을 통해, 일정 크기만큼 사용하는 연속적인 메모리 구조이다. 하지만 연결 리스트는 딱 하나의 메모리만이 들어갈 공간만 만든다. 이는 연속적이지 않은 구조를 가지고 있다. 즉, 3번째 데이터를 찾고 싶다면, 첫번째 데이터부터 각 데이터들이 가진 포인터를 이용해 2번 이동해 3번쨰 위치까지 가는 것이다. 이떄, 이 하나 하나의 구조들을 NODE,노드라고 한다. 노드 하나 하나에는 데이터와 다음 노드로 가는 주소도 같이 들어있다! 이렇게 구성 되어 있을 것이다. 이 노드들의 구성 방식에 따라 대표적으로 세 가지 종류의 연결 리스트가 있는데, 단일 연결 리스트 각 노드가 다음 노드만을 기리키는 일반적인 형태의 연결 ..

[C++기본] 27.가변 배열

기존 배열의 문제점 int b; cin>>b; int arr[b]; 위 두 코드는 정상적으로 실행될까? 안된다면, 그 이유는 무엇일까? b는 사용자의 입력에 따라, 10이 될 수도, 100이 될 수도 있다. 그리고, arr의 사이즈는b에 따라 결정된다. 문제는, 이게 런타임 중에 동작한다는 것이다. 이 배열은 지역변수, 스택 메모리 영역에 생성된다. 그럼, 함수가 실헹 될 떄, 메모리를 얼마나 잡아야 하는지 모를 것이다. 크기를 가늠할 수가 없기 때문이다. 그래서 우리는 그때 그때 크기가 늘어나고, 줄어드는 가변 배열을 만들고 싶은 것이다. 가변 배열 자료형 가변 배열을 위한 자료형을 만들어 보자. 첫번째로, 이 가변배열에 데이터를 저장할 곳을 만들어 주어야 한다. typedef struct Holymo..

[C++기본] 26.동적 할당

메모리 영역 오늘 소개하는 동적 할당은 힙 영역에 관련된 이야기다. 우리는 여태 만든 변수들은 모두 스택 영역이나, 데이터 영역만 사용했다. 하지만, 프로그램이 실행되어야지만 알 수 있는 변수가 있을까? 예를 들어, 내가 엔터를 칠 때 마다 변수를 하나씩 생성하고 싶다면? 내가 엔터를 치지 않으면 하나도 생성되지 않을 것이고, 10번 엔터키를 입력한다면 10개의 변수가 생일 것이다, 이거, 가능할까? 동적인 메모리 할당 실행 중인 , 즉 런타임 도중 대응이 가능한 것을 동적 메모리 할당이라고 한다. 이는 코드에 선언하고, 프로그램 실행 전에 이미 만들어 놓은 변수들은 정적인 메모리 영역을 사용하기 떄문에 ,어떠한 변수도 힙 메모리 영역을 사용하지 못한다. 그럼 동적 할당은 어떻게 하나? 그래서 포인터라는..

[C++기본] 25.구조체 포인터

구조체의 멤버 typedef struct Test { int a; float b;//멤버 }Myst; 일단 구조체의 형식을 다시 생각해보자. Myst라는 자료형을 내가 만든 것이다! Myst t1; t1이 곧 Myst라는 형식의 변수가 되는 것이고, Test 안에있는 a,b는 변수가 아닌 멤버(구조체의 멤버)가 되는 것이다. t1.a; 즉, 이것은 t1이라는 변수의 a를 지칭하는 말이다. 구조체와 포인터 Myst s; Myst *Pointer=&s; 그럼 구조체를 가리키는 포인터는 어떻게 계싼될까? 구조체는 하나의 자료형으로 묶여있기 때문에 int 4바이트, float 4바이트, 총 8바이트로 계산되는 포인터 변수가 나올 것이다. 그럼 각 멤버에 접근은 어떻게 해요? (*point).a = 500; (*..

[C++기본] 24.문자열-5

문제. wcscmp함수 만들기 wcscmp는 두 문자열을 입력받고, 이를 사전순으로 비교해서 같으면 0, 첫번째 문자열이 빠르면 -1, 두번째 문자열이 빠르면 1를 반환하는 함수이다. 이 함수는 어떻게 구현하면 좋을까? 필요한 프로세스 1.입력받는 두 문자열의 길이를 구한다. 2.첫번째 문자부터 비교해 나가며 크기를 비교한다. 3.같으면 다음문자, 다르면 비교 후 -1 or 1 출력! 4.끝까지 같다면, 문자열의 길이 를 비교해서 -1 or 1 출력! 5.문자열의 길이까지 같다면, 0출력! int cmpcmp(const wchar_t* left, const wchar_t* right) { //수정할 필요가 없는 함수이다! 상수화 시켜주기 int leftlen = GetLength(left); int ri..

[C++기본] 23.문자열-4

함수 오버로딩이란? void Test(int a){ } void Test(int a,int b){ } void Test(int a, float b){ } 같은 함수 이름이라도, 매개변수의 개수나 자료형을 구분하여 각 해당되는 함수가 호출되는 것을 함수 오버로딩 이라고 한다. 즉, Test(5); Test(5,10); Test(5,15.54); 같은 이름의 함수라도 각 다른 함수를 호출하는 것이다! 문자열 이어 붙이기 함수 직접 만들기 문자열-3에서 포스팅했던 함수 wcscat_s도 오버로딩 된 함수이다. 매개변수를 3개받는 경우도 있는데, 이 경우의 함수를 만들어보자. void StrCat(wchar_t* pDest,unsigned int Size,const wchar_t pSrc){ } 일단 원본 문자..

[C++기본] 21.문자열-2

char의 크기가 1바이트라면, 한글은 어떻게 표현될까? char의 크기는 1바이트, 아스키 코드 기준 127개를 표현한다. 근데 생각해보면 한글을 조합하면 127은 거뜬히 넘어갈텐데, 어떻게 표현될까? 멀티바이트 방식의 문자 표현 char test[15]="abc한글123"; 'a' 'b' 'c' 와 '1' '2' '3' 은 1바이트, '한' '글' 은 2바이트가 할당되었다. 이처럼 상황에 따라서 할당되는 공간이 다르다면 멀티바이트 방식이라고 한다. 이는 현재 잘 쓰지 않고 있다. 호환성의 문제 떄문에 마이크로소프트의 윈도우에서 잔재되어있는 시스템. 표준으로 쓰이지 않는 방식이다. 와이드바이트 시스템, UNICODE 모든 문자를 2바이트로 표현하는 방식이다. 유니코드 문자셋을 사용하는 것이 많은 기기와..

[C++기본] 20.문자열-1

문자을 배열로 선언한다면? ⇒문자로 이루어진 배열 == 문자열 문자열의 초기화는 일반 배열과는 조금 다르다. int arr[10]={1,2,3,4,5,6}; 일반 배열은 이처럼 괄호 안에 넣어주었지만, char ch1 = 'a'; wchar_t ch2 = L'b'; char ch3[10] = "ABCDEFG"; wchar_t ch4[10] = L"ABCDEFG"; 문자열은 쌍따옴표 안에 적으면 된다! char은 1바이트, wchar_t는 2바이트의 공간을 차지한다. wchar_t를 이용하면 초기화시 L을 붙여야 한다. 어떻게 이게 가능할까? 다음과 같은 코드가 있다. const wchar_t* pchar=L"abcdef"; 주소값만 들어갈 수 있는 포인터 변수에 문자열이 들어갔다는 것은 어떤 의미를 가질..

728x90