String은 Java.lang
패키지로 제공되는 Java 문자열 클래스로, 별도의 import 없이 사용 가능합니다.
문자열은 여러개의 문자가 배열을 이룬 것으로
자바에서 문자는 작은따옴표
, 문자열은 큰따옴표
를 사용하여 나타냅니다.
char ch = 'A';
String str = 'java';
// 1.literal로 생성
String str_literal = "Hello";
// 2.object로 생성
String str_object = new String("Hello");
두 선언의 차이점은 저장되는 메모리영역이 다릅니다.
literal은 Heap에서 공동으로 사용하는 constant String pool 에 저장되고, 인스턴스로 만든 문자열은 그냥 Heap 영역에 저장됩니다.
String str1 = "abc";
String str2 = new String("abc");
// str1 == str2 는 false입니다.
// 둘의 메모리 주소값은 다릅니다.
String str1 = "abc";
String str2 = "abc";
// str1 == str2 는 true입니다.
String str1 = new String("abc");
String str2 = new String("abc");
// str1 == str2 는 false입니다.
자바에서 String 클래스로 표현되는 문자열은 문자의 배열
입니다. 문자열 내 문자를 가져오는 방법은 두가지 입니다.
//인덱스에 해당하는 문자 가져오기
String.charAt(int index);
// char[] 배열에 문자 담기
String.toCharArray();
알아두면 좋을 Character 내장 라이브러리를 알아보겠습니다.
// 문자를 숫자로
char digit = '7';
int digitToInt = Character.getNumericValue(digit);
// 문자인지 확인 (주로 공백 체크할때 사용)
char c = 'A';
Character.isAlphabetic(c); // boolean값을 반환합니다.
// 대문자를 소문자로, 소문자를 대문자로
Character.toUpperCase(c);
Character.toLowerCase(c);
// 대소문자 확인
Character.isUpperCase(c);
Character.isLowerCase(c);
char형으로 표현되는 문자는 사실 내부적으로 정수형 int로 취급됩니다.
따라서 문자를 정수로, 정수를 문자로 바꿀 때 아스키 코드를 사용합니다. 아스키 코드는 기본적인 128개의 문자
가 가지는 정수 코드입니다.
모든 코드를 외울 필요는 없지만 기준이 되는 문자는 알아두면 좋습니다.
'0' = 48
'A' = 65
'a' = 97
char base = 65;
System.out.print(base); // 'A'
System.out.print((int)base); // 65
System.out.print((char)65); // 'A'
System.out.print('Z' - 'A'); // 25
System.out.print(base + 25); // 90
System.out.print((char)90); // 'Z'
예를 들어 문자 '2'를 정수로 표현하고 싶다면 '2' - '0'
을 해주면 정수 2가 됩니다.
주의할점은 char끼리 연산하면 int형으로 형 변환합니다. 따라서 문자로 반환받고 싶다면 (char)을 붙여서 강제 형 변환을 시켜주어야 합니다.
String은 한번 인스턴스가 생성되면 수정할 수 없습니다. (immutable object)
그러나 값의 변경은 불가능하지만, 새로운 String을 만들어 바꿀 수는 있습니다.
String str = "ABC";
char[] temp_arr = str.toCharArray();
temp_arr[2] = 'D';
str = new String(temp_arr);
String str = "ABCEFG";
str = str.substring(0,3) + 'D' + str.substring(3,6)
문자열을 쉽고 효율적으로 수정할때는 StringBuilder를 이용합니다.
문자를 이어 붙이거나 삭제하는 등 수정할 때마다 매번 새로운 String객체를 만들지않고 내부 배열에서 직접 수정합니다.
자주 사용되는 StringBuilder 메서드를 알아두면 좋습니다.
StringBuilder sb = new StringBuilder();
// String으로 반환
sb.toString()
// 문자 c를 문자열 끝에 이어 붙인다
sb.append(char c)
// 문자열 길이를 반환
sb.length()
// 문자열을 뒤집는다
sb.reverse()
자주 쓰이는 3가지 방법을 알아보겠습니다.
String str = "hello";
// 해당 index의 문자를 반환한다.
char c = str.charAt(0); //'h'
String str = "hello";
// String을 쪼개어 char 배열로 만들어준다.
char[] arr = str.toCharArray(); //['h','e','l','l','o']
String str = "hello";
// str을 n번 반복해준다.
String repeat = str.repeat(3); //"hellohellohello"
String str = "hello";
// 문자열은 객체이므로 비교연산자(==)로 비교할 수 없다.
// 다른 문자열과 비교하여 boolean값 반환한다.
if(str.equals("hi"))
String str = "hello";
// 문자열의 길이를 반환
int length = str.length(); //5
String str = "hello";
// 문자열의 startIndex부터 endIndex-1까지 잘라서 반환
String subStr = str.substring(0,3); // "hel"
// 매개변수를 하나만 받으면 해당 index부터 끝까지 반환
String subStr = str.substring(3); // "lo"
String str = "hello";
// 문자열의 모든 알파벳이 대문자로 변환
String upper = str.toUpperCase(); //"HELLO"
String str = "HELLO";
// 문자열의 모든 알파벳이 소문자로 변환
String upper = str.toLowerCase(); //"hello"
String[] arr = {"a", "b", "c"};
// 구분 기호 separator로 배열의 원소들을 연결한다.
String join = String.join("", arr); // "abc"
// String으로 형변환 해준다.
String str = String.valueOf(1); //"1"
String str = String.valueOf(1.2); //"1.2"
String str = String.valueOf('a'); //"a"
String str = String.valueOf({'j','a','v','a'}); //"java"
String str = String.valueOf(true); //"true"
// 문자열에 문자 또는 부분 문자열의 포함여부를 확인한다.
String str = "hello";
str.indexOf("ll"); // 있다면 시작 인덱스 2를 반환하고 없으면 -1을 반환한다.
// 문자열에 문자 또는 부분 문자열의 포함여부를 확인한다.
String str = "hello";
str.contains("ll"); // 있다면 true 없다면 false 반환한다.
// 원본 문자열이 전달받은 문자열로 시작하는지 검사한다.
String str = "hello";
str.startsWith("he"); // 해당 문자열로 시작하면 true 아니라면 false를 반환한다.
// 원본 문자열이 전달받은 문자열로 끝나는지 검사한다.
String str = "hello";
str.startsWith("llo"); // 해당 문자열로 끝나면 true 아니라면 false를 반환한다.