웹개발 교육/Java

[32일] Java (21) - String 클래스

ewok 2022. 9. 8. 16:19

다양한 함수

equals()

package oop0908;

public class Test03_String {

	public static void main(String[] args) {
		// 문자열 클래스
		String str = "HAPPY";
		String name = new String("HAPPY");
		
		if(str==name) {
			System.out.println("같다");
		} else {
			System.out.println("다르다");
		}//if end

위와 같이 == 연산자를 통해 str과 name을 비교하면 "다르다"라는 결과가 출력된다.

같은 HAPPY인데 이러한 결과가 나오는 것은 HAPPY라는 값을 비교하는 것이 아닌 주소가 같은 지 비교하기 때문이다. 

 

str과 name 모두 HAPPY라는 값을 가지고 있지만 메모리에 저장된 위치가 다르다.

따라서 서로 다른 주소를 가진 str과 name을 ==연산자로 비교했을 때 false라는 결과가 나온다.

 

따라서 HAPPY라는 값 자체를 비교하고 싶을 때는 equals()를 사용하자

//문자열의 내용을 비교하는 경우 == 연산자 사용하지 말고 equls() 함수를 이용할 것
if(str.equals(name)) {
    System.out.println("같다");
} else {
    System.out.println("다르다");
}//if end

isEmpty()

문자열의 길이가 0인지 아닌지 확인하는 함수

//문자열의 갯수가 0인지?
if(str.isEmpty()) {
    System.out.println("빈문자열 이다");
} else {
    System.out.println("빈문자열 아니다");
}//if end

 

split()

문자열을 분리하는 함수

//특정 문자를 기준으로 문자열 분리하기
str = new String("Gone With The Wind");
String[] word = str.split(" ");  //공백을 기준으로 분리
for(int i=0; i<word.length; i++) {
    System.out.println(word[i]);
}//for end

 

 

StringTokenizer

split() 함수처럼 문자열을 분리하는 메소드를 가진 클래스이다.

str = new String("Gone With The Wind");

//문자열에서 공백 문자를 기준으로 분리하기
StringTokenizer st = new StringTokenizer(str, " ");
while(st.hasMoreTokens()) {	//토근할 문자가 있는지?
    System.out.println(st.nextToken());  //토큰한 문자열 가져오기
}//while end

hasMoreTokens()는 분리 기준으로 한 문자가 있는지 확인하는 함수로 boolean 값을 갖는다.

str 왼쪽부터 오른쪽으로 진행하며 남은 문자열에서 공백이 더 있는지 묻고 더 있으면 true, 없으면 false를 반환한다.

그리고 nestToken()을 통해 분리한 문자열을 가져온다.

 

https://docs.oracle.com/javase/8/docs/api/

 

Java Platform SE 8

 

docs.oracle.com

자세한 사항은 위 사이트에서 StringTokenizer 클래스를 검색하면 알 수 있다.

 

 

문자열 연산 속도

String < StringBuffer < StringBuilder  오른쪽으로 갈수록 연산 속도가 빠르다

 

//문자열 연산 속도 (오른쪽으로 갈수록 빠름)
//String < StringBuffer < StringBuiler

String s1 = "";
System.out.println(s1.length());

s1 = s1 + "one";
System.out.println(s1.length()+s1);

s1 = s1 + "two";
System.out.println(s1.length()+s1);

s1 = s1 + "three";
System.out.println(s1.length()+s1);

//모든 문자열 지우기(빈 문자열 대입)
s1= "";
System.out.println(s1.length()+s1);
////////////////////////////////////////////

StringBuilder s2 = new StringBuilder();

s2.append("SEOUL");
System.out.println(s2.length()+s2.toString());

s2.append("JEJU");
System.out.println(s2.length()+s2.toString());

s2.append("BUSAN");
System.out.println(s2.length()+s2.toString());

//모든 문자열 지우기
s2.delete(0, s2.length());
System.out.println(s2.length());
///////////////////////////////////////////////////

StringBuffer s3 = null;
System.out.println(s3.length()); //NullPointerException 발생

위와 같은 문자열 연산을 할 때 연산을 적게 해야 할 경우에는 String을 사용하여도 괜찮지만

많은 연산을 해야 할 경우에는 String은 StringBuffer,  StringBuilder와 비교하여 연산속도가 많이 차이가 나기 때문에

String을 사용하는 것은 부적절할 수 있다.

 

https://madplay.github.io/post/difference-between-string-stringbuilder-and-stringbuffer-in-java

 

자바 String, StringBuilder 그리고 StringBuffer 성능 차이 비교

자바에서 String과 StringBuilder 그리고 StringBuffer의 차이는 무엇일까? 그리고 제일 빠른 연산 속도는 어떤 것일까?

madplay.github.io

 

속도 비교 테스트

https://dog-foot-story.tistory.com/32

 

[Java] 06. String, StringBuilder 속도 비교

String 클래스 변경 방법 String 클래스는 작은 문자의 변화에도 계속 새로 객체(인스턴스)를 생성하기 때문에 문자열의 변경이 불가능하다. 각각 다른 인스턴스이므로 변수간의 해시 값이 다른 것

dog-foot-story.tistory.com