본문 바로가기
자바

[Java] 자바에서 문자열을 다루는 방법 - String

by 책 읽는 개발자_테드 2021. 8. 28.
반응형

학습 목표

 · String의 생성자

 · String to byte[]

     - java.nio.Charset 클래스 API에 정의된 표준 캐릭터 셋

 · String 내용을 비교하고 검색하는 메소드

       - 문자열의 길이 확인하는 메소드

       - 문자열이 비어있는지 확인하는 메소드

       - 문자열이 같은지 비교하는 메소드

       - 특정 조건에 맞는 문자열이 있는지 확인하는 메소드

 · String 내에서 위치를 찾아내는 방법

 · String 값의 일부를 추출하기 위한 메소드

       - char 단위의 값을 추출

       - char 배열의 값을 String으로 변환

       - String의 값을 char 배열로 변환

       - 문자열의 일부 값을 잘라내는 메소드 

       - 문자열을 여러 개의 String 배열로 나누는 메소드

 · String 값을 바꾸는 메소드

       - 문자열 합치기

       - 문자열 공백 없애기

       - 문자열 내용 교체

       - 특정 형식에 맞춰 값을 치환

       - 대소문자 바꾸기

       - 기본 자료형을 문자열로 변환 

· 절대 사용하면 안되는 메소드 - intern

 


String의 생성자

생성자 설명
String() 비어있는 String 객체 생성
전혀 의미가 없으므로, 차라리 다음과 같이 선언하는 것이 효율적
String name = null;
String(byte[] bytes) 현재 사용중인 플랫폼의 캐릭터 셋을 사용하여 제공된 byte배열을 디코딩한
String 객체 생성
String(byte[] bytes, Charset charset) 지정한 캐릭터 셋을 사용하여 제공된 byte 배열을 디코딩한 String 객체 생성
String(byte[] bytes, String charsetName) 지정한 이름을 갖는 캐릭터 셋을 사용하여 지정한 byte 배열을 디코딩한 String
객체 생성
String(byte[] bytes, int offset, int length) 현재 사용중인 플랫폼의 기본 캐릭터 셋을 사용하여 지정한 byte 배열의 일부를 디코딩한 String 객체를 생성
String(byte[] bytes, int offset, int length,
String charsetName)
지정한 이름을 갖는 캐릭터 셋을 사용하여 byte 배열의 일부를 디코딩한 String 객체를 생성
String(char[] value) char 배열의 내용을 붙여 String 객체 생성
String(char[] value, int offset, int count) char 배열의 일부 내용을 붙여 String 객체 생성
String(int[] codePoints, int offset,
int count)
유니코드 코드 위치(Unicode code point)로 구성된 배열의 일부로 새로운 String 객체 생성
String(String original) 매개 변수로 넘어온 String과 동일한 값을 갖는 String 객체 생성
String(StringBuffer buffer) 매개 변수로 넘어온 StringBuffer 클래스에 정의되어 있는 문자열의 값과 동일한 String 객체 생성
String(StringBuilder builder) 매개 변수로 넘어온 StringBuilder 클래스에 정의되어 있는 문자열의 값과 동일한
String 객체 생성

예시

        String str = "Hello";
        byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
        String str2 = new String(bytes, StandardCharsets.UTF_8); // byte[] + charset
        String str3 = new String(bytes,"UTF-8"); // byte[] + charsetName

 

String to byte[]

String 클래스에는 현재의 문자열 값을 byte 배열로 변환하는 getBytes() 메소드들이 존재

리턴 타입 메소드 이름 및 매개 변수 설명
byte[] getBytes() 기본 캐릭터 셋의 바이트 배열을 생성
byte[] getBytes(Charset charset) 지정한 캐릭터 셋 객체 타입으로 바이트 배열 생성
byte[] getBytes(String charsetName) 지정한 이름의 캐릭터 셋을 갖는 바이트 배열 생성

 ·  같은 프로그램 내에서 문자열을 byte 배열로 만들 때는 첫 번째 메소드를 사용

 ·  다른 시스템에서 전달 받은 문자열은 (다른 캐릭터 셋일 수도 있어서) 두번째나 세번째 메소드 사용을 추천

 

java.nio.Charset 클래스 API에 정의된 표준 캐릭터 셋

캐릭터 셋 이름 설명
US-ASCII 7비트 아스키
ISO-8859-1 ISO 라틴 알파벳
UTF-8 8비트 UCS 변환 포맷
UTF-16BE 16비트 UCS 변환 포맷. big-endian 바이트 순서를 가진다.
UTF-16LE 16비트 UCS 변환 포맷. little-endian 바이트 순서를 가진다.
UTF-16 16비트 UCS 변환 포맷. 바이트의 순서는 byte-order mark라는 것에 의해서 정해진다.
EUC-KR 8비트 문자 인코딩으로, EUC의 일종이며 대표적인 "한글 완성형" 인코딩
MS949 Microsoft에서 만든 "한글 확장 완성형" 인코딩

 · 사용하는 캐릭터 셋에 따라 배열의 크기가 다름

ex) 한글 두 글자를 표현하는 경우 EUC-KR은 4바이트, UTF-16은 6바이트를 사용

 · 국내에서 개발하면서 자바에서 한글이 몇 바이트를 점유하는지 알아 두는 것은 중요

 

 · 주의! 문자열을 잘못된 캐릭터 셋으로 변환하면 알아 볼 수 없다

예시

        String str = "Hello";
        byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
        String correctedEncoding = new String(bytes, StandardCharsets.UTF_8);
        String incorrectedEncoding = new String(bytes, StandardCharsets.UTF_16);
        System.out.println(correctedEncoding);
        System.out.println(incorrectedEncoding);

결과

 

String 내용을 비교하고 검색하는 메소드

문자열의 길이 확인하는 메소드

리턴 타입 메소드 이름 및 매개 변수
int length()

 

문자열이 비어있는지 확인하는 메소드

리턴 타입 메소드 이름 및 매개 변수
boolean isEmpty

 

문자열이 같은지 비교하는 메소드

리턴 타입 메소드 이름 및 매개 변수 설명
boolean equals(Object anObject) 문자열 객체가 매개변수로 넘어온 객체와 같은지 비교
boolean equalsIgnoreCase(String anotherStr) 대소문자를 구분하지 않고 equals 메소드를 실행
int compareTo(String anotherStr)  · 입력된 문자열 객체가 알파벳 순으로 앞에 있으면 양수, 뒤에 있으면 음수, 같으면 0리턴
 · 알파벳 순서만큼 숫자값이 커짐
 · 정렬(sorting)에 주로 사용
int compareToIgnoreCase(String str) 대소문자를 구분하지 않고 compareTo 메소드를 실행
boolean contentEquals(CharSequence cs) 문자열 객체가 매개변수로 넘어온 CharSequence 객체와 같은지 비교
boolean contentEquals(StringBuffer sb) 문자열 객체가 매개변수로 넘어온 StringBuffer 객체와 같은지 비교

 

특정 조건에 맞는 문자열이 있는지 확인하는 메소드

리턴 타입 메소드 이름 및 매개 변수 설명
boolean startsWith(String prefix) 매개변수로 넘겨준 값으로 시작하는지 확인
boolean startsWith(String prefix, int toffset) 매개변수로 넘겨준 값으로 시작하는지 확인
 - toffset: 비교 대상 문자열의 확인 시작 위치를 지정
boolean endsWith(String suffix) 매개변수로 넘겨준 값으로 끝나는지 확인
boolean contains(CharSequence s) 매개변수로 넘겨준 값이 문자열에 존재하는지 확인
boolean matches(String regex) 매개변수로 넘겨준 정규 표현식 값이 문자열에 존재하는지 확이니
boolean regionMatches(boolean ignoreCase,
int toffset, String other, int ooffset, int len)
 · 문자열 중에서 특정 영역이 매개 변수로 넘어온 문자열과 동일한지 확인 
 · 대소문자 구분 여부 선택 가능
 - ignoreCase: true일 경우 대소문자 구분을 하지 않고, 값을 ㅂ교 
 - toffset: 비교 대상 문자열의 확인 시작 위치를 지정
 - other: 존재하는지 확인할 문자열
 - oofset: other 객체의 확인 시작 위치를 지정
 - len: 비교할 char의 개수를 지정
boolean regionMatches(int toffset, String other,
int ooffset, int len)
 · 문자열 중에서 특정 영역이 매개 변수로 넘어온 문자열과 동일한지 확인 
 · 대소문자 구분 여부 선택 불가

 · startsWith, endsWith 메소드로 indexOf() 메소드가 문자열의 모든 내용을 확인하는 단점 보완 가능

 · 정규 표현식은 이메일, 웹페이지 URL 등 공식에 따라 만든 식을 말한다 ex) 010-xxxx-xxxx, xxxx@naver.com

 

String 내에서 위치를 찾아내는 방법

리턴 타입 메소드 이름 및 매개 변수 설명
     int indexOf(int ch) 매개변수로 넘겨준 char를 왼쪽에서 오른쪽 방향으로 찾아 위치를 반환
indexOf(int ch, int fromIndex) 매개변수로 넘겨준 char를 fromIndex 위치부터 오른쪽 방향으로 찾아 위치를 반환
indexOf(String str) 매개변수로 넘겨준 문자열을 왼쪽에서 오른쪽 방향으로 찾아 위치를 반환
indexOf(String str, int fromIndex) 매개변수로 넘겨준 문자열을 fromIndex 위치부터 오른쪽 방향으로 찾아 위치를 반환
lastIndexOf(int ch) 매개변수로 넘겨준 char를 오른쪽에서 왼쪽 방향으로 찾아 위치를 반환
lastIndexOf(int ch, int fromIndex) 매개변수로 넘겨준 char를 fromIndex 위치부터 왼쪽 방향으로 찾아 위치를 반환
lastIndexOf(String str) 매개변수로 넘겨준 문자열을 오른쪽에서 왼쪽 방향으로 찾아 위치를 반환
lastIndexOf(String str, int fromIndex) 매개변수로 넘겨준 문자열을 fromIndex 위치부터 왼쪽 방향으로 찾아 위치를 반환

 · char는 정수형이므로, 매개변수가 int인 메소드에 char를 넘겨주면 자동으로 형 변환이 일어남

 

String 값의 일부를 추출하기 위한 메소드

char 단위의 값을 추출

리턴 타입 메소드 이름 및 매개 변수 설명
char charAt(int index)       특정 위치의 char 값을 리턴
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)  · 매개 변수 dst라는 char 배열 내에 srcBegin에서 srcEnd에 있는 char를 저장
 · dst 배열의 시작위치는 dstBegin
int codePointAt(int index) · 특정 위치의 유니코드 값을 리턴
· 리턴 타입은 int지만, 이 값을 char로 형 변환하면 char 값을 출력
int codePointBefore(int index) · 특정 위치 앞에 있는 char의 유니코드 값을 리턴
· 리턴 타입은 int지만, 이 값을 char로 형 변환하면 char 값을 출력
int codePointCount(int beginIndex,
int endIndex)
지정한 범위에 있는 유니코드 개수 리턴
int offsetByCodePoints(int index,
int codePointOffset)
지정된 index부터 offset이 설정된 인덱스를 리턴

· offsetByCodePoints() 메소드드의 용도: 문자열 인코딩과 관련된 문제를 해결

 

char 배열의 값을 String으로 변환

리턴 타입 메소드 이름 및 매개 변수 설명
static String copyValueOf(char[] data) char 배열에 있는 값을 문자열로 변환
static String copyValueOf(char[] data, int offset, int count) · char 배열에 있는 값을 문자열로 변환
· 단, offset 위치부터 count까지의 개수만큼만 문자열로 변환

 

String의 값을 char 배열로 변환

리턴 타입 메소드 이름 및 매개 변수 설명
char[] toCharArray() 문자열을 char 배열로 변환하는 메소드                                                                                                                                                                                             

· 어떠한 String 객체를 만들더라도, 그 객체는 내부에 char 배열을 포함 

문자열의 일부 값을 잘라내는 메소드 

리턴 타입 메소드 이름 및 매개 변수 설명
String substring(int beginIndex) beginIndex부터 끝까지 대상 문자열을 잘라 String으로 리턴
String substring(int beginIndex,
int endIndex)
beginIndex부터 endIndex까지 문자열을 잘라 String으로 리턴
CharSequence subSequence(int beginIndex,
int endIndex)
beginIndex부터 endIndex까지 문자열을 잘라 CharSequence 타입으로 리턴

 

문자열을 여러 개의 String 배열로 나누는 메소드 - Split()

리턴 타입 메소드 이름 및 매개 변수 설명
String[] split(int regex) regex에 있는 정규 표현식에 맞추어 문자열을 잘라 String 배열로 리턴
String[] split(int regex, int limit) · regex에 있는 정규 표현식에 맞추어 문자열을 잘라 String 배열로 리턴
· 이때 String 배열의  크기는 limit 보다 크면 안된다.

· 자바에서 문자열을 여러 개의 문자열 배열로 나누는 방법:

1. String 클래스의 split() 메서드: 정규 표현식을 사용하여 문자열 나누기

2. java.util.StringTokenizer 클래스: 특정 String으로 문자열 나누기

이때 특정 알파벳이나 기호 하나로 나누려고 한다면 둘 중 무엇을 사용해도 상관 x

 

· split 조건(구분자)을 여러 개 사용하기 

split() 메서드 인자로 입력하는 구분자를 '|' 문자로 나누어 여러 개 입력한다.

 

String str = "1@2#3@4&&5";

String splittedStrArr[] = str.split("#|@|&");
for (String splittedStr : splittedStrArr) {
   System.out.print(splittedStr);
}

결과

 

String 값을 바꾸는 메소드

문자열 합치기

리턴 타입 메소드 이름 및 매개 변수 설명
String concat(String str) 매개 변수로 받은 str을 기존 문자열의 우측에 붙인 새로운 문자열 객체를 생성하여 리턴

 

문자열 공백 없애기

리턴 타입 메소드 이름 및 매개 변수 설명
String trim() 문자열의 맨 앞과 맨 뒤에 있는 공백들을 제거한 문자열 객체를 리턴

 

예시 - 공백을 제외한 char 값이 하나라도 존재하는지 확인

        String text = " a ";
        if(text!=null && text.trim().length() > 0)
            System.out.println("OK");

결과

 

문자열 내용 교체

리턴 타입 메소드 이름 및 매개 변수 설명
String replace(char oldChar, char newChar) 해당 문자열에 있는 oldChar의 값을 newChar로 대치
String replace(CharSequence target, 
CharSequence replacement)
해당 문자열에 있는 target과 같은 값을 replacement로 대치
String replaceAll(String regex, String replacement) 해당 문자열의 내용 중 regex에 표현된 정규 표현식에 포함되는 모든 내용을 replacement로 대치
String replaceFirst(String regex, String replacement) 해당 문자열의 내용 중 regex에 표현된 정규 표현식에 포함되는 첫번쨰 내용을 replacement로 대치

· 주의! - 위 메소드를 수행해도 기존 문자열이 바뀌는 것은 아니다(바뀐 문자열을 반환함)

· replace 관련 메소드는 대소문자를 구분

· replace vs replaceAll의 차이 https://jamesdreaming.tistory.com/85

 

· 특정 문자열 사이의 문자열 추출하기

'구분자A추출을원하는문자열구분자B' 형태의 문자열이 있을 때, '추출을원하는문자열'만 추출하고 싶다면

아래 형식의 정규식을 replaceAll() 메서드의 인자로 넣어서 해결할 수 있다.

 

[구분자A](.*?)[구분자B]

 

replaceAll() 메서드의 첫 번째 인자는 정규식, 두 번째 인자는 대체하길 원하는 문자열을 의미한다.

아래 코드는 추출을 원하는 문자열 앞 뒤의 "||" 문자열을 공백으로 바꾸는 예제다.

 

String str = "||innerContent||";
String regExpression = "[||](.*?)[||]";
String replacedStr = str.replaceAll(regExpression, "");
System.out.println(replacedStr);

결과

https://pingukim.tistory.com/13

 

특정 형식에 맞춰 값을 치환

리턴 타입 메소드 이름 및 매개 변수 설명
static String format(String format, Object... args) format에 있는 문자열의 내용 중 변환해야 하는 부분을 args의 내용으로 변환
static String format(Locale l, String format, Objecct... args · format에 있는 문자열의 내용 중 변환해야 하는 부분을 args의 내용으로 변환
· 단, Locale 타입 l에 선언된 지역에 맞추어 출력

· 자바에서는 %s는 String, %d는 정수형, %f는 소수점이 있는 숫자, %%는 %를 의미 (자세한 내용 java.util.Formatter 참조)

· 출력만을 위해서라면 해당 메소드 대신 System.out.format() 메소드를 사용할 수 있음

· 대치해야할 문자열 보다 매개변수가 적게 나열되면 MissingFormatArgumentException 발생

· Locale은 지역적으로 다른 표현 형식을 제공하기 위한 것으로, 지정하지 않으면 자바 프로그램이 수행되는 OS의 지역 정보를 따름

 

예시

        String text = "이름:%s 나이:%d 시력:%f 재산상위:%d%%";
        String realText = String.format(text, "Ted",28,0.5,50);
        System.out.println(realText);

결과

대소문자 바꾸기

리턴 타입 메소드 이름 및 매개 변수 설명
String toLowerCase() 모든 문자열의 내용을 소문자로 변경
String toLowerCase(Locale locale) 지정한 지역 정보에 맞추어 모든 문자열의 내용을 소문자로 변경
String toUppserCase() 모든 문자열의 내용을 대문자로 변경
String toUppserCase(Locale locale) 지정한 지역 정보에 맞추어 모든 문자열의 내용을 대문자로 변경

 

기본 자료형을 문자열로 변환

리턴 타입 메소드 이름 및 매개 변수
static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(char[] data)
static String valueOf(char[] data, int offset, int count)
static String valueOf(double d)
static String valueOf(float f)
static String valueOf(int i)
static String valueOf(long l)
static String valueOf(Object obj)

· 기본 자료형을 String과 합치는 과정을 거치면, 기본 자료형이 String으로 자동으로 바뀐다. (이때는 valueOf가 필요 없다.)

· valueOf 메소드에 null인 객체를 넘겨주면 "null"이라는 문자열을 리턴

 

예시

        byte b=1;
        String byte1=String.valueOf(b);
        String byte2=b+byte1;

절대 사용하면 안되는 메소드 - intern

· 문자열에 대해 String.intern()을 수행하면 동일한 내용을 가진 모든 문자열이 동일한 메모리를 공휴하게 된다.

예시

        String text = "java";
        String text2 = new String("java");
        System.out.println(text==text2);
        text2 = text2.intern();
        System.out.println(text==text2);

결과

· 사용하면 심각한 성능 저하를 발생시킬 수도 있음

     - 새로운 문자열을 계속 만드는 프로그램에서 intern() 메소드를 사용하여 억지로 문자열 풀에 값을 할당하게 만들면, 저장되는 영역은 한계가 있으므로 그 영역에 대해서 별도로 메모리를 청소하는 단계를 거치게 된다. 따라서, 작은 연산 하나를 빠르게 하기 위해 전체 자바 스스템 성능에 악영향을 주게 된다.

· 자바가 아닌 C로 구현된 native 메소드

 

추가내용 

String 효율적으로 사용하기 (StringBuilder, StringBuffer, StringJoiner, Collectors.joining)

https://scshim.tistory.com/64

 

출처

자바의신 

https://stackoverflow.com/questions/10578984/what-is-java-string-interning

반응형

댓글