Notice
Recent Posts
Recent Comments
«   2024/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
Archives
Today
Total
관리 메뉴

DeFacto-Standard IT

[Java] String Class 본문

Java/Useful Classes

[Java] String Class

defacto standard 2017. 10. 2. 13:53

String Class와 StringBuffer Class

문자형 배열 변수(char[])를 인스턴스 변수로 정의해놓는다.


String 객체가 한 번 생성된다면 이를 변경하는 것은 불가능하며, 읽어오는 것만 가능하다.


만약 '+' 연산자를 사용해서 문자열을 이어붙이는 경우, 수정이 되는 것이 아니라 새로운 String 객체를 만들어서 다시 바인딩하는 것이다.


만약 문자열 간의 합성이나, 문자 추출 등 문자열을 다루는 작업이 많다면 String보다는 StringBuffer 클래스를 사용하는 것이 좋다.

StringBuffer 객체는 문자열 변경이 가능하다.


String을 사용하는 경우 역시 charAt 등의 연산이 제공되기는 하기때문에 특정 인덱스의 char 값을 구하는 것은 가능하다.


String 객체의 비교

String객체를 만들 때 문자열을 저장하는 방법은

문자열 리터럴을 저장하는 방법

String 클래스의 생성자를 사용하는 방법

2가지가 있다. 이 것에는 두 문자를 비교할 때 비교연산에 따라 차이를 나타낼 수 있다.


equals()를 사용하면 두 문자열의 내용값을 비교하기 때문에 두 경우 모두 true의 결과를 얻는다.

'==' 연산을 사용하는 경우는 말이 달라진다.


 - 리터럴로 문자열을 생성한 경우

같은 내용의 문자열들은 모두 하나의 String인스턴스를 참조하도록 되어있다. 어차피 String인스턴스가 저장하고 있는 문자열은 변경이 불가하기 때문에 문제가 없다.

이 경우 같은 문자열을 의미하는 객체 2개에 대해 '==' 연산을 수행하면 true가 된다. 두 객체가 같은 리터럴 값을 저장한 주소값을 가리키기 때문이다.

즉, 리터럴로 문자열을 생성하면 리터럴 값에 대한 메모리가 할당이 되고, String 객체 2개가 이 리터럴이 저장된 주소를 참조한다.

모든 클래스 파일에는 constant pool 이라는 상수목록이 있어서, 여기에 클래스 내에서 사용되는 모든 리터럴과 상수들이 저장된다.


String str1 = "abc";

String str2 = "abc";

-> str1 == str2 는 true


 - String 클래스의 생성자를 이용하여 생성한 경우

new 연산자에 의해 메모리할당이 이루어지기 때문에 항상 새로운 String 인스턴스가 생성된다.

각 인스턴스마다 참조하는 리터럴의 주소값이 다르다. 

이 경우 같은 문자열을 의미하는 객체 2개에 대해 '=='연산을 수행하면 false가 된다. 두 객체가 다른 리터럴 값을 저장한 주소값을 가리키기 때문이다.


String str1 = new String("abc");

String str2 = new String("abc");

-> str1 == str2는 false



intern() Method

String 클래스의 intern()은 String 인스턴스의 문자열을 constant pool에 등록하는 일을 한다. 만약 이미 등록이 되어있다면 해당 리터럴의 주소값을 반환한다.

이미 만들어진 리터럴에 대해 생성자로 만들어진 String 객체가 참조하게할 때 사용된다.



String 객체의 초기값과 비어있는 String 객체

참조변수를 선언한 후 초기값을 설정하지 않으면 값이 null인 참조변수를 "null"문자열로 변환한 후 연산을 한다.

만약 null이 아니라 단순히 비어있는 String객체를 만들기 원한다면 ""라는 리터럴로 초기화해야 한다.

String s1; // 값은 null

String s2 = ""; // 값은 null이 아니라 비어있는 문자열 ""이다.


비어있는 문자열의 경우 크기가 0이다.

char형 배열 역시도 크기가 0인 배열을 생성할 수 있다.

위 코드에서 s2의 경우 참조하고있는 String 인스턴스는 내부에 new char[0]과 같은, 크기가 0인 char형 배열을 저장한다.


단, char형 배열이나 String은 빈 문자열의 표현이 가능하지만

하나의 문자를 저장하는char 변수의 경우 다음과 같은 표현은 허락되지 않고, 무조건 하나의 char 값을 하나 바인딩 하여야 한다.

char c = ''; // 불가능


대신, 다음과 같이 공백 문자로 초기화 할 수는 있다.

char c = '\u0000';


String의 경우 ""와 같은 문자열로 초기화 하고,

char의 경우 '\u0000'와 같은 공백문자로 초기화 하는 것이 보통이다.


메서드/설명

예제

결과

String(String value)

String(char[] value)

String(StringBuffer value)

1. String s = new String("Hello");

2. char[] c = {'H', 'e', 'l', 'l', 'o'};

String s = new String(c);

3. StringBuffer sb

= new StringBuffer("Hello");

String s = new String(sb);

s = "Hello"

value와 같은 값을 갖는 String인스턴스 생성

char charAt(int index)

String s = "Hello";

String n = "0123456";

char c1 = s.charAt(1);

char c2 = n.charAt(1);

c1 = 'e'

c2 = '1'

index위치에 있는 문자 리턴

(인덱스는 0번 부터 시작)

String concat(String str)

String s = "Hello";

String s2 = s.concat(" World");

s2 = "Hello World"

str값을 현재 String값 뒤에 덧붙인다.

boolean contains(CharSequence s)

String s = "abcde";

boolean b = s.contains("cd")

b = true

문자열 s가 현재 문자열에 포함되어 있는지 확인한다.

boolean endsWith(String suffix)

String s = "abc.txt";

boolean b = s.endsWith("txt");

문자열 suffix로 끝나는지 검사한다.

boolean equals(Object obj)

String s = "Hello";

boolean b1 = s.equals("Hello");

boolean b2 = s.equals("hello");

b1 = true

b2 = false

매개변수로 받은 문자열과 현재 문자열을 비교한다.

obj가 String이 아니거나 문자열이 다르면 false를 반환한다.

boolean equalsIgnoreCase(String str)

String s = "Hello";

boolean b1 = s.equalsIgnoreCase("HELLO");

boolean b2 = s.equalsIgnoreCase("heLLo");

b1 = true

b2 = true

문자열과 String 인스턴스의 문자열을 대소문자 구분없이 비교

int indexOf(int ch)

String s = "Hello";

int idx1 = s.indexOf('o');

int idx2 = s.indexOf('k');

idx1 = 4

idx2 = -1

주어진 문자 ch가 문자열에 존재하는지 확인하여 위치를 반환한다. 못찾으면 -1을 반환하며 인덱스는 0부터 시작한다.

int indexOf(String str)

String s = "ABCDE";

int idx = s.indexOf("CD");

idx = 2

주어진 문자열 str이 존재하는지 확인하여, 인덱스를 반환.

못 찾으면 -1을 반환하며 str의 0번 인덱스를 기준으로 반환한다.

String intern()

String s1 = new String("abc");

String s2 = new String("abc");

boolean b1 = (s1==s2);

boolean b2 = s.equals(s2);

boolean b3 = (s.intern() == s2.intern());

b1 = false

b2 = true

b3 = true 

문자열을 클래스 내의 constant pool에 등록.

이미 같은 내용의 문자열이 있을 경우 그 문자열의 주소값을 반환.

int lastIndexOf(int ch)

String s = "java.lang.Object";

int idx1 = s.lastIndexOf('.');

int idx2 = s.indexOf('.');

idx1 = 9

idx2 = 4

지정된 문자 또는 문자코드를 문자열의 오른쪽 끝에서부터 찾아 위치를 알려준다.

못 찾을 경우 -1반환

int lastIndexOf(String str)

String s = "java.lang.java";

int idx1 = s.lastIndexOf("java");

int idx2 = s.indexOf("java");

idx1 = 10

idx2 = 0

지정된 문자열을 해당 인스턴스의 문자열 끝에서 부터 찾아 위치를 알려준다.

못 찾을 경우 -1반환

int length()

String s = "Hello";

int length = s.length();

length = 5

문자열의 길이를 리턴

String replace(char old, char newString)

String replace(CharSequence old, CharSequence newString)

String old1 = "Hello";

String s1 = old1.replace('H', 'C');


String old2 = "Hellollo";

String s2 = old2.replace("ll", "LL");

s1 = "Cello"

s2 = "HeLLoLLo"

문자열 중의 old에 해당하는 부분을 새로운 문자열 newString으로 바꾼 문자열을 반환한다

String replaceAll(String regex, String replacement)

String ab = "AABBAABB";

String r = ab.replaceAll("BB", "bb");

r = "AAbbAAbb"

문자열 중 문자열 regex와 일치하는 모든 문자열을 replacement로 변경

String replaceFirst(String regex, String replacement)

String ab = "AABBAABB";

String r = ab.replaceFirst("BB", "bb");

r = "AAbbAABB"

문자열 중 regex와 일치하는 것 중, 첫 번째 것만 문자열 replacement로 변경

String[] split(String regex)

String[] split(String regex, int limit)

String animals = "dog,cat,bear";

String[] arr1 = animals.split(",");

String[] arr2 = animals.split(",",2);

arr1[0] = "dog"

arr1[1] = "cat"

arr1[2] = "bear"


arr2[0] = "dog"

arr2[1] = "cat,bear"

문자열을 지정된 regex를 기준으로 나누어 담은 문자열 배열을 반환.

limit는 전체를 해당 limit만큼 의 갯수로 자른다.

boolean startsWith(String prefix)

String s = "java.lang.Object";

boolean b = s.startsWith("java");

boolean b2 = s.startsWith("lang");

b = true

b2 = flase

해당 문자열이 문자열 prefix로 시작하는지 검사

String substring(int begin)

String substring(int begin, int end)

String s = "java.lang.Object";

String c = s.substring(10);

String p = s.substring(5, 9);

c = "Object"

p = "lang"

begin이상 end미만 범위의 문자열을 리턴.

시작 위치는 범위에 포함

종료 위치는 범위에 미포함

String toLowerCase()

String s = "Hello";

String s1 = s.toLowerCase();

s1 = "hello"

모든 문자를 소문자로 변환하여 반환

String toString()

String s = "Hello"

String s1 = s.toString();

저장된 문자열을 반환

String toUpperCase()

String s = "Hello"

String s1 = s.toUpperCase();

s1 = "HELLO"

모든 문자를 대문자로 변환하여 반환

String trim()

String s = " Hello World ";

String s1 = s.trim();

s1 = "Hello World"

왼쪽과 오른쪽 끝의 공백을 없앤 결과를 반환. 중간 공백은 없어지지 않는다.

static String valueOf(boolean b)

static String valueOf(char c)

static String valueOf(int i)

static String valueOf(long l)

static String valueOf(float f)

static String valueOf(double d)

static String valueOf(Object o)

String b = String.valueOf(true);

String c = String.valueOf('a');

String i = String.valueOf(100);

String l = String.valueOf(100L);

String f = String.valueOf(10f);

String d = String.valueOf(10.0);

java.util.Date dd = new java.util.Date();

String date = String.valueOf(dd);

b = "true"

c = "a"

i = "100"

l = "100"

f = "10.0"

d = "10.0"

date = "요일 월 일 시:분:초: KST 년도"

지정된 값을 문자열로 반환한다.

참조변수는 toString()의 결과를 반환한다.


Primitive -> String

String -> Primitive

static String valueOf(boolean b)

static String valueOf(char c)

static String valueOf(int i)

static String valueOf(long l)

static String valueOf(float f)

static String valueOf(double d)

boolean Boolean.getBoolean(String s)

byte Byte.parseByte(String s)

short Short.parseShort(String s)

int Integer.parseInt(String s)

long Long.parseLong(String s)

float Float.parseFloat(String s)

double Double.parseDouble(String s)


'Java > Useful Classes' 카테고리의 다른 글

[Java] Wrapper Class  (0) 2017.10.02
[Java] Math Class  (0) 2017.10.02
[Java] StringBuffer Class  (0) 2017.10.02
[Java] Object Class  (0) 2017.10.02
Comments