[문자열] String - split(), StringBuffer, StringTokenizer

포키·2022년 12월 1일
0

국비과정

목록 보기
36/73

String도 복수데이터. 복수데이터를 다루는 방식으로 사용할 수 있다.


String 문자열

  • 문자(character) + 열(순서O 복수데이터)

    String implements interface Serializable, interface CharSequence, interface Comparable<String>

  • 사실 문자열은 interface CharSequence를 의미한다.
    String이 CharSequence를 구현하는 대표 클래스이므로 일반적으로 String을 문자열이라고 부르는 것이며, 정확한 표현이 아니다.

  • String은 상수다. (Strings are constant for being shared)
    (class StringBuffer은 변화가능한 String을 지원한다.)

String objects can be shared


일반적으로 String을 생성하는 방식은 "abc"인데, 이것의 진짜 의미는new String("abc").intern()이다.
String 객체는 생성되면 String Pool에 들어간다.
intern()은 컴퓨터는 해당 String이 String Pool 안에 있는지 확인하고, 이미 존재하면 String을 새로 생성하는 대신 기존 String을 사용한다.
만약 'new String("abc")'를 사용하여 생성한다면(즉 intern()없이 생성된다면) String Pool를 확인하지 않는다.

	String str1 = "abc";
    String str2 = new String("abc").intern();
    
    String str3 = new String("abc");

'String Pool' 관련 참고

Integer is constant???

호출을 표현하는 두 단어

  • call : 명시적 호출 - 참조연산자 등
  • invoke : 명시적 호출 없이 자동으로 불리는 것
  • callback : 시스템 차원에서 자동으로 호출됨(invoked)
    ex) main(String[] args) (자동호출)
    ex) finalize() (called by garbage collector)

String 주요 메서드

  • charAt(int index) : index번 문자를 반환
  • 💘length() : 문자열의 글자수를 반환
  • toUpperCase() : 대문자로 변환
    toLowerCase() : 소문자로 변환
  • compareTo(String str)
    compareToIgnoreCase(String str) : 대소문자 구분없이 비교
  • equals(String str)
    equalsIgnoreCase(String str) : 대소문자 구분없이 일치여부 판단
  • trim() : 문자열에서 앞뒤 여백을 제거한 새 문자열을 반환 (중간 여백은 제거되지 않음)
  • concat(String str) : 기존 문자열에 패러미터 문자열을 더한 새 문자열을 반환
  • contains(String str) : 문자열이 str을 포함하는지 확인
  • 💘 indexOf(String str) : 문자열에서 str을 찾아 index 반환
    indexOf(String str, int fromIndex) : indexOf()에 시작점 추가
    lastIndexOf(String str, int fromIndex) : indexOf() 역방향 검색
  • 💘 substring(int biginIndex) : biginIndex부터 끝까지 반환
    substring(int biginIndex, int endIndex) : biginIndex부터 endIndex - 1까지 반환
  • replace(CharSequence target, CharSequence replacement) : 문자열 찾아서 교체
  • startsWith(String str) : 해당 문자열로 시작하는지 확인 (return : boolean)
    endsWith(String str) : 해당 문자열로 끝나는지 확인 (return : boolean)
  • 💘 split(String 구분자) : 구분자 기준으로 문자를 잘라 String[]로 반환
  • 'indexOf()로 인덱스 찾고, substring으로 자른다.' <- 둘은 한 세트, 매우 중요

  • 메서드의 다양한 활용
    ex) lastIndexOf() 사용하여 확장자만 떼어오기, startWith(), endsWith()으로 저장 경로, 확장자 구별하기

  • 어떤 메서드를 사용하더라도 기존 String은 변경되지 않는다. ('String is constant')

  • Integer.toHexString(int num) : num을 16진수(String)으로 변환
    (16진수는 자릿수 없이 숫자만 읽는다.)

StringBuffer

메서드

  • String의 메서드 대부분 사용 가능
  • append(String str) : 문자열 뒤에 추가
  • insert(int offset, String str) : 문자열의 offset번째 자리에 추가
    (append()insert()는 패러미터로 기본데이터형이 모두 가능)
    (return : StringBuffer(=this) <- 때문에 연달아 사용이 가능)
  • delete(int start, int end) : 문자열의 start에서 end - 1까지 제거
  • reverse() : 문자열을 뒤집어 반환
  • toString() : String 객체로 변환
  • string과 StringBuffer는 배열과 리스트 비슷한 관계

StringTokenizer 클래스

  • 구분자 기준으로 문자열을 나누어 토큰으로 저장하는 클래스
  • 기본 구분자(delimiter) : 공백, 탭, 엔터 등
	the space character (), the tab character (t), the newline character (n), 
	the carriage-return character (r), and the form-feed character (f).
  • StringTokenizer(String line, String delim) - 생성자
  • countTokens() : 토큰 개수 (int) 반환
  • nextToken() : 다음 token(String)을 반환
  • hasMoreTokens() : 다음 token이 존재하는지 확인
import java.util.*;
class StringTokenizerEx {
	public static void main(String[] args) {
		String line = "이/또한@흘러#가리 라!";
		
		StringTokenizer st = new StringTokenizer(line, "/@#");
		// 구분자 기준으로 (default 구분자 = " ", /t, /n) 문자열을 나누어 토큰으로 저장함
		// 구분자를 따로 입력해주면 디폴트 구분자는 적용되지 않는다!

		System.out.println(st.countTokens());
		// countTokens() : 보유한 토큰의 개수를 알려줌
		// '꺼내기 전부터 개수를 알 수 있다' = 배열로 사용할 수 있다

		while(st.hasMoreTokens()) {
			String token = st.nextToken();
			// iterator와 비슷한 방식이지만, iterator가 아닌 <interface> Enumeration 방식을 사용함
			System.out.println(token);
			// 우리는 찾는 내용에 따라 자른거고, 이건 구분자 기준으로 자른 것. (기존에 사용한 방식이 훨씬 정교하게 사용 가능)
			// 사용법이 간단할수록 활용폭은 좁다는 법칙
		}

		st = new StringTokenizer(line, "/@#");
		
		String[] tokens = new String[st.countTokens()];
		int idx = 0;
		while(st.hasMoreTokens()) {
			String token = st.nextToken();
			tokens[idx] = token;
			idx++;
		}

		System.out.println(Arrays.toString(tokens));
	}
}

split() 메서드 vs StringTokenizer

  • 참고
  • StringTokenizer는 legacy 클래스이며, 공식 문서에서도 split() 메서드 사용을 권장한다.
    StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.
profile
welcome

0개의 댓글