strcpy(a, b);

문자열을 복사하는 함수

b의 문자열을 a에 복사한다. 그리고 a의 값을 리턴한다.

하지만 strcpy 함수는 오래된 함수이기 때문에 잘못 사용하면 버퍼 오버플로우가 발생할 수도 있다.

그래서 오버플로우를 막기 위해 나온 것이 아래의 함수이다. 

 

strcpy_s();

사용법은 strcpy 함수와 동일하다.

 


strlen();

문자열의 길이를 반환하는 함수

 

ex)

int a[100] = "Hello"

int b = strlen(a);

cout << b;

 

출력값 : 5

(주의할 점은 a 배열에 실질적으로 잡혀있는 크기는 6이다. 문자열의 끝을 알리는 '\0'가 포함되어 있기 때문이다.

즉 strlen 함수는 '\0'를 제외한 나머지 문자열의 크기를 반환한다.)

 


sizeof();

자료형의 크기를 반환하는 함수

 

ex)

int a[100] = "Hello"

int b = sizeof(a);

cout << b;

 

출력값 : 100

 


strcat(a,  b);

두 문자열을 하나로 붙여주는 함수

a 문자열에 b 문자열을 붙인다.

 


strcmp(a, b);

두 문자열을 비교하는 함수이다. 

두 문자열이 동일하다면 0을 리턴하고

두 문자열 다르다면 비교해서 a가 b보다 클 시 1을 리턴하고 

작을 시 -1을 리턴한다.

 


 

'프로그래밍 언어 공부 > C++' 카테고리의 다른 글

객체지향의 개념 정리  (0) 2022.06.16
알고리즘 연습문제  (0) 2022.06.11
Text RPG ver.2 (포인터, 참조 등 활용)  (0) 2022.06.08
참조  (0) 2022.06.02
포인터와 간접 멤버 연산자  (0) 2022.05.31

변수명 등을 한 번에 수정하기

1-0

1-0 이미지와 같이 수정하고 싶은 변수명을 선택하고 

Ctrl + r + r을 누르면 한 번에 수정할 수 있다.


한 번에 주석 처리 하기

원하는 범위만큼 드래그를 하고 

Ctrl + k + c를 누르면 한 번에 주석 처리가 가능하다.


헤더 파일에서 함수 등을 선언한 후, 빠르게 구현부 만들기

헤더파일 내에 선언한 함수 등에 커서를 올려놓고 

Ctrl+.(점)을 누르면 cpp 파일내에 구현부 선언이 자동으로 채워짐


 

배열

배열이란?

연관된 데이터를 하나의 그룹으로써 관리하기 위해 사용되는 데이터 타입이다.

 

1-0 코드
1-1 메모리

 

1-0 코드 이미지를 보면 구조체를 이용해서 3가지 변수를 선언하고 초기값을 지정해주었다.

선언한 구조체 타입으로 10의 크기를 가지는 배열을 선언하였다.

그리고 메모리를 열어봐서 선언된 배열이 어떻게 메모리에 저장되는지 확인해보았다.

선언된 배열은 1-1 이미지와 같이 특정 공간에 10의 크기만큼 할당되어 저장되는 것을 확인할 수 있다.

 

여기서 중요한 것은 배열의 [이름]은 일반 변수의 [이름]과 다르다.

일반 변수의 이름은 특정 공간의 이름이었지만 

배열의 이름은 배열의 시작 주소를 의미한다.

즉 1-0 코드에서 monsters 자체가 monsters 배열의 시작 위치를 가리키는 포인터와 같다

 

 

2-0 코드
2-1 결과

 

2-0 코드 이미지를 보면 monsters 자체가 배열의 시작 주소이기 때문에 포인터로 선언한 변수에 넣어서

사용이 가능하다. monsters 안에 있는 두 번째 배열 공간으로 접근하기 위해 + 1 연산을 해주었다.

 

포인터에 사용이 가능하기 때문에 당연히 참조에도 사용이 가능하다.

 

 

3-0 코드
3-1 결과

 

이번에는 참조를 사용하여 배열의 값을 수정했다.

배열의 세 번째 공간으로 이동하기 위해 + 2 연산을 해주었고 

포인터일 때는 주소 값을 넣어주면 됐지만 참조는 주소 값이 아닌 주소 안으로 이동해서 

별칭을 붙여줘야 하므로 연산 결과에 포인터를 붙여줬다. 

 

하지만 참조는 3-0의 방식보다 좀 더 가독성이 좋게 수정할 수 있다.

 

3-2 코드

 

참조이기 때문에 주소 값이 아닌 원본 데이터를 넣어주어야 하고 

인덱스를 이용해서 쉽게 표현할 수 있다. 

즉 monsters[2] == *(monsters + 2)이라는 소리이다.

 


 

내용 추가

 

+ 배열을 함수의 인자로 넘기면 컴파일러가 자동으로 포인터로 치환한다.

+ 배열의 크기를 지정해줄 때는 항상 상수값만 가능하다.

참조

 

참조란 C++에 있는 문법으로써 기능적으로 포인터와 동일한 역할을 한다.

 

1-0 코드
1-1 코드 결과

1-0 이미지와 같이 포인터는 변수의 주소 값을 저장하고 해당 주소 값을 이용해서

주소 값 안에 데이터를 수정하거나 주소 값 자체를 조작할 수 있다.

 

이와 동일한 역할을 하는 '참조'는 로우 레벨 언어 측면에서 보면 포인터와 동일하게

해당 주소값을 받아서 원본 데이터를 수정하는 역할을 한다. 

 

하이 레벨 언어 측면에서 보면 포인터는 주소를 직접 저장하는 반면 참조는 특정 변수에 

별칭을 지어주는 느낌으로 이해하면 된다. 

 

다른 예시를 통해 좀 더 살펴보자.

 

2-0 코드
2-1 코드 결과

 

구조체 Info를 선언하고 초기값을 설정해주었다.

그리고 매개변수를 포인터로 선언하는 함수와 참조로 선언하는 함수가 존재한다는 것을

미리 선언해주었다.

 

메인 함수에서 Info 구조체를 이용할 qqq 변수를 선언하고

각 함수를 호출하면서 동시에 해당 함수에 의해 변화되는 qqq의 값을 확인하기 위해 출력문을 중간중간 넣었다.

함수를 호출할 때 포인터 매개변수를 가지는 함수는 주소값을 전달해주기 위해 & 타입을 앞에 붙여줬지만

참조는 &를 붙여줄 필요가 없기 때문에 변수를 그냥 매개값으로 넣어주었다.

 

이제 미리 선언했던 각 함수를 상세 정의해야 한다.

먼저 포인터 함수를 먼저 정의했고 간접 멤버 연산자(->)를 이용해 원본 데이터의 값을 각각 수정해주었다.

 

두 번째 함수인 참조 함수는 포인터와 똑같은 기능적 역할을 한다. 로우 레벨 측면에서 보면 

동일하게 해당 주소를 가져와서 원본 데이터를 수정하는 방식이다. 하지만 우리 눈에는(하이 레벨 언어 측면) 포인터보다

훨씬 간단하고 편하게 사용할 수 있다는 장점이 있다. 

 


주의할 점

 

참조는 보는 바와 같이 포인터와 동일한 기능 및 역할을 하고 포인터보다 훨씬 간편하고 쉽게 사용할 수 있다는

장점이 있지만 조심할 점은 포인터와 완벽히 동일한 것은 아니다. 

 

포인터는 아무런 값도 가지지 않고 존재할 수 있지만, 즉 NULL 값을 가질 수 있지만

참조는 무조건 특정 값을 가지고 있어야 한다. 

 

또한 코드를 잘 모르는 다른 사람이 보기에 참조는 원본 데이터를 수정하는지 아닌지 헷갈릴 수가 있다.

원치 않게 원본 데이터가 훼손될 수도 있다는 것이다.

 

이것의 해결방법으로는 상수 화가 있는데 여기서도 포인터와 차이점이 있다. 

 

포인터는 상수화 const를 * 앞에 붙이냐 뒤에 붙이냐에 따라 상수화가 달라진다. 

* 앞에 const가 붙었을 경우 해당 주소에 있는 원본 데이터가 상수화된다. 

* 뒤에 const가 붙었을 경우 해당 주소 값이 상수화 된다.

 

반면 참조 같은 경우 & 앞에 붙이는 것 밖에 할 수 없으며 원본 데이터가 상수화 된다.

 

둘의 비슷한 기능을 하기 때문에 실제로 둘 다 많이 사용되는 문법이다.

상황에 따라 융통성 있게 사용하면 좋을 것 같다.

 

 

포인터

 

C++에서의 포인터 개념은 C언어와 크게 다르지 않다. 

포인터는 주소를 사용한다. 

주소를 사용하는 이유는 우리가 특정 메모리 공간에 있는 값을 다른 장소에서

수정할 수 있도록 하기 위해서 사용한다.

 

1-0

1-0 이미지와 같이 기존에는 main 함수 내에 지역변수로써 선언된 a 변수 값과 

aaa 함수 내에 매개변수로써 선언된 a 변수 값이 저장된 공간이 다르기 때문에 

aaa 함수 내에서 a 변수(매개변수)에 값을 바꾸더라도 main 함수 내에 있는 a 변수(지역변수)에 영향을 미치지 않는다.

결괏값은 당연하게도 1이 출력된다.

 

하지만 포인터를 사용하면 얘기가 달라진다.

1-1

1-1 이미지에서 12번 라인을 보면 

aaa 함수를 호출하고 매개 변수로써 a 변수(지역변수)의 주소 값을 주었다.

해당 주소 값을 저장하기 위해 aaa 함수의 매개 변수를 포인터 변수로써 선언하였고 

6번 라인에 *a와 같이 해당 주소 안으로 이동하여 100이라는 값을 넣어주었다.

 

즉 main 함수 안에서만 사용할 수 있던 지역 변수를 main 함수 밖에서 접근하여 값을 

수정해준 것이다. 결괏값은 1-0 이미지 때와 다르게 100이 나온다.

 

다시 한번 정리하면

int number = 1;

int* a = &number; > 주소를 저장하는 바구니를 선언하고 해당 바구니에 number의 주소를 저장한다.

*a = 100; > 저장된 주소 안으로 이동해서 100이라는 값을 넣어준다.

 

최대한 간단하게 정리해보았다.

 


간접 멤버 연산자

 

2-0

 

2-0 이미지에서 보이듯 간접 멤버 연산자는 " -> " 로 표현한다.

해당 연산자는 간접 연산자(*)와 구조체의 특성을 동시에 표현할 수 있다.

 

우선 구조체를 struct 명령을 통해 정의하고 메인 함수 내에 해당 구조체를 사용하기 위해

hello를 선언했다.

 

이후 포인터를 이용해 해당 hello 구조체 변수의 주소를 Hello에 저장하였고

포인터로 주소 내부에 접근해 값을 수정해주었다.

 

마지막으로 간접 멤버 연산자를 이용해 포인터로 값을 수정했을 때보다 간편하게 표현하였다.

20, 21번 라인과 29, 30번 라인은 동일한 동작을 하는 명령이다.

 

2-1 결과값

 

구조체란

여러 자료형을 가진 변수들을 하나로 묶어 새롭게 정의해서 사용할 수 있는 사용자 정의 타입이다.

실습을 통해 구조체를 이해해보자

 

1-0 구조체 실습

 

우선 struct 명령을 이용해서 구조체를 정의해준다.

struct [구조체명]

 

구조체 안에는 int타입뿐만 아니라 다양한 타입들의 변수들이 포함될 수 있으며 

해당 변수들을 구조체 멤버라고 한다.

 

구조체명을 이용해서 구조체 변수를 정의할 수 있다. 

선언한 구조체 변수를 통해 구조체 멤버를 사용할 수 있다.

 

1-0 이미지와 같이 필자는 player와 monster라는 구조체 변수를 선언하였고 

해당 구조체 변수를 통해 구조체 멤버 type에 각각 정수를 저장하고 출력하는 코드를 만들었다.

 

 

 

 

 

 

공부했던 내용을 바탕으로 직접 Text RPG 코딩을 해보았다. 

포인터는 아직 배우지 않아서 사용하지 않았다.

'프로그래밍 언어 공부 > C++' 카테고리의 다른 글

포인터와 간접 멤버 연산자  (0) 2022.05.31
구조체  (0) 2022.05.30
함수 매개변수 기본값 설정 / 오버로딩 개념  (0) 2022.05.29
함수와 스택 프레임  (0) 2022.05.27
열거형  (0) 2022.05.26

+ Recent posts