티스토리 뷰

Java/Class

[java.lang] String

MinChyang 2018. 1. 3. 17:07

String Class




◎ Define


- String Class는 문자열을 위한 Class이며, immutable object(불변 객체)이다.



◎ String Class Method


Method

Brief description

 charAt(int index)

전달된 index에 해당하는 문자(char) 반환

 int compareTo(String str)

전달된 str 비교 후 정수(int) 반환 (Explanation ① 참조)

 int compareTolgnoreCase(String str)

위 내용과 같으나 대소문자 구분 없이 비교한다. 

String concat(String str)

전달된 str을 해당 문자열 뒤에 추가 후 그 값을 반환 

int indexOf(int ch)

int indexOf(String str)

해당 문자열에서 전달된 문자나 문자열이 처음으로 등장하는 위치의 index를 반환 

int indexOf(int ch, int fromIndex)

int indexOf(String str, int fromIndex)

해당 문자열에서 전달된 문자나 문자열이

전달된 index 이후에 처음으로 등장하는 위치의 index를 반환 

int lastIndexOf(int ch)

전달된 문자가 마지막으로 등장하는 위치의 index를 반환 

int lastIndexOf(int ch, int fromIndex)

해당 문자열에서 전달된 문자가

전달된 index 이후에 마지막으로 등장하는 위치의 index를 반환 

 String[] split(String regex)

전달된 정규 표현식(regular expression)에 따라 나눠서 반환 

String substring(int beginIndex)

전달된 index부터 끝까지를 새로운 문자열로 반환 

String substring(int begin, int end)

전달된 begin index부터 전달된 end index까지를 새로운 문자열로 반환

String toLowerCase()

해당 문자열의 모든 문자를 소문자로 변환 

String toUpperCase()

해당 문자열의 모든 문자를 대문자로 변환 

String trim()

해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백 문자를 제거 

int length()

해당 문자열의 길이를 반환 

boolean isEmpty()

해당 문자열의 길이가 0이면 true, 아니면 false를 반환 

boolean contains(charSequence s)

전달된 문자열이 포함 되었는지의 여부를 반환 

boolean startWith(String suffix)

해당 문자열이 전달된 문자열로 시작하는지의 여부를 반환 

boolean endsWith(String suffix)

해당 문자열이 전달된 문자열로 끝나는지의 여부를 반환 

boolean equals(Object obj)

해당 문자열과 전달된 문자열이 같은지의 여부를 반환 (Explanation ② 참조)

 String replaceFirst

(String regex, String replacement)

해당 문자열에서 전달된 문자열과 해당되는 문자열 중

첫 번째 일치되는 것만 변환 후 변환 된 문자열을 반환 

String replace

(CharSequence old, CharSequence new)

해당 문자열에서 전달된 old 문자열에 해당되는 문자열을

전달된 new 문자열로 모두 변환 후 변환 된 문자열을 반환 

 String replaceAll

(CharSequence old, CharSequence new)

위 replace와 같지만, 정규표현식을 사용할 수 있다.

 static String valueOf(Object obj)

전달된 값을 문자열 타입으로 변환 후 반환

String format

(String format, Object... args) 

전달된 서식 문자열을 이용해 서식화된 문자열을 반환



◎ Explanation


① compareTo() method는 단순한 문자열 비교가 아니다.


참조)


1. 두 문자열의 길이가 같은가? 다른가? (true or false)


2. 두 문자열 안 문자의 내용이 어디(몇 번째)까지 같은가? (두 비교 대상의 ?번째 문자 내용 ex) 0번째 문자와 0번째 문자)


크게 보면 이렇게 두 가지 조건으로 분류하게 된다. 그리고 위 조건 성립 여부에 따라 다른 식으로 값을 return 해준다.


a. 본인(문자열)과 비교대상(문자열)의 문자열 길이 산술에 따른 결과 값(int 정수) return


b. 본인(문자열)의 ?번 째 문자와 비교대상(문자열)의 ?번 째 문자의 ASCII(아스키코드) Decimal 산술에 따른 결과 값(int 정수) return


예)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class StringClass {
    public static void main(String[] args) {
        
        String str = "abc";
 
        int result = str.compareTo("abc");
                     // abc와 abc를 비교
        System.out.println(result);
 
        // result : 0
 
        int result2 = str.compareTo("ab");
                      // abc와 ab를 비교
        System.out.println(result2);
 
        // result : 1
 
        int result3 = str.compareTo("zbd");
                      // abc와 zbd를 비교
        System.out.println(result3);
 
        // result : -25
    }
}
cs



String str = "abc"; 와 같은 변수가 있다고 가정한다.


str.compareTo("abc") 라면,


1. 두 문자열의 길이가 같으므로 true

2. 두 문자열 안 문자(char)내용을 순서대로 하나하나 비교 했을 때 모두 같으니 2번의 조건은 "끝까지 같다" 가 될 것이다.


이런 경우는 0 이라는 int type의 정수가 return 된다.


이 외(완벽히 같지 않음)의 경우에는 retrun 되는 값이 두 가지로 나뉜다.


어떤 경우에 a의 값이 return 되고 어떤 경우에 b의 값이 return 되는지 확인 해보자.



str.compareTo("ab") 라면,


1. 두 문자열의 길이가 같지 않으므로 false

2. 두 문자열 안의 문자(char) 내용을 순서대로 하나하나 비교 했을 때

    2번 째까지는 문자 내용이 서로 일치하지만 3번 째는 길이가 같지 않으므로 비교할 수 없음.


값이 없어서(문자열 길이의 차이) 비교를 못 하는 문자(char)는 있었지만, 그걸 제외한 나머지 모든 문자가 같다면 


a를 기준으로 return하게 된다.


즉 "abc" 의 길이(3) - "ab"의 길이(2) = 1 이라는 값이 return 되는 것이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class StringClass {
    public static void main(String[] args) {
        
        String str = "abc";
 
        str.compareTo("ab"//        str.length(3) - "ab".length(2) = 1
        str.compareTo("a"//         str.length(3) - "a".length(1)= 2
        str.compareTo(""//          str.length(3) - "".length(0) = 3
        str.compareTo("abcd"//      str.length(3) - "abcd".length(4) = -1
        str.compareTo("abcdd"//     str.length(3) - "abcdd".length(5) = -2
        str.compareTo("abcabc"//    str.length(3) - "abcabc".lengt(6) = -3
 
        // 문자열을 비교한다기 보단 문자열 안의 문자 하나하나를 비교한다.
        // 두 문자열을 첫 번째 자릿수부터 차례대로 하나씩 비교 했을 때
        // null(서로 문자열 길이가 달라서 비교할 수 없는 상황)을 제외하고,
        // 두 문자열 안의 자릿수와 문자가 일치 할 때 각 문자열의 길이 값으로
        // 산술 후 그 차이 값을 int타입으로 return 한다.
 
    }
}
cs



str.compareTo("zbd") 라면,


1. 두 문자열의 길이가 같으므로 true

2. 두 문자열 안의 문자(char) 내용을 순서대로 하나하나 비교 했을 때

    2번 째까지는 문자 내용이 서로 일치하지만 3번 째는 다른 문자일 때


문자열의 길이에 상관 없이 문자열 안 문자(char) 내용이 서로 상이하다면


b를 기준으로 return하게 된다.


즉 "abc"와 "zbd"를 비교 했을 때 상이한 문자(char) 중에서도 가장 앞에 위치한 문자의 ASCII Decimal 값을 산술해서 return 한다.


위에선 문자(char)들 중 첫 번째 문자인 'a' 와 'z' 그리고, 세 번째 문자인 'c' 와 'd' 가


서로 상이하지만 가장 앞에 위치한 문자의 ASCII Decimal 값을 산술하게 된다.


'a' 의 ASCII Decimal = 97

'z' 의 ASCII Decimal = 122


97 - 122 = -25 라는 값이 return 되는 것이다.


* 여기서 ASCII 라는 것은 문자(char)를 컴퓨터가 이해할 수 있는 숫자 형태로 변환한 코드 값이라고 이해하면 된다.

   자세한 내용은 인터넷에 "아스키코드" 를 검색 후 표를 참조하자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class StringClass {
    public static void main(String[] args) {
        
        String str = "abc";
 
        a.compareTo("cbc"//      a.ASCII(97) - c.ASCII(99) = -2
        a.compareTo("adc"//      b.ASCII(98) - d.ASCII(100) = -2
        a.compareTo("abz"//      c.ASCII(99) - z.ASCII(122) = -23
        a.compareTo("+++"//      a.ASCII(97) - +.ASCII(43) = 54
        a.compareTo("a+<d?"//    b.ASCII(98) - +.ASCII(43) = 55
        
        // 문자열을 비교한다기 보단 문자열 안의 문자 하나하나를 비교한다.
        // 두 문자열을 첫 번째 자릿수부터 차례대로 하나씩 비교 했을 때
        // null(서로 문자열 길이가 달라서 비교할 수 없는 상황)을 제외하고,
        // 서로 다른 값이 나타난다면 그 땐 문자열의 길이로 산술이 되는 게 아니라
        // 서로 다른 값인 문자 중에 가장 첫 번째 자릿수에 가까운 문자의 ASCII Decimal 값으로
        // 산술 후 그 차이 값을 int타입으로 return 한다.
        
    }
}
cs



② equals() method는 hashCode() method와 단짝이다.


참조) Java에서 사용자가 정의한 Class를 가지고 서로 같은 것인지 비교해야 할 때가 있다. equals() method는 값이 아닌 객체의 주소 값으로 비교를 한다. (이 때 비교하는 주소 값이 hashCode() method가 찾아 준 주소값(위치 값을 hashcode로 반환)이기 때문에 equals() method와 hashCode() method는 단짝일 수 밖에 없다.)


만약 Class의 객체간 주소값이 아닌 객체 안의 값을 equals() method로 비교하고자 한다면 반드시 Overriding을 해 줘야 하며, 이 땐 hashCode() method 역시 같이 Overriding을 해 줘야 한다.


하지만 String Class의 객체 값을 비교할 땐 Overriding을 따로 할 필요가 없다. String Class 내부에는 이미 equals method() 가 Overriding 되어 있기 때문에 String Class를 eqauls method()로 비교할 땐 객체의 주소값이 아닌 객체의 값으로 비교를 하게 된다. hashCode() method는 데이터 관리 기법 중의 하나이다. Hash는 내부적으로 배열(=Hash Table)을 사용해 데이터를 저장하기 때문에 다량의 데이터를 저장하는 것이 가능하며, 찾을 때도 빠른 검색 속도를 갖는다.


이 Hash Table에 데이터를 저장하는 특별한 알고리즘이 존재하는데, 이 알고리즘을 구현한 method가 hashCode() method인 것 이다. 여기에 찾고자 하는 값을 입력하면, 그 값이 저장된 위치를 알려주는 "정수"의 코드를 반환한다.


객체의 주소값을 이용해 hashcode를 만들어 반환하는 것이다. 따라서 한 번의 실행에서 서로 다른 두 객체가 같은 hashcode를 가질 수 없다.


lombok을 주로 사용하는 나로써는 모르고 지나치기 쉬운 내용이지만 필히 알아둬야 할 내용이기도 하다. lombok에선 annotation으로 자주 사용되는 Object의 method 들을 재정의 해준다. (get(), set(), toString(), equals(), hashCode(), Instance() 등)



'Java > Class' 카테고리의 다른 글

[java.lang] Wrapper  (0) 2018.01.05
[java.lang] Math  (0) 2018.01.05
[java.lang] StringBuilder  (0) 2018.01.04
[java.lang] StringBuffer  (0) 2018.01.04
[java.lang] Obejct  (0) 2018.01.03
댓글
Notice
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
Link
«   2026/02   »
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
글 보관함