«   2025/05   »
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 31
Tags more
Archives
Today
Total
관리 메뉴

장미의 개발일기

String 클래스의 특징과 자주 쓰는 메소드 & StringTokenizer, split 차이 본문

개발일기/Java

String 클래스의 특징과 자주 쓰는 메소드 & StringTokenizer, split 차이

민장미 2023. 4. 18. 23:33

String 클래스: 

 1. 한번 정의된 문자열은 변경할 수 없다.

 2. 문자열 리터럴을 바로 입력해 객체를 생성할 때 같은 문자끼리 하나의 객체를 공유한다.

(다른 클래스에는 없는 독특한 특징)

 

String 클래스 객체 생성 : 

암묵적 객체 생성 : String str1 ="안녕";

명시적 객체 생성 : String str1 = new String("안녕");

 

Java에서는 모든 객체를 생성할 때 new 키워드를 사용해야 한다.

다만 String 클래스는 특별하게 "문자열" 이렇게 바로 객체 생성이 가능하다. 

보통은 문자열이 같으면 힙 영역 메모리에서 같은 위치를 공유한다. 다만 

위에 명시 해놓은 '명시적 객체 생성방법'으로 객체가 생성되면, 두 객체가 같은 문자열을 가지고 있다고 해도

주소값이 달라서 주의해야한다. 

 

(equals로 비교하면 true가 떠버리니 주의)

아래 예시를 보면 이해하기 쉽다 

 

 

 

위에 있던 String 클래스의 특징 첫번쨰: 한번 정의된 문자열은 변경할 수 없다.

아래 소스: 

얼핏보면 문자열끼리 더하는 것으로 보이지만, 실제로는 

객체 str1 있는 줄에서 객체가 5개나 생성이 되었다.

 

안녕, 하세요, !가 각 하나씩에 총 3개

안녕 + 하세요 => 이렇게 1개

안녕하세요 + ! => 이렇게 1개

총 5개다.  물론 이건 String 객체의 특징을 설명하기 위해서 예시를 든거지만,

메모리에는 비효율적이다. 

 

*** 반드시 외워야할 String 클래스의 주요 메소드***

 

표에 있는 걸 전부 작성할 순 없고, 간추려서 적어보겠다.

 

*length( ): 문자열의 길이를 리턴 (배열과 관련해서 자주 써봄)

*charAt() : 문자열에서 특정 인덱스에 위치해 있는 문자를 반환해줌

*indexOf(): 문자열에서 특정문자나 특정 문자열을 앞에서부터 찾아 위칫값을 알아낸다.

*lastIndexOf(): 문자열에서 특정 문자가 특정 문자열을 뒤에서부터 찾아 위칫값을 알아낸다.

**getByte() : 문자열을 -> byte[ ](배열)로 반환 ***

**toCharArray(): 문자열 -> char[ ](배열)로 반환**

*String.valueOf(~~~다양한 문자열 옵션) :  다른 자료형 -> 문자열로 변환 (정적메소드다)

 

* 배열 관련:  Arrays.toString(배열) => 배열을 자동으로 배열형(문자열)으로 출력해줌 ****

 

아래 예제가 코드치기가 좀 노가다이긴 한데, 이해하기 좋은 예제인 듯? 

하마터면 인덱스번호 0번부터 인거 까먹고 잘못 이해할 뻔했다 

package book;

import java.util.Arrays;

public class Page_199 {
public static void main(String[] args) {
	///****** 인덱스는 0부터 시작함을 명심하자****
	// **** 공백도 카운트 ******
	
	//문자열 길이
	String str1 = "Hello Java!";
	String str2 = "안녕하세요! 반갑습니다.";
	System.out.println(str1.length());
	System.out.println(str2.length());
	System.out.println();
	
	//문자열 검색
	// @charAt()
	System.out.println(str1.charAt(2));
	System.out.println(str2.charAt(5));
	System.out.println();
	
	// @indexOf(), lastIndexOf()
	///****** 인덱스는 0부터 시작함을 명심하자****
	System.out.println(str1.indexOf('a')); 
	System.out.println(str1.lastIndexOf('a'));
	System.out.println(str1.indexOf('a',8));
	System.out.println(str1.lastIndexOf('a',8));
	System.out.println(str1.indexOf("Java"));
	System.out.println(str1.lastIndexOf("Java"));
	System.out.println(str2.indexOf("하세요"));
	System.out.println(str2.lastIndexOf("하세요"));
	System.out.println(str1.indexOf("Bye"));
	System.out.println(str2.lastIndexOf("고맙습니다."));
	System.out.println();
	
	//문자열 변환 및 연결
	// @String.valueOf(기본 자료형): 기본 자료형 -> 문자열 변환
	String str3 = String.valueOf(2.3);
	String str4 = String.valueOf(false);
	System.out.println(str3);
	System.out.println(str4);
	
	// @concat(): 문자열 연결
	String str5 = str3.concat(str4);
	System.out.println(str5);
	
	// String.valueOf() + concat()
	String str6 = "안녕" + 3;
	String str7 = "안녕".concat(String.valueOf(3));
	System.out.println(str6);
	System.out.println(str7);
	
	//문자열을 byte[] 또는 char[]로 변환
	String str8 ="Hello Java!";
	String str9 = "안녕하세요";
	
	// @getBytes(): 문자열 -> byte[]로 변환
	byte[] array1 = str8.getBytes();
	byte[] array2 = str9.getBytes();
	System.out.println(Arrays.toString(array1));
	System.out.println(Arrays.toString(array2));
	
	// @ toCharArray():문자열 -> char[] 변환
	char[] array3 = str8.toCharArray();
	char[] array4 = str9.toCharArray();
	System.out.println(Arrays.toString(array3));
	System.out.println(Arrays.toString(array4));
	
	
	
}	

}

출력화면:

이외에도

 

* replace(): 일부 문자열 -> 다른 문자열로 대체

*subsstring(): 문자열의 일부만을 포함하는 새로운 문자열 객체를 생성

*split() : 특정 기호를 기준으로 문자열을 분리한다.

*trim(): 문자열의 좌우 공백을 제거한다.

*equals(): 두 문자열의 위칫값이 아닌 실제 데이터 값을 비교한다. 이때 대소문자를 구분한다. 

             => 이 포스팅 앞에서 나왔던 내용 !  String 객체 비교할땐 이 함수 쓰면 안 된다. 

                  암묵적 객체 생성 : String str1 ="안녕";

                  명시적 객체 생성 : String str1 = new String("안녕");

 

*split() : 특정 기호를 기준으로 문자열을 분리한다.

          => 특별 내용 추가

          String 클래스의 "split( )" 메소드와 클래스 StringTokenizer의 차이와 공통점에 대해 알아보자.

 둘 다 특정 기호(구분자)를 기분으로 문자열을 잘라주는 기능을 가지고 있다.

 

split :  whitespace(뛰어쓰기, 즉 공백)를 데이터 취급한다.

 

StringTokenizer : whitespace(뛰어쓰기, 즉 공백)를 데이터 취급하지 않는다. 

 

아래 예시와 출력을 보면 이해하기가 수월하다. 

package repeat;

import java.util.StringTokenizer;

public class Token {
public static void main(String[] args) {
	//면접에 나올 수도 있음  
	//StringTokenizer는 
	// " ♥Whitespace♥ "를 데이터취급을 안함 
	//화이트 스페이스= 뛰어쓰기 
	// 하트 2개의 사이에 공백이 없다고 취급하고 
	//하트를 기준으로 나누되, 하트는 세지 않는다 노카운트
	String str="김길동♥이시국★김수현♥전지현♥♥수지";
	
	StringTokenizer stz = new StringTokenizer(str, "♥");
 
	System.out.println("Token Count:"+stz.countTokens());
	
	while(stz.hasMoreElements()) {
		String strv = stz.nextToken();
		System.out.println(strv);
		System.out.println("----------------------------");
		
	}//wh
	
	// java.util.NosuchElement =>없는 토큰!!!
		// whitespace도 데이터 취급
	    // 하트사이에 공백이 있다고 취급; 
		str="김길동♥이시국★김수현♥전지현♥♥수지";
		
		String[] arr= str.split("♥");
		System.out.println("배열의 길이 : "+arr.length);
		for (String e: arr) {
			System.out.println(e);
		}
		System.out.println("-----------------------------");
		System.out.println(arr[0]);
	
	
}

}

 

 

추가로 String 다른 주요 메소드들 예제 실습해봄

그런데 split 예제가 뭐가 문제인지 내 노트북에선 잘 안먹히는건지

이상하게 출력 됌;; 

기호를 공백 등 다 바꿔봐도

[Ljava.lang.String;@372f7a8d 이딴게 출력된다...

package book;

public class Page_202 {
public static void main(String[] args) {
	//문자열 수정
	// @toLowerCase(), toUpperCase()
	String str1 = "Java Study";
	System.out.println(str1.toLowerCase());
	System.out.println(str1.toUpperCase());
	System.out.println(str1.replace("Study","공부"));
	
	// @substring()
	System.out.println(str1.substring(0,5)); //인덱스 4는 공백
	
	// split()
	String[] strArray = "abcdefghijil".split("45555");
	System.out.println(strArray);
	
	// @trim()
	System.out.println("                abc                 ".trim());
	
	System.out.println();
	
	//문자열의 비교
	String str2 = new String("Java");
	String str3 = new String("Java");
	String str4 = new String("java");
	
	// @stack 메모리 비교(==): 위치(번지) 비교
	System.out.println(str2==str3);
	System.out.println(str3==str4);
	System.out.println(str4==str2);
	
	//@equals(), equalsIgnoreCase(): 내용 비교
	System.out.println(str2.equals(str3));
	System.out.println(str3.equals(str4));
	System.out.println(str3.equalsIgnoreCase(str4));
}	

}

 

 

배열 오름차순, 내림차순으로 출력하기 :

오름차순 : Arrays.sort(정렬시킬배열주소)

내림차순: Arrays.sort(number, Collections.reverseOrder());

(int형 배열에선 오류가 나는데, Collections클래스는 객체만 사용할 수 있기 때문이다. 

int배열 자체는 객체가 맞지만, 각 원소들은 기본 자료형이라 에러가 난다.

변수를 Wrapper 클래스, Integer형으로 바꾸면 해결이 된다.

 

package ex1;

import java.util.Arrays;
import java.util.Collections;

// java.util.Arrays 클래스
public class Ex6_Sort {
public static void main(String[] args) {
	String[] arr = {"Z","X","A","C","B"};
	int[] number = {10,3,11,40,22,12};
	System.out.println("순수하게 출력!");
	for(String e : arr) {
		System.out.println(e);
	}
	for(int e:number) {
		System.out.println(e);
		// Syste.out.prinln(e.); => 객체가 아니라 ㄴㄴ
	}
	System.out.println("===============================");
	System.out.println("arr 정렬해서 출력!");
	// 오름차순 : Arrays.sort(정렬시킬배열주소)
	Arrays.sort(number); //정렬 
	System.out.println("오름차순 정렬 출력!");
	
	for(int e: number) {
		System.out.println(e);
	}
	
	
	System.out.println("======================");
	Arrays.sort(arr);  //정렬
	
	for(String e: arr) {
		System.out.println(e);
	}
	System.out.println("======================");
	//내림차순 Collection.reverseOrder
	System.out.println("String 내림차순 =====================");
	// Collection -> 객체전용 자료구조이다.   
	// sort에서 상세히 자료형 맞추는 이유: int배열은 객체지만 안의 자료형은 일반 자료형이니까
	Arrays.sort(arr, Collections.reverseOrder());
	
	for(int e:number) {
		System.out.println(e);
		}
	
	// Arrays.sort(number, Collections.reverseOrder());
	//오류남  해결 방법: Wrapper 클래스 int -> Integer
	// byte -> Btye 등  변환? 감싸주는 ?  colletions 가 객체만을 위한 함수라서
	//int형 배열로 이용하려면 Wrapper 클래스를 사용해서 Integer클래스로 바꿔줘야 오류가 안난다
	Integer[] number2= {10,3,11,40,22,12};  //int 배열을 Integer 배열로 바꾸면 해결됌 
	Arrays.sort(number2, Collections.reverseOrder());
	System.out.println("Integer 내림차순 ============================");
	for(int e : number2) {
		System.out.println(e);
	}
	/*System.out.println("내림");
	Arrays.parallelSort(number);
	for(int e:number) {
		System.out.println(e);*/
	}
	
	
	
}

 

** 메소드 인자  칸!! 에 배열 표현 가능

(string...a) (int...a) 이런식으로 표기하면 됌 

 

public static void intRing1(Integer...a) {


Arrays.sort(a);
Arrays.sort(a, Collections.reverseOrder());
for(int e: a) {
System.out.print(e+" ");
}


}