일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 정보처리기사필기
- JSP/Servlet
- rnn
- CSS
- 자바스크립트
- 자바
- 연습문제
- 중학수학
- JDBC
- 자바스크립트심화
- ChatGPT
- 머신러닝
- 혼공머신
- 컴퓨터구조
- 정보처리기사실기
- 컴퓨터비전
- 순환신경망
- SQL
- c언어
- 개발일기
- 파이썬
- JSP
- 데이터분석
- 중학1-1
- 디버깅
- 데이터베이스
- 상속
- 딥러닝
- 자바 실습
- html/css
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
복합 데이터형 2 : string 클래스 본문
이 단원부터는 공부한 흔적이 하나도 없어서 학습 속도가 이전보다 더 느릴 것 같다. 오후가 되니 공부하기가 싫어지고 슬슬 지쳐간다. 놀고 싶기도 하고 오늘 공부는 여기서 마치고 싶은 마음이 많지만 그래도 조금만 더 힘을 내서 버텨보기로 했다. 딱 한 소장만 공부해 보기로 하며 책상 앞에 다시 앉아본다. 이럴 때는 재미있는 거라도 보는 게 공부가 더 잘되는 것 같기는 하다.
이번 포스트에서는 string 클래스에 대해서 학습해볼 예정이다. C++ 표준은 string 클래스를 추가하여 C++ 라이브러리를 확장시켰다. string 클래스는 배열보다 사용하기가 쉽다. 문자열을 하나의 데이터형으로 나타내는 좀 더 그럴듯한 표현을 제공한다. string 클래스를 사용하려면 프로그램에 string 헤더 파일을 포함시켜야 한다.
3. string 클래스
예제 7번 : strtype1.cpp
string 객체와 문자 배열의 가장 큰 차이점은 string 객체를 배열이 아니라 단순한 변수로 선언하는 것이다.
이 클래스 설계는 크기 문제를 프로그램이 자동으로 처리하도록 허용한다. 예를 들어, str1 선언은 길이가 0인 string 객체를 생성한다.
대입, 결합, 추가
stirng 클래스는 배열보다 조작이 간단하다. 예를 들어, 하나의 배열을 다른 배열에 간단하게 대입할 수 없지만, 하나의 string 객체를 다른 string 객체에 간단하게 대입할 수 있다.
char charr1[20]; // 빈 배열을 생성한다
char charr2[20] = "jaguar"; // 초기화된 배열을 생성한다
string str1; // 빈 string 객체를 생성한다
string str2 = "panther"; // 초기화된 string 객체를 생성한다
str1 = str2; // 객체를 대입
string 클래스는 문자열 결합을 간단하게 처리한다. +연산자를 사용하뎌 두 개의 string 객체를 하나도 결합할 수 있고, += 연산자를 사용하여 기존의 string 객체 끝에 또 다른 string 객체를 덧붙일 수 있다.
예제 8번 : strytype2.cpp
string 클래스의 조작
strcat() 함수를 사용하여 문자열을 문자 배열에 추가할 수 있다.
예제 9번 : strtype3.cpp
string 클래스는 필요하면 크기를 자동으로 조절하여 배열에 인접한 메모리를 침범하는 문제를 피한다. C 라이브러리는 strcat(), strcpy()와 같은 계통으로 strncat(), strncpy()를 제공한다. 이들은 타깃 배열의 최대 허용 크기를 나타내는 세 번째 매개변수를 제공함으로써 더 안전하게 동작하지만, 그들을 사용한다는 것은 프로그램을 작성할 때 한츰 복잡하다는 것을 의미한다.
문자열에 있는 무자들의 수를 구하는데 서로 다른 문법이 사용된 것에 주목하라.
int len1 = str1.size(); // str1의 길이를 구한다
int len2 = strlen(charr1); // charr1의 길이를 구한다
이 문법은 str1이 객체를 나타내고, size()가 클래스 메서드라는 것을 나타낸다. 메서드는 그 메서드와 같은 클래스에 속한 객체에 의해서만 호출될 수 있는 함수이다.
str1은 string 객체이고, size()는 string 메서드이다. 요약하면 C 함수들은 매개변수를 사용하여 어느 문자열으로 사용할 것인지를 나타낸다. C++의 string 클래스 객체는 객체 이름과 도트 연산자를 사용하여 어느 문자열을 사용할 것인지 나타낸다.
하지만 이 파일을 실행하며 파일을 불러올 수 없다는 오류가 뜬다. 이 코드는 실행 환경에 따라 몇 가지 주의해야 할 부분이 있다. 이 점을 확인해 보면 다음과 같다.
1. strcpy와 strcat 함수 사용
- 이 함수들은 C 스타일 문자열 함수로, 안전하게 사용하려면 배열의 크기를 초과하지 않도록 주의해야 한다.
- 현재 코드에서 charr1의 크기는 20인데, charr2 ("jaguar")와 추가 문자열 (" juice")의 길이를 합쳐도 20을 넘지 않으므로 문제가 발생하지 않음.
- 하지만 배열 크기를 초과하는 입력이 들어가면 버퍼 오버플로우가 발생할 수 있으니, 더 안전한 방법을 사용하는 것이 좋다.
2. str1.size()와 strlen(charr1)의 차이
- str1.size() : C++ string 클래스의 멤버 함수로, 문자열의 길이를 반환함
- strlen(charr1) : C 스타일 문자열의 길이를 계산하는 함수. 널 종료 문자(\0)를 만나기 전까지의 문자 개수를 반환
- 현재 코드에서는 둘 다 정상적으로 작동하므로 문제가 없음
3. 컴파일러 경고 가능성
- 최신 컴파일러에서는 strcpy와 strcat 사용 시 경고가 발생할 수 있음. 이는 보안상 안전하지 않은 함수라는 이유 때문이다.
- 이 경고를 무시하고 사용할 수도 있지만, 더 안전한 함수인 strncpy와 strncat을 권장
4. Windows 환경의 Visual Studio
- Visual Studio에서 strcpy와 strcat 사용 시 기본적으로 비안전 함수 사용 경고가 나올 수 있다. 이를 방지하려면 다음 중 하나를 선택해야 한다.
- 비안전 함수 사용 허용
- 안전한 함수 사용 (위의 strncpy, strncat)
- 비안전 함수 사용 허용
#define _CRT_SECURE_NO_WARNINGS
실행 후에도 오류가 떠서 strncpy_s, strncat_s로 바꾸었더니 이제 실행이 잘 되었다.
string 클래스의 입출력
예제 10번 : strtype4.cpp
입력 이전에 charr 배열에 있는 문자열의 크기는 54로 배열의 크기보다도 크다. 여기서 알아둘 것 2가지
- 초기화되지 않은 배열의 내용은 정의되지 않는다
- strlen() 함수는 배열의 첫번째 원소에서 출발하여 널 문자에 도달할 때까지 바이트들을 카운트한다
- 이 경우 배열의 끝을 몇 바이트 자니차고 나서야 첫 널 문자가 나타난다. 초기화되지 않은 데이터에서 첫 널 문자가 나타나는 위치는 본질적으로 랜덤함
입력 이전에 str에 들어있는 문자열의 길이가 0인 것에 주목하라. 이것은 초기화되지 않은 string 객체는 자동으로 크기가 0으로 설정되기 때문이다.
다른 형태의 문자열 상수
C++은 char형 이외이도 wchar_t형을 가지고 있다.
하지만 이 부분은 조금 어려우니 다음에 학습하기로 한다. 이제 구조체에 대해서 살펴볼 것이다.
학습을 마치고
이 단원은 학습하는데 정말 많은 시간이 걸렸다. 중간에 공부하다 너무나 하기 싫어서 몇 시간씩 놀고 잠을 얼마나 많이 잤는지 모른다. 낮잠을 한 3시간 반은 잤나.. 아무튼 다시 일어나서 공부에 집중할 수 있어서 감사했다. string은 솔직히 C 언어에서도 많이 어려워서 이해하지 못했던 단원이었다. 차근차근 코드를 쳐보고 내용을 정리하며 이제 조금 이해가 되었다.
이 학습을 마치고 C 언어 공부를 할 때도 이 부분을 더 학습하게 될 것 같다. C 언어보다 C++이 훨씬 더 간편하고 사용하기 유용하다는 것도 몸소 느끼게 되었다.
빨리 5장 단원으로 넘어가고 싶지만 그래도 구조체까지는 배열과 연관이 있으니 학습을 해볼 생각이다. 그 뒷장은 열거형과 공용체, 포인터 등이 나오는데 지금 학습하기에는 많은 어려움이 있을 것 같았다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
복합 데이터형 4 : 배열 ~ 구조체 단원 연습문제 풀기 (0) | 2024.08.25 |
---|---|
복합 데이터형 3 : 구조체 (0) | 2024.08.25 |
복합 데이터형 1 : 배열과 문자열 (0) | 2024.08.25 |
데이터 처리 3 : 단원 연습문제 풀기 (0) | 2024.08.25 |
데이터 처리 2 : 부동 소수점수와 C++ 산술 연산자 (0) | 2024.08.25 |