본문 바로가기
Back-End/Java

[Java] String 클래스의 특징 및 주요 메서드(StringBuffer, StringTokenizer)

by 찐코딩 2021. 8. 19.

String 클래스

- 문자열 객체를 처리하는 클래스.

 

2. 객체 생성 방법 - 2가지

  1) 일반 변수 선언 방법으로 객체 생성

      ==> heap 영역에 있던 문자열을 참조하기에 주소값이 같음.

	// 1) 일반 변수 선언 방법으로 객체 생성
		System.out.println("일반 변수 선언 방법으로 객체 생성");
		String str1 = "홍길동";
		String str2 = "홍길동";
		
		if(str1 == str2) {
			System.out.println("참조하는 주소가 같다");
		}else {
			System.out.println("참조하는 주소가 다르다");
		}
		
		System.out.println("str1 주소 : " + System.identityHashCode(str1));
		System.out.println("str2 주소 : " + System.identityHashCode(str2));

결과

일반 변수 선언 방법으로 객체 생성
참조하는 주소가 같다     		// => heap 영역에 있던 문자열을 참조하기에 주소값이 같음.
str1 주소 : 366712642
str2 주소 : 366712642			// 두 주소가 같은 것을 볼 수 있다.

 

  2) new 키워드를 이용하는 방법.

      ==> heap영역에 있던 문자열을 참조하지 않고 새로운 객체를 만듦.

// 2) new 키워드를 이용하여 객체 생성
		System.out.println("new 키워드를 이용하여 객체 생성하는 방식");
		String str3 = new String("홍길동");
		String str4 = new String("홍길동");
		
		System.out.println("str3.equals(str4) : "+str3.equals(str4));
		
		if(str3 == str4) {
			System.out.println("참조하는 주소가 같다");
		}else {
			System.out.println("참조하는 주소가 다르다");
		}
			
		
		System.out.println("str3 주소 : " + System.identityHashCode(str3));
		System.out.println("str4 주소 : " + System.identityHashCode(str4));

결과

new 키워드를 이용하여 객체 생성하는 방식
str3.equals(str4) : true
참조하는 주소가 다르다
str3 주소 : 1829164700
str4 주소 : 2018699554
  ★ equals() : 객체의 내용(데이터)를 대상으로 비교하여
                 객체가 같으면 true, 틀리면 false값을 반환하는 메서드.
                 예) if(str.equals(str2)) { }

(중요!) 문자열이 결합이 되면 새로운 메모리 공간을 확보한 후,

그 메모리에 str1과 str2가 결합된 문자열이 들어가고 새로운 메모리 주소를 참조하게 된다.

public class Ex02 {

	public static void main(String[] args) {

		String str1 = "hello";
		String str2 = "world";
		
		System.out.printf
			("str1 문자열 주소 : %s\n"
					+ "str2 문자열 주소 : %s\n", 
					System.identityHashCode(str1)
					, System.identityHashCode(str2));
		
		// 문자열 연산(결합)
		str1 = str1 + str2;
		
		System.out.printf
			("str1 문자열 주소 : %s", 
					System.identityHashCode(str1));	
	}
}

결과

str1 문자열 주소 : 366712642
str2 문자열 주소 : 1829164700
str1 문자열 주소 : 685325104

 

문자(Char) 과 문자열(String)의 차이, 그리고 ""와 ''의 차이!

 

주의!)

https://opentutorials.org/module/2495/13969

자바는 문자(Character)와 문자열(String)을 구분한다.

 

문자는 한 글자를 의미하고, 문자열은 여러 개의 문자가 결합한 것을 의미한다.

 

자바에서 문자는 '(작은따옴표)로 감싸야 한다.

System.out.println('생');

 

문자열은 "(큰따옴표)로 감싸야 한다. 

System.out.println("생활코딩");

 

만약 문자열을 작은 따옴표로 감싸면 에러가 발생한다.

System.out.println('생활코딩');  ==> error 발생

 

하나의 문자를 큰따옴표로 감싼다고 에러가 발생하지는 않는다. 한 글자도 문자열이 될 수 있기 때문이다.

System.out.println("생");

 

자바에서 문자는 '(작은따옴표)로 감싸야 한다.
문자열은 "(큰따옴표)로 감싸야 한다. 


라고 되어있다.

 

예제 코드에서

5번째 charAt 코드를 따라치다가, 오류가 발생했었다

// 5. charAt(index) : 문자열에서 특정 단일 문자를 추출하는 메소드 
		System.out.println("charAt(index)");
		String personNumber = "123456-2345777";
		char gender = personNumber.charAt(7);
		
		if(gender == "1" || gender == "3") {
			System.out.println("당신은 남자 입니다.");
		}else if(gender == "2" || gender == "4") {
			System.out.println("당신은 여자 입니다.");
		}else {
			System.out.println("당신은 외국인 입니다.");
		}

 

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	Incompatible operand types char and String
	Incompatible operand types char and String
	Incompatible operand types char and String
	Incompatible operand types char and String

	at String.Ex03.main(Ex03.java:43)

 

언뜻보면 위 코드와 다른 점을 모르겠지만..

이렇게 해당 구문에 에러표시가 되어있는 것을 볼 수 있다.

 

그렇다!

charAt 메소드는 char 타입의 자료형을 return해 주는 메소드이다.

따라서 작은따옴표('')로 문자를 감싸야 되는 것이다.

다행히 작은 따옴표로 수정하니 에러가 사라졌다.

 

String 클래스의 주요 메서드

1. 소문자 -> 대문자 : toUpperCase()
   대문자 -> 소문자 : toLowerCase()

// 1. toUpperCase() : 소문자를 대문자로 바꿔주는 메소드
		// <-> toLowerCase() : 대문자를 소문자로 바꿔주는 메소드
		System.out.println("toUpperCase, toLowerCase 메소드");
		String str1 = "java program";
		String str2 = "JAVA PROGRAM";
		
		System.out.printf("%s을 대문자로 바꿔보기 : %s\n", 
						str1, str1.toUpperCase());
		System.out.printf("%s을 소문자로 바꿔보기 : %s\n", 
						str2, str2.toLowerCase());

결과

toUpperCase, toLowerCase 메소드
java program을 대문자로 바꿔보기 : JAVA PROGRAM
JAVA PROGRAM을 소문자로 바꿔보기 : java program

 

2. length() : 문자열의 길이를 정수값으로 반환하는 메서드

		// 2. length() : 문자열의 길이를 정수값으로 반환하는 메소드
		System.out.println("lenth 메소드");
		System.out.printf("%s 문자열의 길이 : %d\n", str1, str1.length());

결과

lenth 메소드
java program 문자열의 길이 : 12

 

3. concat() : 문자열을 결합하는 메서드.

// 3. concat() : 문자열을 결합하는 메소드
		System.out.println("concat 메소드");
		String str3 = "JAVA";
		String str4 = str3.concat("PROGRAM");
		System.out.println("문자열 결합 결과 : " + str4);

결과

concat 메소드
문자열 결합 결과 : JAVAPROGRAM

 

4. equalsIgnoreCase() : 대소문자를 구분하지 않는 메서드.

// 4. equalsIgnoreCase() : 대소문자를 구분하지 않는 메소드
		System.out.println("equalsIgnoreCase 메소드");
		if(str1.equalsIgnoreCase(str2)) {
			System.out.printf("%s, %s 두 문자열은 같은 문자열이다.\n",
					str1, str2);
		}else {
			System.out.printf("%s, %s 두 문자열은 다른 문자열이다.\n",
					str1, str2);
		}

결과

equalsIgnoreCase 메소드
java program, JAVA PROGRAM 두 문자열은 같은 문자열이다.

 

5. charAt(index) : 문자열에서 특정 단일 문자를 추출하는 메서드. index는 0부터 시작한다.

		// 5. charAt(index) : 문자열에서 특정 단일 문자를 추출하는 메소드 
		System.out.println("charAt(index)");
		String personNumber = "123456-2345777";
		char gender = personNumber.charAt(7);
		
		if(gender == '1' || gender == '3') {
			System.out.println("당신은 남자 입니다.");
		}else if(gender == '2' || gender == '4') {
			System.out.println("당신은 여자 입니다.");
		}else {
			System.out.println("당신은 외국인 입니다.");
		}

결과

charAt(index)
당신은 여자 입니다.

 

String 클래스의 단점

- 빈번하게 문자열 연산을 실행할 경우

- 메모리(heap)을 많이 차지하게 됨

- 매번 연산 시마다 새로운 객체를 생성하게 됨 ==> 힙(heap) 영역의 과부하가 발생할 가능성이 많음

- 이러한 단점을 개선한 클래스가 등장 : StringBuffer 클래스

 

StringBuffer 클래스

		StringBuffer sb = new StringBuffer("Java");	// 원본

 

1. append() : 문자열을 추가하는 메서드.

// 1. append() : 문자열을 추가해주는 메소드
		
		System.out.println("append() 메소드");		
		sb.append("program");
		System.out.println("문자열 추가 후 " + sb);
		System.out.println();

결과

append() 메소드
문자열 추가 후 Javaprogram

 

2. replace() : 문자열을 교체하는 메서드

   형식) replace(시작 index, 끝 index+1, 교체할 문자열)

// 2. replace() : 문자열을 교환하는 메소드
		// 형식) replace(시작 index, 끝(-1) index, "교체할 문자열");
		
		System.out.println("replace() 메소드");
		sb.replace(0, 4, "spring");
		System.out.println("문자열 교체 후 : " + sb);
		System.out.println();

결과

replace() 메소드
문자열 교체 후 : springprogram

 

3. substring() : 문자열을 추출하는 메서드

   형식1) substring(시작 index, 끝 index+1)
   형식2) substring(시작 index) => 시작 index부터 끝까지

// 3. substring() : 문자열을 추출하는 메소드
		// 형식 1) substring(시작 index, 끝(-1) index)
		// 형식 2) substring(시작 index)
		// 띄어쓰기(공백)은 제외
		StringBuffer sb1 = new StringBuffer("2021/08/20 09:38:10");
		System.out.println("오늘 날짜 : " + sb1.substring(0,10));
		System.out.println("현재 시간 : " + sb1.substring(11));
		System.out.println();

결과

오늘 날짜 : 2021/08/20
현재 시간 : 09:38:10

StringTokenizer 클래스

 - 특수 문자를 기준문자(delimiter)로 문자열을 잘라 주는 클래스(파싱).
 - 기준문자로 분리된 문자열을 토큰(token)이라고 함.
 - 웹에서 전화번호를 하이픈(-) 기준으로 앞자리, 중간자리, 뒷자리 형식으로 구분해서 번호 추출할 때 사용함.
   (주민번호, 핸드폰 번호 등등)

 

1.countTokens() : 토큰으로 구분된 문자열의 갯수 반환

 

2.hasMoreTokens() : 반환할 다음 토큰이 있는지 확인. 있으면 true 반환, 없으면 false 반환

package String;

import java.util.StringTokenizer;	// StringTokenizer클래스를 호출해야 한다.

public class Ex05 {
	
	public static void main(String[] args) {
		
		String str = "id=hong&pwd=1234&age=27";
		StringTokenizer st = new StringTokenizer(str, "&");
		
		// countTokens() 기존 문자로 분리된 토큰의 갯수를 정수값으로 반환해주는 메소드
		System.out.println("토큰 수 : " + st.countTokens());
		
		// hasMoreTokens() : 반환할 다음 토큰이 있는지 확인. 있으면 true 반환, 없으면 false 반환
		// nextToken() : 존재하는 토큰(기존 문자로 분리된 문자열)을 반환
		while(st.hasMoreTokens()) { 
			System.out.println(st.nextToken());			
		}
		
	}

}

결과

토큰 수 : 3
id=hong
pwd=1234
age=27

 

 

 

댓글