Back/JAVA

String Class의 특징 및 주요 메서드(StringBuffer, StringTokenizer)

시월해 2021. 3. 16. 15:49

String 클래스의 특징


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


2. 객체 생성 방법 - 2가지
  1) 일반 변수 선언 방법으로 객체 생성

      ==> heap 영역에 있던 문자열을 참조하기에 주소값이 같음.
      예) String str1 = "홍길동";
           String str2 = "홍길동";

 

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

      ==> heap영역에 있던 문자열을 참조하지 않고 새로운 객체를 만듦.
        예) String str3 = new String("홍길동");
           String str4 = new String("홍길동");


  3). equals() : 객체의 내용(데이터)를 대상으로 비교하여
                 객체가 같으면 true, 틀리면 false값을 반환하는 메서드.
                 예) if(str.equals(str2)) { }

 

(중요!) 문자열이 결합이 되면 새로운 메모리 공간을 확보한 후, 그 메모리에 str1과 str2가 결합된 문자열이 들어가고 새로운 메모리 주소를 참조하게 된다.

 

String 클래스의 주요 메서드

 

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

 

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

 

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

 

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

 

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

 

String 클래스의 단점


 - 빈번한 문자열 연산을 실행할 경우 메모리(heap)를 많이 차지하게 됨.
 - 매번 연산 시마다 새로운 객체를 생성. ==> 힙(heap) 영역의 과부하가 발생할 가능성이 많음.
 - 이러한 단점을 개선한 클래스가 등장 : StringBuffer 클래스

 

StringBuffer 클래스

 

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

 

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

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

 

3. substring() : 문자열을 추출하는 메서드
   형식1) substring(시작 index, 끝 index+1)
   형식2) substring(시작 index) => 시작 index부터 끝까지

 

StringTokenizer 클래스


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

 

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

 

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


예제1) String 변수의 참조 주소값 확인

public class Ex01 {

	public static void main(String[] args) {
		
		// 1) 일반 변수 선언 방법으로 객체 생성.
		String str1 = "홍길동";
		String str2 = "홍길동";
		
		if(str1 == str2) {
			System.out.println("참조하는 주소가 같다.");
		} else { 
			System.out.println("참조하는 주소가 다르다.");
		}
		System.out.println();
		
		// System.identityHashCode() ==> 주소값 출력하는 메소드
		System.out.println("str1 주소 >>> " + System.identityHashCode(str1));
		System.out.println("str2 주소 >>> " + System.identityHashCode(str2));
		System.out.println();
		
		// 2) new 키워드를 이용하는 방법.
		String str3 = new String("홍길동");
		String str4 = new String("홍길동");
		
		if(str3 == str4) {
			System.out.println("참조하는 주소가 같다.");
		} else { 
			System.out.println("참조하는 주소가 다르다.");
		}
		System.out.println();
		
		System.out.println("str3 주소 >>> " + System.identityHashCode(str3));
		System.out.println("str4 주소 >>> " + System.identityHashCode(str4));
		System.out.println();
	}

}

str1, str2는 문자열을 넣는 것으로 변수를 생성했고, str3, str4는 new 키워드로 생성했으므로 주소값이 다르다.


예제2) 문자열 결합시 새로운 주소값을 참조하는 것을 확인

public class Ex02 {

	public static void main(String[] args) {
		
		String str1 = "abc";
		String str2 = "def";
		
		System.out.println("str1 주소 >>> " + System.identityHashCode(str1));
		System.out.println("str2 주소 >>> " + System.identityHashCode(str2));
		System.out.println();
		
		str1 += str2; // str1 = str1 + st2
		System.out.println("str1 주소 >>> " + System.identityHashCode(str1));
		// 문자열이 결합이 되면 새로운 메모리 공간을 확보한 후,
		// 그 메모리에 str1과 str2가 결합된 문자열이 들어가고 새로운 메모리 주소를 참조하게 된다.

	}

}

문자열을 결함하면서 주소값이 변경된 것을 볼 수 있다.


예제3) String Class의 주요 메서드

public class Ex03 {

	public static void main(String[] args) {
		
		// 1. 소문자 -> 대문자 : toUpperCase()
		//    대문자 -> 소문자 : toLowerCase()
		String str = "java program";
		
		System.out.println("대문자 >>> " + str.toUpperCase());
		System.out.println("소문자 >>> " + str.toUpperCase().toLowerCase());
		System.out.println();
		
		// 2. length() : 문자열의 길이를 정수값으로 반환하는 메서드.
		System.out.println("str 문자열의 길이 >>> " + str.length());
		System.out.println();

		// 3. concat() : 문자열을 결합하는 메서드.
		String str1 = "JAVA ";
		String str2 = str1.concat("PROGRAM");
		System.out.println("str2 문자열 >>> " + str2);
		System.out.println();
		
		// 4. equalsIgnoreCase() : 대소문자를 구분하지 않는 메서드.
		if(str.equalsIgnoreCase(str2)) {
			System.out.println("두 문자열은 같은 문자열이다.");
		} else {
			System.out.println("두 문자열은 다른 문자열이다.");
		}
		System.out.println();
		
		// 5. charAt(index) : 문자열에서 특정 단일 문자를 추출하는 메서드.
		// index는 0부터 시작한다.
		String juminNo = "123456-2345678";
		char gender = juminNo.charAt(7);
		
		if(gender == '1' || gender == '3') {
			System.out.println("당신은 남자");
		} else if( gender == '2' || gender == '4') {
			System.out.println("당신은 여자");
		} else {
			System.out.println("당신은 외국인");
		}
	}

}

각종 메서드의 결과


예제4) StringBuffer

public class Ex04 {

	public static void main(String[] args) {
		
		StringBuffer sb = new StringBuffer("java ");
		
		// 1. append() : 문자열을 추가하는 메서드.
		System.out.println("문자열 추가 후 >>> " + sb.append("program"));
		System.out.println();
		
		// 2. replace() : 문자열을 교체하는 메서드
		//    형식) replace(시작 index, 끝 index+1, 교체할 문자열)
		sb.replace(0, 4, "spring");
		System.out.println("문자열 교체 후 >>> " + sb);
		System.out.println();
		
		// 3. substring() : 문자열을 추출하는 메서드
		//    형식1) substring(시작 index, 끝 index+1)
		//    형식2) substring(시작 index) => 시작 index부터 끝까지
		StringBuffer sb1 = new StringBuffer("2021/03/16 11:09:10");
		
		System.out.println("오늘 날짜 >>> " + sb1.substring(0,10) );
		System.out.println("현재 시간 >>> " + sb1.substring(11));

	}

}

결과

 


예제5) StringTokenizer

import java.util.StringTokenizer;

public class Ex05 {

	public static void main(String[] args) {
		
		String str = "id=hong&pwd=1234&age=27";
		StringTokenizer st = new StringTokenizer(str, "&");
		
		//int count = st.countTokens(); // 토큰으로 구분된 문자열의 갯수
		
		System.out.println("토큰 수 >>> " + st.countTokens());

		// hasMoreTokens() : 반환할 다음 토큰이 있는지 확인. 있으면 true 반환, 없으면 false 반환
		while(st.hasMoreTokens()) { 
			System.out.println(st.nextToken());
		}
	}

}

결과