string 클래스와 함수
목차
지난 포스팅에서 C스타일 문자열에 대해서 이야기했습니다. C스타일 문자열은 원초적이라서 사용법이 좀 번거롭습니다. C 문자열을 사용하다가 C++의 string 클래스로 넘어가면 많은 부분 개선이 있습니다. 지금이야 객체 지향 프로그램이 워낙 보편적이라서 감흥이 떨어지는데 과거에는 객체 지향 언어의 클래스들이 프로그래밍의 신세계를 열어 주던 시절이 있었습니다. string 클래스를 함수에 사용하면서 알아보겠습니다.
우선 다음의 예제는 string 클래스의 기본 사용방법을 보여줍니다. string 헤더를 include 하고 std::string 의 이름을 가져옵니다. string myStr=”Hello CPP” 는 변수의 선언처럼 보이지만 실제는 클래스의 인스턴스를 생성하는 것 입니다. string myStr(“Hello CPP”) 이기도 하고 string myStr= string(“Hello CPP”) 나 같은 의미입니다.
클래스에 대한 자세한 내용은 다른 포스팅에 다룰 것 이라서 여기서는 자세한 설명을 하지 않겠습니다. string 을 변수처럼 사용하더라도 변수가 아니라 클래스 입니다. 예제에서는 클래스를 함수의 매개변수에 전달해서 사용하는 것을 보여줍니다. 역시 변수와 비슷하게 전달됩니다.
#include<iostream> #include<string> using std::cout; using std::endl; using std::string; void showString(const string str); int main() { string myStr="Hello CPP"; cout << myStr << endl; showString(myStr); return 0; } void showString(const string str) { cout << str << endl; }
string 클래스에는 유용한 메소드가 있어서 C스타일 문자열 보다 훨씬 유연하게 사용할 수 있습니다. 처음에 생성한 문자열도 append, erase 등 메소드로 쉽게 바꿀 수 있습니다. 자세한 내용은 c++의 reference 문서들을 참고하도록 합니다.
string 배열을 함수에 전달
string 배열은 클래스 배열입니다. 이를 매개변수로 함수에 전달해서 사용하는 것도 변수와 외적으로 차이가 없습니다. 아래 예제는 세명의 학생 이름을 받아서 출력하는 예제입니다. 함수 원형에서 매개변수가 const string * student 인데 이는 const string student[] 로도 쓸 수 있습니다. 지난 포스팅에서 배열의 이름을 받는 것은 주소를 받는 것이라고 설명했는데 클래스의 배열도 함수의 주소를 전달하는 것 입니다.
#include<iostream> #include<string> using std::cout; using std::cin; using std::endl; using std::string; #define SIZE 3 void showStudentList(const string * student); int main() { string student[SIZE]; cout << "학생 이름을 3명 입력하시오" << endl; for (int i = 0; i < SIZE; i++) { getline(cin, student[i]); /* code */ } showStudentList(student); return 0; } void showStudentList(const string * student) { for (int i = 0; i < SIZE; i++) { cout <<"-> student"<< i+1 << ": " <<student[i] << endl; } } [실행] 학생 이름을 3명 입력하시오 김 팔랑 아기 가 오랜지 -> student1: 김 팔랑 -> student2: 아기 가 -> student3: 오랜지 [script closed...]
요약
string 클래스를 함수에 매개변수로 전달하는 내용을 설명했습니다. 매개변수의 기본을 이해하고 있으면 어렵지 않게 적응할 수 있을 것 입니다.
string 클래스를 함수에 보낼 때는 string 자체의 조작이 별로 필요가 없고 고유의 메소드를 함께 잘 활용하는 것이 중요합니다. append, erase 등 기본적인 동작들이 구현되어 있습니다.
string 클래스가 가진 메소드들은 이후 개발된 객체 지향 언어들에 많은 영향을 끼쳤습니다. 다른 언어에서도 문자열을 처리하는 것이 가장 중요한 부분 중 하나입니다. C++의 string 을 잘 이해하면 다른 언어에 적응하기도 수월할 것 입니다.
이 포스팅은 다소 수박 겉핡기 식으로 다루게 되었는데 시리즈는 37번이지만 아직 초반부라서 함수의 다양한 면모를 스윽 보여주는 정도로 정리했기 때문입니다. C++은 좀 계단식 학습이라 기초를 계속 쌓아가지 않으면 어느 시점까지는 계속 제자리 걸음에서 벗어나기 어렵습니다. 보통의 C++ 학습에 대한 커리큘럼이라는게 있지만 그것을 다 안다고 모든 C++ 을 배운 것도 아니고 또 뒤로 갈수록 나오는 상급 주제들은 점점 미궁에 빠지게 합니다.(그럴 때가 있습니다)
이 블로그의 C++ 자습서 시리즈도 뒤로 갈수록 깊이를 더 넣을 생각입니다. 이 블로그도 수많은 인터넷 상의 튜토리얼 중에 하나에 불과하긴 합니다만, 나름대로 많은 자료들을 정리하고 다양한 설명 방법을 참고하며 작성하고 있습니다. 개인적으로 하나의 프로그래밍 언어를 설명하는 방법은 수도 없이 많다고 생각합니다. C의 문법은 단순하지만 전세계 대부분의 컴퓨터는 C기반으로 작동하고 있다는 것을 보면 C/C++ 언어는 그 자체로 무궁무진한 가치가 있다는 것 이지요. 그런 중요한 언어를 대학 강의 한학기~두학기를 듣는다고 모두 이해하는게 불가능한 것은 당연하다고 봅니다. 거인들(Giants)이 끓임 없이 개발하며 논의해왔고 앞으로도 새로운 아이디어가 이 C계열 언어에서 나올 것으로 믿기 때문에 언제 끝날지도 모르는 긴 포스팅 기간을 감안하고 작성하고 있습니다.
C++은 지금은 특정 분야에서 사용되고 대중적으로는 인기가 없는 분야라서 이것을 공부하는 사람들은 고독을 느낄 수 있습니다. 하지만 이 블로그에 C++ 포스팅을 처음 시작할 때 이야기 한 것 처럼 C++ 은 인내의 시간이 필요하지만 보상적인 가치가 크다. C++을 잘배워서 돈을 많이 번다 그런 이야기가 아니고 어쩌면 IT업계에서 평생 도움이 되는 기반을 닦는 것일지도 모릅니다.
항상 말하지만 최신 유행하는 동적 타이핑 언어들이 C계열보다 뒤떨어진다는 것은 아닙니다. 그것들은 초반에 시작이 쉽지만 뒤로 갈수록 원론적인 개념을 모르면 더더 어렵게 느껴집니다. 어차피 한번은 C계열로 돌아와서 초심으로 공부한다면 그것이 스크립트 언어와 프레임워크를 더 잘 이해하는 지름길이 될 수도 있습니다.
오늘도 잡설이 길어졌습니다. 약간 포스팅 수가 30-40개 정도 넘어갈 때 멘탈이 나가는데 학습자들도 중간이 제일 지루하고 시간이 오래걸립니다. 기초를 쌓는 것도 아래 중간 위로 삼중 기초공사를 하는 것인데 중간을 잘 극복하는게 중요합니다.
참고문서
https://www.cplusplus.com/reference/string/string/