티스토리 뷰

자바에서 스트링은 매우 중요하고 어려운 자료형이다. 이것은 C 언어에서도 마찬가지인데, 사실 자바의 스트링은 C 언어의 char*에 비해서는 매우 쉽고 편리하다. 그러나 메모리 관리를 하지 않으므로 효율성의 면에서 주의하지 않으면 성능에 심각한 문제를 가져올 수도 있다. 이 포스트에서는 스트링의 기본 개념과 연산에 대해서 살펴본다.

자바에서 스트링은 객체다. 객체라 함은 데이터를 내부적으로 가지고 있는 메모리 인스턴스이고 외부로 노출된 메소드에 의해서 접근할 수 있다는 뜻이다. 이러한 객체는 String 타입의 변수에 의해 참조된다. 프로그램 안에서 쓰이는 스트링 객체의 한 형태는 쌍따옴표로 표시되는 문자열을 스트링 리터럴(상수값)이라고 부른다. 스트링 리터럴도 하나의 스트링 객체여서 메모리 상에 저장되어 있으며 변수로 참조하거나 메소드를 호출할 수 있다. 다음은 스트링 객체에 대해 길이를 돌려주는 length() 메소드를 호출하는 예다.

String str = "This is a String object...";
int n = str.length();
int m = "Hello, this is another String..".length();

스트링 객체에 많이 쓰이는 연산으로 덧붙이기를 하는 + 연산이 있다.

str = str + "The first example";
str += "!!!";

+ 연산은 두 스트링을 덧붙인 새로운 객체를 생성하고 지정된 변수는 그 새로운 객체를 가리킨다. 그러므로 위의 연산을 적용한 결과 str은 "This is a String object...The first example!!!"를 가리키게 된다. + 연산은 System.out.print 문에서 많이 사용하게 되는데 한가지 주의할 점은 스트링을 + 하면서 줄이 길어지는 경우 중간에 줄바꿈을 넣어서 줄이 너무 길어지지 않게 끊어주어야 한다는 점이다.

System.out.printf("Java source code lines should not exceed %d characters because it might cause a trouble in reading the code.", max_line_length);
System.out.printf("Java source code lines should not exceed %d characters"
           + " because it might cause a trouble in reading the code.", max_line_length);

다음으로 스트링 메소드를 살펴보자.

charAt  스트링에서 특정 위치의 글자를 char 타입으로 돌려주는 메소드다.

str = "Java String is easy. But you have to be careful using String objects...";
char ch = str.charAt(10);

ch는 'g'가 된다[각주:1]

substring  스트링의 부분을 돌려주는 메소드다. 시작인덱스와 끝 인덱스를 매개변수로 받는다. (매개변수가 한 개인 경우 시작 인덱스만 지정하고 스트링의 끝까지를 반환해 달라는 뜻이다.

mine = str.substring(15, 18);

위의 str 문자열에 대해 mine은 "easy"를 가리킨다.

다음은 문자열에서 다른 문자열의 포함여부를 검사하는데 유용한 메소드다.

  • contains : 스트링이 매개변수로 받은 스트링을 포함하면 true, 아니면 false를 리턴한다.
  • indexOf : 스트링이 매개변수로 받은 스트링을 포함하면 그 인덱스를 반환하고 없으면 -1을 반환한다.

이 외에도 startsWith, endsWith 메소드는 각각 원래 스트링(this)가 매개변수로 받은 부분스트링으로 시작하거나 끝나는지를 알려준다.

다음으로 스트링에서 부분문자열을 다른 문자열로 바꾸는 replace 메소드가 있다. 

yourMsg = str.replace("easy", "not easy");
// "Java String is not easy. But you have to be careful using String objects..."

스트링을 다른 스트링과 비교하는 compareTo 메소드가 있다. 이것은 this 스트링이 크면 1, 같으면 0, 작으면 -1을 돌려준다.

다음은 스트링의 메소드를 이용한 예를 보여준다.
String line = "Java String is easy. But you have to be careful using String objects...";
char ch = line.charAt(10);
String subStr = line.substring(12, 17);
String replaceStr = line.replace("easy", "not easy");
System.out.printf("ch = %c\n" + "str.substring(12, 17) = %s\n"
			+ "replaceStr = %s\n", ch, subStr, replaceStr);
int index = line.indexOf("But");
System.out.printf("index = %d,\nline.indexOf(\"careful\") = %d,\n"
		+ "line.contains(\"string\") = %s,\n"
		+ "line.contains(\"String\") = %s\n",
		index, line.indexOf("careful"), line.contains("string"),
		line.contains("String"));
System.out.print("검색할 키워드 : ");
String kwd = s.next();
System.out.printf("line.indexOf(kwd) = %s\n", line.indexOf(kwd));
ch = g
str.substring(12, 17) = is ea
replaceStr = Java String is not easy. But you have to be careful using String objects...
index = 21,
line.indexOf("careful") = 40,
line.contains("string") = false,
line.contains("String") = true

또한 최근 버전에서 스트링의 equals 대신 contentEquals를 쓰도록 권장하고 있다. equals는 기본적으로 Object에 정의된 메소드를 오버라이드하여 같은 타입의 객체가 아니면 무조건 거짓이 된다. 그러나 스트링의 경우는 문자 배열이나 StringBuilder 같은 문자열을 가지는 다른 타입 객체의 내용과 비교해야 되는 일도 가끔 생긴다. 그래서 equals보다는 contentEquals를 쓰는 것이 더 바람직하다.

  1. 자바에서 홑따움표는 문자, 쌍따옴표는 문자열을 나타낸다. 그러므로 'g'와 "g"는 다르다. 또한 ""는 빈 문자열을 나타내지만 ''(빈 홑따옴표)는 오류를 일으킨다. [본문으로]
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함