강좌 Course 2. Part 1. ch3 요약
문자열은 자바에서 String 타입의 객체로 취급된다. 가장 많이 사용하는 타입 중 하나인 String 타입에 대해 더 알아보았다.
String str1 = new String("Hello World");
String str2 = new String("Hello World");
String str3 = "Hello World";
String str4 = "Hello World";
String 객체는 new 생성자를 사용하여 생성할 수도 있고, 이를 생략해서 만들 수도 있다. str1, 2는 객체를 생성하기 때문에 Heap Area에 생성되고, str3, 4는 문자 상수(=리터럴)로 Literal Pool에 생성된다. 리터럴 풀은 재활용 메모리 공간이라서, 같은 내용의 문자열이 풀에 생성되어 있는 상태면 객체를 새로 생성하지 않고 이미 만들어져있는 메모리 공간을 가리킨다.
따라서, str1과 str2의 메모리 번지는 서로 다르지만, str3과 str4의 메모리 번지는 서로 같다.
기본적으로 자주 쓰이는 String의 메서드는 다음과 같다.
- charAt
인수로 받은 인덱스의 문자 반환- replaceAll
1번째로 받은 인수를 전부 2번째로 받은 인수로 대체- indexOf
인수로 받은 문자의 인덱스를 반환하며, 해당 문자를 찾지 못하면 -1을 반환- length
배열의 길이 반환- toUpperCase
문자열을 전부 대문자로 변환- toLowerCase
문자열을 전부 소문자로 변환- substring
인수로 받은 인덱스부터의 끝까지의 문자열 반환. 인수를 2개 받으면, 1번째 인수의 인덱스부터 2번째 인수-1의 인덱스까지의 문자열을 반환
public class StringManipulation {
public static void main(String[] args) {
String str = new String("Hello World");
char firstChar = str.charAt(0);
System.out.println("firstChar = " + firstChar);
String replacedString = str.replaceAll("o","X");
System.out.println("replacedString = " + replacedString);
int index = str.indexOf("W");
System.out.println("index = " + index);
int length = str.length();
System.out.println("length = " + length);
String Upper = str.toUpperCase();
System.out.println("Upper = " + Upper);
String Lower = str.toLowerCase();
System.out.println("Lower = " + Lower);
String substring = str.substring(5);
System.out.println("substring = " + substring);
}
}
Java를 사용하다보면 id와 pw등의 문자열을 비교할 일이 많이 생긴다. 여태 사용했던 관계연산자 중 == 는 왼쪽에 온 변수와 오른쪽에 온 변수가 같으면 true, 다르면 false를 반환했다. 문자열에서는 이 연산자를 사용하기보다는 equals()와 compareTo() 메서드를 사용하게 된다.
String str1 = "Hello";
String str2="World";
str1, str2가 있다고 가정하자.
equals()
str1과 str2를 비교하여 같으면 true, 다르면 false를 반환한다.
compareTo()
사전순으로 문자열을 비교하여 두 문자열이 같으면 0을 반환하고, 비교대상 문자열이 기준 문자열보다 작으면 음수, 크면 양수를 반환한다.
문자열 앞부터 아스키코드값을 비교하여, 기준 문자열의 코드값에서 비교대상 문자열의 코드값을 뺀 값을 기준으로 작은지 큰지 판단한다.
* compareToIgnoreCase()는 대소문자를 상관하지 않고 compareTo를 적용하는 메서드이다.
public class StringComparison {
public static void main(String[] args) {
String str1 = "Hello";
String str2="World";
if (str1.equals(str2)){
System.out.println("Same");
} else {
System.out.println("Not same");
}
String str3 = "apple";
String str4 = "banana";
int result = str3.compareTo(str4);
if (result==0){
System.out.println("str3 and str4 are the same");
} else if (result < 0) {
System.out.println("str3 comes before str4");
} else {
System.out.println("str 3 comes after str4");
}
}
}
csv파일이나 웹스크래핑을 해서 긁어온 response를 다룰 때 필요한 것이 문자열 분리이다. 문자열을 특정 구분자(delimiter)를 기준으로 분리할 때는 split()을 사용한다.
* 문자열을 잘라서 문자열 배열에 저장할 경우, 배열에 저장되는 것은 문자열 자체가 아닌 문자열 객체가 생성되어 있는 번지주소이다.
split()
특정 구분자(delimiter)를 기준으로 분리하려면 해당 구분자를 인수로 넘겨준다.
정규표현식을 사용할 수도 있다.
public class StringSplit {
public static void main(String[] args) {
String str1 = "Hello,world,Java";
String[] strArray = str1.split(",");
for (String s:strArray){
System.out.println(s);
}
String str2 = "Hello java this is not python";
// 하나 이상의 공백을 찾아 분리
String[] strArray2 = str2.split("\\s+");
for (String s:strArray2){
System.out.println(s);
}
// 문자열을 직접 입력받고 공백을 기준으로 분리
Scanner scan = new Scanner(System.in);
System.out.print("Write a sentence");
String str3 = scan.nextLine();
String[] strArray3 = str3.split("\\s+");
for (String s:strArray3){
System.out.println(s);
}
}
}
공백을 기준으로 분리할 때, 정규표현식이 아닌 일반적인 공백(" ")을 넣어도 오류가 나지는 않는다. 하지만 공백이 2개가 있거나 할 경우에는 공백 하나를 기준으로 문자열을 분리하기 때문에 만족스러운 결과가 나오지 않을 수 있다.
정규표현식도 나중에 한 번 정리를 해야겠다.