반응형

String클래스의 생성자와 메서드

 

String클래스의 생성자와 메서드에 대해서 알아보자.
자주 쓰이는 중요한 클래스니까, 잘 공부해보자.

 

표를보자.

String(String s)는 String을 매개변수로 갖는데, 잘 쓰지 않는다.

그 아래에 있는 String(char[] value)는 많이 사용한다.
char배열을 매개변수로 갖는데, {'H', 'e', 'l', 'l', 'o'}라는 문자들이 담긴 char배열을 생성자에 넣어주면,
"Hello"라는 문자열이 만들어진다.
이것이 바로 char배열을 String으로 바꾸는 방법이다.
반대로 바꿀 때는, toCharArray()라는 메서드를 사용한다.

String(StringBuffer buf)를 보면 알 수 있듯 StringBuffer를 매개변수로 갖을 수 있다.
StringBuffer는 내용변경이 가능한 문자열이다.
StringBuffer를 String으로 바꿀 때 사용하는 생성자다.

char charAt(int index)은 지정된 인덱스에 있는 문자 한개를 반환한다.
문자열s가 "Hello"면, s.charAt(1)이면 'e'가 반환된다.

int compareTo(String str)라는 메서드는 두개의 문자열을 사전순서로 비교한다. DictionaryOrder라고 한다.
abc순이다.
int i = "aaa".comareTo("aaa"); 이면 양쪽이 같으므로  0을 반환하고,
int i2 = "aaa".comareTo("bbb");이면 왼쪽이 작으므로 음수 -1을 반환하고,
int i3 = "bbb".compareTo("aaa");이면 오른쪽이 작으므로 양수 1을 반환한다.
첫번째 글자부터 비교해서 같으면 그다음것을 비교하는 방식이다.
compareTo는 정렬할 때 사용한다.

 

 

String concat(String str)메서드는, 문자열을 결합하는 메서드다.
String s = "Hello"일 때, 뒤에 " World"를 붙이려면,
String s2 = s.concat(" World");라고 하면 된다.

boolean contains(CharSequence s)는 매개변수로 지정한 것이 문자열에 있는지 검사한다.
String s = "abcdefg";일 때, s에 "bc"가 포함되어 있는지 확인하려면,
boolean b = s.contains("bc"); 를 하면 s에 "bc"가 포함되어 있으므로 true를 반환받는다.

매개변수에 CharSequence는 인터페이스다.
인터페이스의 장점중에, "서로 관계없는 클래스들을 관계를 맺어줄 수 있다."라는 것을 이용하는 것이다.
Char[](문자열 배열)을 다루는 공통점이 있는 클래스들이 있다.
StringBuilder, StringBuffer, String, Segment, CharBuffer 등이 있는데,
그런데, 이 클래스들이 전부 상속계층도가 달라서 공통조상이 없다.
공통조상이 있다면, 다형성을 이용해서 그것을 매개변수 타입으로 하면 좋을텐데, 공통조상이 없어서 그럴 수 없다.
그래서 CharSequence라는 인터페이스를 만들고, 해당 클래스들이 구현하도록 한 것이다.
그래서, 위의 클래스들에 CharSequence 인터페이스를 구현한다는 공통점이 생기도록 하는 것이다.

그래서, CharSequence로 매개변수 타입을 해놓으면, 다형성에 의해서, 해당 인터페이스를 구현한 클래스들이 매개변수로 들어올 수 있는 것이다.

boolean endsWith(String suffix)는 문자열이, 지정된 문자열로 끝나는지 검사하는 것이다.
String file = "Hello.txt"; 가 있을 때, file문자열이 txt로 끝나는지 확인하려면,
boolean b = file.endWith("txt");를 통해 확인 할 수 있고, 해당 문자열로 끝나면, true를 반환한다.
이것의 반대로는 startsWirh가 있다.

boolean equals(Object obj)는 문자열을 비교하는 것이다.

boolean equalsIgnoreCase(String str)은 대소문자 구문없이 비교하는 것이다.

int indexOf(int ch)는 문자를 주면, 그 문자가 문자열에서 몇번째 인덱스에 있는지 알려준다.
String s = "Hello";라는 문자열이 있을 때,
'o'의 인덱스를 찾고 싶다면, int idx1 = s. indexOf('o'); 를 하면 인덱스 4를 반환한다.
만약, "Hello"에 없는 문자의 인덱스를 찾으려 하면, -1을 반환한다.

 

 

int indexOf(int, ch, int pos)는 indexOf인데 매개변수가 2개이다.
두번째 매개변수는, 검색 시작 위치를 설정할 수 있게 해준다.
String s = "Hello"; 가 있을 때,
int idx1 = s.indexOf('e', 0); 을 하면, s의 인덱스 0부터 탐색을 하는데, e가 인덱스 1에 있으므로 1을 반환한다.
int idx 1 = s.indexOf('e', 2);를 하면, s의 인덱스 2부터 탐색을 하는데, e가 인덱스 1에 있는데 인덱스 2부터 탐색했으므로 e를 찾지못해서 -1을 반환한다.

int indexOf(String str)는 문자열도 탐색할 수 있는데,
String s = "ABCDEFG:";에서 "CD"의 위치를 찾으려면,
int idx = s.indexOf("CD");를 하면 문자열의 시작인덱스 2를 반환한다.

int lastIndexOf(int ch)는 indexOf와 똑같은데 뒤에서부터 찾는 것이 특징이다.
그렇다고해서 뒤에서부터 인덱스 0, 1 , 2이렇게 세는 것은 아니다.
뒤에서 부터 탐색은 하되, 인덱스는 맨 앞에 0으로 고정이다.
그래서 String s = "java.lang.Object";가 있을 때,
s.lastIndexOf('.');를 하면 9를 반환하고,
s.indexOf('.');를 하면 4를 반환한다.

int lastIndexOf(String str)은 매개변수에 String을 쓸 수 있다.
문자열을 찾는 것이다.
String s = "java.lang.java";가 있을 때,
"java"를 찾을 건데,
s.lastIndexOf("java");를 하면 뒤에서 부터 찾아서 인덱스 10을 반환하는데,
만약에 s.indexOf("java");로 찾으면 0을 반환한다.

int lengh()는 문자열의 길이를 알려준다.
String s = "Hello";일 때, int length = s.length();를 호출하면 length = 5 이다.

 

 

String[] split(String regex)는 문자열을 자르는데, 매개변수에 regex(Regular Expression) 즉, 정규식을 넣어야 한다.
예시에서는 그냥 "," 콤마를 넣었다. 그러면, String animals = "dog,cat,bear";을 콤마단위로 자르는 것이다.
그래서 이 자른 것을 배열아 담아서 반환한다.
arr[0] = "dog", arr[1] = "cat", arr[2] = "bear" 을 반환한다.

String[] split(String regex, int limit) 은 몇부분으로 자를 것인지가 추가된 것이다.
String animals = "dog,cat,bear";가 있을 때,
String[] arr = animals.split(",", 2); 를 하면,
"dog, cat, bear"를 콤마를 기준으로 자르는데, "dog" 그리고 "cat, bear"이렇게 2개로 나눈다.
그래서 arr[0] = "dog", arr[1] = "cat, bear"로 저장된다.

boolean startsWith(String prefix)는 특정 문자로 끝나는 endsWith의 반대이다.
startsWith는 지정된 문자열로 시작하는지 검사하는 것이다.
String s = "java.lang.Object";일 때,
boolean b = s.startsWith("java");를 하면 true를 반환한다.
boolean b2 = s.startsWith(:"lang");를 하면 false를 반환한다.

String substring(int begin)
String substring(int begin, int end)
는 문자열의 일부를 잘라낸 것이다.
매개변수로 어디부터 시작해서 어디까지 자를지 정하는 것이다. 첫번쨰 처럼 end를 생략하면, 문자열 길이가 자동으로 생략된 것으로 간주한다. 즉, end를 생략하면 특정위치부터 끝까지 자를 것이다.
String s = "java.lang.Object";일 때,
String c = s.substring(10);을 하면, 10이 O이므로 c = "Object"가 반환된다.
String p = s.substring(5, 9);를 하면, 인덱스 9미만까지 잘라서 반환하므로, p = "lang"이 반환된다.
즉, begin <= x < end인 것을 주의하자.

 

 

String toLowerCase()는 전부다 소문자로 바꾸는 것이다.
String s = "Hello"; 일 때,
String s1= s.toLowerCase();을 하면 s1 = "hello"

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)
이것들은 전부 기본형 값들을 매개변수로 갖고있는데,
valueOf는 기본형을 전부 String으로 변환해준다.
static String valueOf(Object o)는 참조변수를 매개변수로 하는데, 참조변수의 경우, toString()을 호출한 결과를 반환한다.

문자열로 바꿀 때, +"" 로 빈문자열을 더해주었었는데, 이렇게 해도 되지만,
valueOf가 성능이 더 빠르다. (성능은 꼭 필요할 때만 신경쓰고, 코드 가독성을 위해 +""을 사용해도 된다.)
성능이 문제될 때만 성능을 높히기 위한 코드로 바꾼다 라고 생각하자.

 

반응형

'JAVA' 카테고리의 다른 글

StringBuffer 클래스  (0) 2022.04.15
StringJoiner, 문자열과 기본형 변환  (0) 2022.04.15
String클래스, 문자열 비교, 빈 문자열  (0) 2022.04.14
hashCode(), toString()  (0) 2022.04.14
Object클래스와 equals()  (0) 2022.04.13