■ String 이란?
자바는 String 클래스를 사용해 문자열을 다룬다. String은 자바 내장 클래스로서 그 자체로 타입으로 사용 가능하며, 연관된 기능들을 묶을 수 있다. 다시 말해, String 클래스는 문자열 타입으로 사용되며, 문자열과 관련된 유용한 메서드들도 가지고 있다.
■ String 클래스 선언
기본적으로 String 타입은 ("")로 감싸진 문자열 타입이며, char의 배열을 의미한다.
String 타읍의 선언과 저장은 다음과 같다.
String 변수
변수 = "문자열"; // 문자열 리터럴 대입방식
String 변수 = "문자열"
String 변수 = new String("문자열") //new 연산자를 사용해 객체를 생성하고 문자열을 대입
문자열은 다른 변수가 값을 저장하는 방식처럼 작동하는 것이 아닌, 문자열이 담겨있는 주소를 참조한다고 이해하는 것이 좋다.
예를 들어, 책을 담아두는 두 개의 상자가 있는데 첫 번째 상자에는 책 실물이 담겨있고 두 번째 상자에는 책장에 꽂혀있는 책의 위치와 제목을 적어 놓은 종이가 들어가 있다고 가정해보자. 기러면 첫 번째 상자에서는 언제 어디서든 책을 꺼내어 읽어볼 수 있지만, 두 번째 상자는 책을 읽기 위해 기록된 종이를 보고 책을 찾아야 한다. 그리고 책을 모두 읽으면 첫 번째 상자는 책을 그대로 넣어두면 되지만, 두 번째 상자는 책을 원래 위치로 가져다 놓아야 한다.
이 비유에서 첫 번째 상자가 일반적인 변수가 값을 저장하는 방식이라면, 두 번째 상자는 문자열을 다루는 방식이라고 생각할 수 있다. 문자열은 변수에 직접적으로 저장되는 것이 아닌 참조하는 주소가 담기는 것이다.
그런데 문자열을 변수에 담는 경우, 두 가지 방법이 있는데 예시 코드에서 보여주는 것처럼
1. 문자열 리터럴을 직접적으로 변수에 대입하는 방식
2. new 연산자를 사용해 객체를 생성하는 동시에 문자열을 대입하는 방식이다,
물론, 문자열을 String 변수에 저장한다는 말은 틀린 말이다.
문자열은 직접 변수에 저장되는 것이 아닌, String 객체로 생성되고, 변수는 이 객체의 주소를 참조한다. String 타입도 그렇기 때문에 참조 자료형이다. 이에 따라, 변수에 문자열을 저장할 경우 문자열 리터러를 사용할 수 도 있지만, new 연산자를 사용해서 직접 String 객체를 생성시킬 수 도 있다.
그러나 문자열 리터럴로 생성하느냐, new 연산자로 생성하느냐에 따라서 비교 연산자(==)의 결과가 달라질 수 있다.
String name1 = "김코딩";
String name2 = "김코딩";
String name3 = new String("김코딩");
//case 1
System.out.println(name1 == name2); // -> true
//case 2
System.out.println(name1 == name3); // -> false
이 경우 name1과 name2는 동일한 문자열 리터럴로 생성된 객체를 참조하기 때문에, 비교 연산자(==)로 비교하였을 때, 결과는 true가 나온다. 그러나 name3은 new 키워드로 String 객체를 별도로 생성했기 때문에 주소 값이 다르다. 따라서 비교 연산자 (==)로 비교하였을 때 case1는 true, case 2는 false가 나오게 된다.
■ String 대표 메서드
1. charAt() 메서드.
charAt() 메서드는 해당 문자열의 특정 인덱스에 해당하는 문자를 반환해준다. 만약 해당 문자열의 길이보다 큰 인덱스나 음수가 전 될 되면, 오류가 발생한다.
String str = new String("Java");
System.out.println("문자열 : " + str); // "문자열 : Java"
System.out.println(str.charAt(0)); // 'J'
System.out.println(str.charAt(1)); // 'a'
System.out.println(str.charAt(2)); // 'v'
System.out.println(str.charAt(3)); // 'a'
System.out.println("\ncharAt() 메서드 호출 후 문자열 : " + str);
2. IndexOf() 메서드
indexOf() 메서드는 해당 먼 자 열에서 특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스를 반환한다. 만약 해당 문자열에 전달된 문자나 문자열이 포함되어 있지 않으면 -1을 반환한다.
String str = new String("Oracle Java");
System.out.println("문자열 : " + str);
System.out.println(str.indexOf('o'));
System.out.println(str.indexOf('a'));
System.out.println(str.indexOf("Java"));
System.out.println("indexOf() 메서드 호출 후 원본 문자열 : " + str);
3. compareTo() 메서드
compareTo() 메서드는 해당 문자열을 인수로 전달된 문자열과 사전 편찬 순으로 비교한다. 이 메서드는 문자열을 비교할 때 대소문자를 비교하여 구분한다. 만약 두 문자열이 같다면 0이 반환되며, 해당 문자열이 인수로 전달된 문자열 보다 작으면 음수, 크면 양수를 반환한다. 만약 문자열을 비교할 때 대소문자를 구분하지 않길 원한다면, compareToIgnore() 메서드를 사용하면 된다.
String str = new String("abcd");
System.out.println("문자열 : " + str);
System.out.println(str.compareTo("bcef"));
System.out.println(str.compareTo("abcd") + "\n");
System.out.println(str.compareTo("Abcd"));
System.out.println(str.compareToIgnoreCase("Abcd"));
System.out.println("compareTo() 메서드 호출 후 문자열 : " + str);
4. concat() 메서드
concat() 메서드는 해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열을 반환한다. 참고로 concat은
concatenate의 약자로, 사전적으로 연결한다는 의미를 가진다. 만약 인수로 전달된 문자열의 길이가 0이면 해당 문자열을 그대로 반환한다.
String str = new String("Java");
System.out.println("문자열 : " + str);
System.out.println(str.concat("수업"));
System.out.println("concat() 메서드 호출 후 문자열 : " + str);
이외에도 많은 메서드들이 있으니 자바 문서를 참조하기 바란다.
■ StringTokenizer
StringTokenizer 클래스는 문자열을 우리가 지정한 구분자로 문자열을 쪼개 주는 클래스이다. 그렇게 쪼개진 문자열을 우리는 토큰(Token)이라고 한다. StringTokenizer을 사용하기 위해서는 Java, util.StringTokenizer를 Import 해야 한다.
import java.util.StringTokenizer;
public static void main(String[] args){
String str = "This is a string example using StringTokenizer";
StringTokenizer tokenizer = new StringTokenizer(str);
System.out.println(str);
System.out.println();
System.out.println("total tokens:"+tokenizer.countTokens());
// 아래의 while 코드는 반복문의 한 종류인데 어떻게 작동하는지 추후 반복문 챕터에서 공부할 예정이니 걱정하지 않으셔도 됩니다.
while(tokenizer.hasMoreTokens()){
System.out.println(tokenizer.nextToken());
}
System.out.println("total tokens:"+tokenizer.countTokens());
}
■ 자주 사용하는 메서드
int countKokens()
- 남아있는 token의 개수를 반환한다. 전체 token의 개수가 아닌 현재 남아있는 token의 개수이다.
boolean hasMoreElements(), boolean hasMoreTokens()
- 다음의 token을 반환한다. StringTokenizer는 내부적으로 어떤 위치에 토큰을 사용하였는지 기억하고 있고 그 위치를 다음으로 옮긴다. 두 가지 메서드는 모두 같은 값을 반환한다.
■ StringBuilder / StringBuffer
■ StringBuilder
한번 생성된 String 클래스의 인스턴스는 여러 개의 문자열을 더할 때 매번 새로운 인스턴스를 생성해야 한다. 만약 100만 개의 문자열이 있는데 모두 더하는 작업이 필요하다면 인스턴스 생성과정은 100만 번 이루어져야 하기에 매우 비효율적이다. 그래서 이러한 문제를 해 걸 하기 위해 StringBuilder를 사용한다.
public class Main {
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("문자열 ").append("연결");
String str = stringBuilder.toString();
System.out.println(stringBuilder);
System.out.println(str);
}
}
■ StringBuffer
String 클래스의 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없다. 하지만 StringBuffer 클래스의 인스턴스는 그 값을 변경할 수 도 있고, 추가할 수 도 있다. 이를 위해서 StringBuffer 클래스는 내부적으로 버퍼(Buffer)라고 하는 독립적인 공간을 가진다. 버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 성정 할 수 있다. 하지만 인스턴스 생성 시 사용자가 설장한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성된다.
■ 메서드
1. append() 메서드
append() 메서드는 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 마지막에 추가한다. 이 메서드는 String 클래스의 concat() 메서드와 같은 결과를 반환하지만, 내부적인 처리 속도가 훨씬 빠르다.
StringBuffer str = new StringBuffer("Java");
System.out.println("문자열 : " + str);
System.out.println(str.append(" programming"));
System.out.println("append() 메서드 호출 후 문자열 : " + str);
2. capacity() 메서드
capacity() 메서드는 Buffer의 현재크기를 반환한다.
StringBuffer str01 = new StringBuffer();
StringBuffer str02 = new StringBuffer("Java");
System.out.println(str01.capacity());
System.out.println(str02.capacity());
위의 예제처럼 길이가 4인 문자열로 StringBuffer 인스턴스를 생성하면, 기본적으로 생성되는 여유 버퍼 크기인 16에 문자의 길이인 4를 더한 총 20개의 문자를 저장할 수 있는 버퍼가 생성되는 것을 확인할 수 있다.
3. delete() 메서드
delete() 메서드는 전달된 인덱스에 해당하는 부분 문자열을 해당 문자열에서 제거한다. 또한, deleteCharAt() 메서드를 사용하면 특정 위치의 문자 한 개만을 제거할 수도 있다.
StringBuffer str = new StringBuffer("Java Oracle");
System.out.println("문자열 : " + str);
System.out.println(str.delete(4, 8));
System.out.println(str.deleteCharAt(1));
System.out.println("deleteCharAt() 메소드 호출 후 문자열 : " + str);
delete() 메서드를 사용하여 해당 문자열에서 인덱스가 4인 위치의 문자부터 7인 위치의 문자까지를 삭제하고 있다. 이처럼 delete() 메서드는 첫 번째 매개변수로 전달된 인덱스부터 두 번째 매개변수로 전달된 인덱스 바로 앞의 문자까지를 삭제하는 메서드이다.
4. insert() 메서드
insert() 메서드는 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 지정된 인덱스 위치에 추가한다. 이때 전달된 인덱스가 해당 문자열의 길이와 같으면, append() 메서드와 같은 결과를 반환한다.
tringBuffer str = new StringBuffer("Java Programming!!");
System.out.println("문자열 : " + str);
System.out.println(str.insert(4, "Script"));
System.out.println("insert() 메서드 호출 후 문자열 : " + str);
위 예제의 세 번째 줄에서는 insert() 메서드를 사용하여 해당 문자열에서 인덱스가 4인 위치부터 두 번째 매개변수로 전달된 문자열을 추가하고 있다.
'Programming > Cs' 카테고리의 다른 글
[OOP] 객체지향 프로그래밍 (OOP, Object oriented Programming) (2) | 2022.05.10 |
---|---|
[지식] 변수, 상수, 리터럴, 타입변환 (2) | 2022.05.04 |
[지식] Linux 기초 (0) | 2022.05.02 |
[지식] 컴퓨터와 프로그래밍의 이해 (2) | 2022.04.26 |
[지식] 넷플릭스의 4A 피드백 문화 (3) | 2022.04.25 |