hyeonga_code

Java의 신_Chapter 15_String 본문

Java

Java의 신_Chapter 15_String

hyeonga 2024. 3. 29. 05:59
반응형

 

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