hyeonga_code
Java의 신_Chapter 15_String 본문
2024.03.28
- String
public final class String extends Object implements Serializable, Comparable<String>, CharSequence
-- public : 누구나 사용할 수 있다.
-- final : 클래스에 final이 선언되는 경우 더이상 확장할 수 없다. (자식 클래스를 생성할 수 없다)
-- extends Object : 최상위 클래스를 확장한 클래스로 다른 클래스를 확장하지 않았다.
-- implements : 이후 인터페이스에 선언된 메소드를 구현한 클래스다.
---- Serializable : 해당 객체를 파일로 저장하거나 다른 서버에 전송이 가능한 상태가 된다.
------ 구현할 메소드가 하나도 없다
---- Comparable<String> :
------ <String> : 제네릭으로 이후 자세하게 다룰 것
------ compareTo() : 매개 션수로 넘어가는 객체와 현재 객체가 같은지를 비교
-------- equals() 메소드와 유사하나 리턴 타입이 int형이다. (동일: 0, 순서 상 앞: -1, 순서 상 뒤 : 1)
---- CharSequence : 해당 클래스가 문자열을 다루는 클래스라는 것을 명시적으로 나타내는 데에 사용
String 변수이름 = "문자열";
String 변수이름 = new String("문자열");
-- 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, Charset charset)
---- 지정된 캐릭터셋을 사용하여 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)
---- 유니코드 코드 위치로 구성되어 있는 배열의 일부를 새로운 String 객체를 생성
String(String original)
---- 매개변수로 넘어온 String과 동일한 값을 갖는 String 객체 복사본을 생성
String(StringBuffer buffer)
---- 매개변수로 넘어온 StringBuffer 클래스에 정의되어 있는 문자열의 값과 동일한 String 객체를 생성
String(StringBuilder builder)
---- 매개변수로 넘어온 StringBuilder 클래스에 정의되어 있는 문자열의 값과 동일한 String 객체를 생성
---- 우리나라에서 가장 많이 사용되는 생성자
String(byte[] bytes)
String(byte[] bytes, Strikng charsetName)
------ 대부분의 언어에서는 문자열을 변환할 때 기본적으로 영어로 해석하기 때문
-- String 문자열을 byte로 변환
---- 생성자의 매개 변수로 받는 byte 배열을 생성하려면 String 클래스의 getBytes()메소드를 사용한다.
byte[] getBytes()
// 기본 캐릭터 셋의 바이트 배열을 생성한다.
byte[] getBytes(Charset charset)
// 지정한 캐릭터 셋 객체 타입으로 바이트 배열을 생성한다.
byte[] getBytes(String charsetName)
// 지정한 이름의 캐릭터 셋을 갖는 바이트 배열을 생성한다.
-- java.nio.Charset
---- 한글을 처리하기 위해 현재 UTF-16을 많이 사용한다.(이전 UTF-8 / EUC-KR)
---- US-ASCII
------ 7비트 아스키
---- ISO-8859-1
------ ISO 라틴 알파벳
---- UTF-8
------ 8비트 UCS_Unicode Character Set 변환 포맷
---- 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에서 만든 한글 확장 완성형 인코딩
package encoding.string;
public class StringSample{
public static void main(String[] args) {
StringSample sample = new StringSample();
sample.convert();
} //end main
public void convert() {
try{
String korean = "한글";
byte[] arr1 = korean.getBytes();
printByte(arr1); // -57 -47 -79 -37
printString(arr1); // 한글
byte[] arr2 = korean.getBytes("UTF-16");
printByte(arr2); // -2 -1 -43 92 -82 0
printString(arr2); // 글씨 깨짐
String korean3 = new String(arr2, "UTF-16");
System.out.println(korean3); // 한글
} catch (Exception e) {
e.printStackTrace();
} //end try-catch
} //end convert()
// byte 배열 출력
public void printByte(byte[] array) {
for(byte data : array) {
System.out.print(data + " " );
}
System.out.println();
}
// 문자열 출력
public void printString(byte[] array) {
System.out.println(new String(array));
}
} //end class
---- EUC-KR > "한글"을 처리하기 위해 4바이트 사용
---- UTF-16 > "한글"을 처리하기 위해 6바이트 사용
-- try-catch문으로 작성한 이유
---- 캐릭터 셋을 지정하는 메소드와 생성자 때문
------ byte 배열과 String 타입의 캐릭터 셋을 받는 생성자
------ getBytes() 메소드 중 String 타입의 캐릭터 셋을 받는 메소드
>>> UnsupportedEncodingException을 발생시킬 수 있다.
------ 존재하지 않는 캐릭터 셋의 이름을 지정하는 경우 발생
-- 객체를 처리할 때에는 반드시 Null을 체크해야 한다.
---- 어떤 참조 자료형도 null이 될 수 있다.
---- 아무런 초기화가 되어있지 않고, 클래스에 선언되어 있는 어떤 메소드도 사용할 수 없다.
---- null을 체크하지 않는 경우 객체에 사용할 수 있는 메소드들은 모두 예외를 발생시킨다.
package check.null;
public class NullCheck {
public static void main(String[] args){
NullCheck sample = new NullCheck();
sample.nullCheck(null);
}
public boolean nullCheck(String text) {
if(text == null)
return true;
return false;
}
}
-- String 메소드
int length()
// 문자열의 길이를 리턴
---- 배열의 길이를 확인하는 경우 length를 사용
--- 공백도 길이에 포함된다.
boolean isEmpty()
// 문자열이 비어있는 경우 true 비어있지 않은 경우 false
---- 공백으로 이루어진 문자는 false를 리턴한다.
-- 문자열이 같은지 비교하는 메소드
---- Ignore가 붙는 경우 대소문자_Case를 구분하지 않는다.
-- equals()
boolean equals(Object anObject)
String text1 = "Check";
String text2 = "Check";
text1 == text2 // 같다
/*
Constant Pool
-- 객체를 재사용하기 위한 것
-- String의 경우 동일한 값을 갖는 객체가 있는 경우 이미 생성된 객체를 사용한다.
*/
String text3 = new String("Check");
text1 != text3 // 다르다
/*
값을 재활용하지 않고 별도의 객체를 생성하여 다른 객체로 인식한다.
*/
text1.equals(text2) // 같다
text1.equals(text3) // 같다
-- equalsIgnoreCase() : 대소문자를 무시하고 비교
boolean equalsIgnoreCase(String anotherStr)
String text1 = "Check";
String text2 = "check";
text1.equalsIgnoreCase(text3) // 같다
-- compareTo() : 정렬
int compareTo(String anotherStr)
String text1 = "a";
String text2 = "b";
String text3 = "C";
text2.compareTo(text1); // 1
text2.compareTo(text3); // -1
text1.compareTo(text3); // -2
-- 원래값.compareTo(비교값);
---- 원래값이 비교값보다 뒤에 있는 경우 양수
---- 원래 값이 비교값보다 앞에 있는 경우 음수
-- compareToIgnoreCase() : 대소문자를 구분하지 않고 정렬
int compareToIgnoreCase(String str)
String text1 = "a";
String text2 = "B";
String text3 = "C";
text2.compareTo(text1); // 1
text2.compareTo(text3); // -1
text1.compareTo(text3); // -2
-- contentEquals() : 매개변수로 넘어오는 객체가 String 객체와 같은지 비교
boolean contentEquals(CharSequence cs)
boolean contentEquals(StringBuffer sb)
-- 특정 조건에 밪는 문자열이 있는지 확인하는 메소드
boolean startWith(String prefix)
// 매개변수로 넘어온 값으로 시작하는지 확인
// indexOf()메소드는 문자열의 모든 내용을 전부 확인해봐야 하는 단점이 있다.
boolean startWith(String prefix, int toffset)
boolean endsWith(String suffix)
// 매개변수로 넘어온 값으로 끝나는지 확인
boolean contains(CharSequence s)
// 매개변수로 넘어온 값이 문자열에 존재하는지 확인
boolean matches(String regex)
// 매개변수로 넘어온 값이 정규 표현식_Regular Expression으로 되어 있어야만 한다.
// 문자열 중 특정 영역이 매개변수로 넘어온 문자열과 동일한지 확인
boolean regionMatches(boolean ignoreCase, int toffset, String other, int offset, int len)
boolean regionMatches(int toffset, String other, iont ooffset, int len)
/*
-- ignoreCase : true인 경우 대소문자 구분을 하지 않는다.
-- toffset : 비교 대상 문자열의 확인 시작 위치를 지정한다.
-- other : 존재하는지 확인할 문자열
-- offset : other 객체의 확인 시작 위치를 지정한다.
-- len : 비교할 char의 개수를 지정한다.
*/
-- regionMatches() 메소드가 무조건 false가 되는 경우
---- toffset이 음수
---- ooffset이 음수
---- toffset + len 값이 비교 대상의 길이보다 큰 경우
---- ooffset + len 값이 other 객체의 길이보다 큰 경우
---- ignoreCase가 false인 경우 > 비교 범위의 문자들 중 같은 위치에 있는 char가 다를 때
---- ignoreCase가 true인 경우 > 비교 범위의 문자들을 모두 소문자로 변경한 후 같은 위치에 있는 char가 다를 때
- 위치를 찾는 메소드
-- indexOf() : 문자열의 앞에서부터 검색
int indexOf(int ch)
int indexOf(int ch, int fromIndex)
int indexOf(String str)
int indexOf(String str, int fromIndex)
// fromIndex : 찾기 시작하는 위치
-- lastIndexOf() : 문자열의 끝에서부터 검색
int indexOf(int ch)
int indexOf(int ch, int fromIndex)
int indexOf(String str)
int indexOf(String str, int fromIndex)
// fromIndex : 찾기 시작하는 위치
- 일부 값을 추출하는 메소드
-- char 단위의 값을 추출
char charAt(int index)
// 특정 위치의 char 값을 리턴
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
// 매개변수로 넘어온 dst 배열의 dstBegin의 위치부터 srcBegin에서 srcEnd에 있는 char를 저장
int codePointAt(int index)
// 특정 위치의 유니코드 값을 리턴(char 로 형변환 시 출력 가능)
int codePointBefore(int index)
// 특정 위치 앞에 있는 char의 유니코드 값을 리턴
int codePointCount(int beginIndex, int endIndex)
// 지정 범위 내의 유니코드 개수를 리턴
int offsetByCodePoints(int index, int codePointOffset)
// 지정 index 부터 offset이 설정된 인덱스를 리턴
-- 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 substring(int beginIndex)
// beginIndex 부터 끝까지 대상 문자열을 잘라 String으로 리턴
String substring(int beginIndex, int endIndex)
// beginIndex 부터 endIndex 까지 대상 문자열을 잘라 String으로 리턴
CharSequence subSequence(int beginIndex, int endIndex)
// beginIndex 부터 endIndex 까지 대상 문자열을 잘라 CharSequence으로 리턴
---- endIndex 는 beginIndex + 원하는 길이 로 지정해야 한다.
------ StringIndexOutOfBoundsException 발생
-- 문자열을 여러 개의 String 배열로 변환
String[] split(String regex)
// regex에 있는 정규 표현식에 맞추어 문자열을 잘라 String 배열로 리턴
String[] split(String regex, int limit)
// regex에 있는 정규 표현식에 맞추어 문자열을 잘라 String 배열로 리턴
// 배열의 크기가 limit보다 커서는 안된다
- String 값을 변경
-- 문자열 결합
String concat(String str)
// 매개 변수로 넘어온 str을 기본 문자열의 뒤에 연결한 새로운 문자열 객체를 생성하여 리턴
-- 문자열 공백 제거
String trim()
// 문자열의 맨 앞과 맨 뒤에 있는 공백을 제거한 문자열 객체를 리턴
-- 문자열 내용 교체
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로 대치
-- 특정 형식에 맞춰 값을 치환
static String format(String format, Object... args)
// format에 있는 문자열의 내용 중 변환해야 하는 부분을 args의 내용으로 변경한다.
static String format(Locale l, String format, Object... args)
// format에 있는 문자열의 내용 중 변환해야 하는 부분을 args의 내용으로 변경하는데
// 첫 매개 변수인 Locale에 선언된 지역에 맞추어 출력한다.
---- %s : String
---- %d : 정수형
---- %f : 소수점이 있는 숫자
---- %% : %
---- 대치해야 하는 문자의 개수보다 매개변수가 적은 경우 MissingFormatArgumentException이 발생한다.
-- 대소문자 변경
String toLowerCase()
// 모든 문자열을 소문자로 변경
String toLowerCase(Locale locale)
// 지정 지역 정보에 맞춰 모든 문자열을 소문자로 변경
String toUpperCase()
// 모든 문자열을 대문자로 변경
String toUpperCase(Locale locale)
// 지정 지역 정보에 맞춰 모든 문자열을 대문자로 변경
-- 기본 자료형을 문자열로 변환
satic String valueOf(boolean b)
satic String valueOf(char c)
satic String valueOf(char[] data)
satic String valueOf(char[] data, int offset, int count)
satic String valueOf(double d)
satic String valueOf(float f)
satic String valueOf(int i)
satic String valueOf(long l)
satic String valueOf(Object obj)
// 넘어온 Object가 null인 경우 "null"을 반환
- StringBuffer 와 StringBuilder
-- StringBuffer는 Thread safe하다.
-- StringBuiler는 Thread safe하지 않다.
---- Thread safe 하지 않는 클래스의 속도가 보다 빠르다.
-- String과 다르게 새로운 객체를 생성하지 않는다.
-- + 연산자가 아닌 append()를 사용하여 문자열을 추가한다.
StringBuilder builder = new StringBuilder();
builder.append("Hello");
builder.append(" world");
builder.append(" Hello").append(" world");
// .append()메소드를 수행한 후 StringBuilder 객체가 리턴 되므로 붙여 사용해도 무관하다.
---- JDK5 이상에서는 String의 더하기 연산을 하는 경우 컴파일 시 자동으로 StringBuilder로 변환한다.
---- for 루프와 같은 반복 연산을 하는 경우 자동으로 변환해주지 않는다.
---- 매개변수로 받는 작업을 하는 경우 CharSequence 타입으로 받는 것이 효율적이다.
---- 하나의 메소드 내에서 문자열을 생성하여 더하는 경우 StringBuilder를 사용한다.
---- 문자열을 생성하여 더하기 위한 문자열을 처리하기 위한 인스턴스 변수가 선언되고, 여러 스레드에서 변수에 동시 접근하는 경우 StringBuffer를 사용하는 것이 좋다.
'Java' 카테고리의 다른 글
Java의 신_Chapter 17_Annotation (0) | 2024.03.29 |
---|---|
Java의 신_Chapter 16_Nested Class (0) | 2024.03.29 |
Java의 신_Chapter 14_Exception (0) | 2024.03.28 |
Java의 신_Chapter 13_Interface, enum (0) | 2024.03.28 |
Java의 신_Chapter 12_Object (0) | 2024.03.28 |