티스토리 뷰
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 |
