Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
String class 사용하기

5. String class 사용하기

이 String class는 표준 C++ 라이브러리의 string class와 다르다는데 주의하라. 이 특별한 String class는 직접 만들어진 것이고, Java 프로그래머들이 C++을 쉽게 사용하도록 하기 위해 만들어졌다. 만약 당신이 C++과 더 익숙하다면 표준 C++ 라이브러리에 제공되는 진짜 string class 를 사용 하는 것이 좋다.

String class를 사용하기 위해, 23절의 "example_String.cpp" 예제 프로그램과 23절의 String class를 보아라.

'String class' 는 char와 char * 타입을 완벽하게 대신할 수 있다. 'String class'를 char 처럼 사용할 수도 있고, 여러가지 다양한 기능도 사용할 수 있다. 23절 에 주어진 makefile에서 만들어지는 'libString.a'를 링크해야하고, C++ 라이브러리가 위치한 모든 곳의 라이브러리를 /usr/lib 나 /lib 디렉토리에 라이브러리를 복사해넣어야 한다. 'libString.a'를 사용하기 위해서는, 다음과 같이 컴파일하라.

	g++ example.cpp -lString
다음에 주어진 예제 코드를 보라.
	String aa;

	aa = "Creating an Universe is very easy, similar to creating a baby human.";

	// 프로그램에서 aa.val()을 'char *' 같이 사용할 수 있다.
	for (unsigned long tmpii = 0; tmpii < aa.length(); tmpii++)
	{
		//fprintf(stdout, "aa.val()[%ld]=%c ", tmpii, aa.val()[tmpii]);
		fprintf(stdout, "aa[%ld]=%c ", tmpii, aa[tmpii]);
	}

	// 실제로 'char *'로 사용하면..
	for (char *tmpcc = aa.val(); *tmpcc != 0; tmpcc++)  
	{
		fprintf(stdout, "aa.val()=%c ", *tmpcc);
	}

5.1. 연산자

'String class' 는 아래와 같은 연산자를 제공한다 :-

  • Equal to ==

  • Not equal to !=

  • Assignment =

  • Add to itself and Assignment +=

  • String concatenation or addition +

연산자를 사용하는 예제를 보자.
	String aa;
	String bb("Bill Clinton");

	aa = "put some value string";  // assignment operator
	aa += "add some more"; // Add to itself and assign operator
	aa = "My name is" + " Alavoor Vasudevan "; // string cat operator

	if (bb == "Bill Clinton")  // boolean equal to operator
		cout << "bb is equal to 'Bill Clinton' " << endl;

	if (bb != "Al Gore")   // boolean 'not equal' to operator
		cout << "bb is not equal to 'Al Gore'" << endl;

5.2. 함수

String class에서 제공되는 함수들은 Java 의 String class와 같은 이름을 갖는다. 함수 이름과 동작은 Java의 String class와 완전히똑같다. StringBuffer class역시 제공된다. 이들은 Java와 C++간의 포팅을 쉽게 할 것이다 (잘라내기 & 붙여넣기와 최소한의 코드 조정 만을 필요로 할 것이다). Java의 함수에 들어있는 코드를 C++의 멤버함수로 복사하기만 하면 될 것이고, 최소한의 변경만으로도 C++에서 잘 컴파일 될 것이다. 또다른 이점은 Java와 C++을 모두 사용하는 개발자들이 둘 간의 문법이나 함수 이름을 따로따로 기억할 필요가 없어진다는 것이다.

예를들어 integer를 문자열로 바꾸는 것을 보면,

	String	aa;

	aa = 34;  // '=' 연산자가 int를 string으로 바꾼다.
	cout << "The value of aa is : " << aa.val() << endl;

	aa = 234.878;  //  '=' 연산자가 float를 string으로 바꾼다.
	cout << "The value of aa is : " << aa.val() << endl;

	aa = 34 + 234.878;
	cout << "The value of aa is : " << aa.val() << endl;
	// 출력은 '268.878'일 것이다.

	// casting이 필요하다.
	aa = (String) 34 + " Can create infinite number of universes!! " + 234.878;
	cout << "The value of aa is : " << aa.val() << endl;
	// 출력은 '34 Can create infinite number of universes!! 234.878'일 것이다.

String class의 함수이름에 대한 자세한 내용은 23절 를 참고해라. 같은 String.h파일이 다음 섹션에도 나올 것이다.

5.3. String class의 이름 바꾸기

5.3.1. Case 1: 단순한 이름 바꾸기

만약 String class의 이름이 맘에 들지 않는다면, "typedef" 를 이름을 바꾸기 위해 사용할 수 있다.

String.h를 include하는 모든 파일에 다음의 내용을 넣어라 :

// String이라는 이름이 맘에 들지 않는다면, 다음과 같이 바꾸어라.
typedef String StringSomethingElseIwant;

// 이제 코드는 다음과 같이 될 것이다.
int main()
{
	StringSomethingElseIwant aa_renstr; 
	aa_renstr = "I renamed the String Class using typedef";

	// .....
}
example_String.cpp 에 가서 'Source code for C++'을 선택해라.

5.3.2. Case 2: 이름이 겹칠 때

다른 같은 이름을 가진 class와 이름이 겹치는데, 두 class를 모두 사용하고 싶다면, 다음과 같은 방법을 써라. String.h를 include하는 모든 파일에 다음의 내용을 넣어라.

#define  String  String_somethingelse_which_I_want
#include "String.h"
#undef String

#include "ConflictingString.h"  // 이것도 String이란 class이다.

// 코드 내용..
int main()
{
	String_somethingelse_which_I_want aa;
	String bb; // 이것은 겹치는 String class이다.

	aa = " some sample string";
	bb = " another string abraka-dabraka";
	.......
}
전처리기가 모든 String을 "String_somethingelse_which_I_want" 으로 바꿀 것이고, String의 정의를 없앨 것이다. undef 다음 부터는 "String" class를 정의하는 겹치는 string class header가 오게 된다.