String Class의 특징 및 주요 메서드(StringBuffer, StringTokenizer)
String 클래스의 특징
1. 문자열 객체를 처리하는 클래스.
2. 객체 생성 방법 - 2가지
1) 일반 변수 선언 방법으로 객체 생성
==> heap 영역에 있던 문자열을 참조하기에 주소값이 같음.
예) String str1 = "홍길동";
String str2 = "홍길동";
2) new 키워드를 이용하는 방법.
==> heap영역에 있던 문자열을 참조하지 않고 새로운 객체를 만듦.
예) String str3 = new String("홍길동");
String str4 = new String("홍길동");
3). equals() : 객체의 내용(데이터)를 대상으로 비교하여
객체가 같으면 true, 틀리면 false값을 반환하는 메서드.
예) if(str.equals(str2)) { }
(중요!) 문자열이 결합이 되면 새로운 메모리 공간을 확보한 후, 그 메모리에 str1과 str2가 결합된 문자열이 들어가고 새로운 메모리 주소를 참조하게 된다.
String 클래스의 주요 메서드
1. 소문자 -> 대문자 : toUpperCase()
대문자 -> 소문자 : toLowerCase()
2. length() : 문자열의 길이를 정수값으로 반환하는 메서드.
3. concat() : 문자열을 결합하는 메서드.
4. equalsIgnoreCase() : 대소문자를 구분하지 않는 메서드.
5. charAt(index) : 문자열에서 특정 단일 문자를 추출하는 메서드. index는 0부터 시작한다.
String 클래스의 단점
- 빈번한 문자열 연산을 실행할 경우 메모리(heap)를 많이 차지하게 됨.
- 매번 연산 시마다 새로운 객체를 생성. ==> 힙(heap) 영역의 과부하가 발생할 가능성이 많음.
- 이러한 단점을 개선한 클래스가 등장 : StringBuffer 클래스
StringBuffer 클래스
1. append() : 문자열을 추가하는 메서드.
2. replace() : 문자열을 교체하는 메서드
형식) replace(시작 index, 끝 index+1, 교체할 문자열)
3. substring() : 문자열을 추출하는 메서드
형식1) substring(시작 index, 끝 index+1)
형식2) substring(시작 index) => 시작 index부터 끝까지
StringTokenizer 클래스
- 특수 문자를 기준문자(delimiter)로 문자열을 잘라 주는 클래스(파싱).
- 기준문자로 분리된 문자열을 토큰(token)이라고 함.
- 웹에서 전화번호를 하이픈(-) 기준으로 앞자리, 중간자리, 뒷자리 형식으로 구분해서 번호 추출할 때 사용함.
(주민번호, 핸드폰 번호 등등)
1.countTokens() : 토큰으로 구분된 문자열의 갯수 반환
2.hasMoreTokens() : 반환할 다음 토큰이 있는지 확인. 있으면 true 반환, 없으면 false 반환
예제1) String 변수의 참조 주소값 확인
public class Ex01 {
public static void main(String[] args) {
// 1) 일반 변수 선언 방법으로 객체 생성.
String str1 = "홍길동";
String str2 = "홍길동";
if(str1 == str2) {
System.out.println("참조하는 주소가 같다.");
} else {
System.out.println("참조하는 주소가 다르다.");
}
System.out.println();
// System.identityHashCode() ==> 주소값 출력하는 메소드
System.out.println("str1 주소 >>> " + System.identityHashCode(str1));
System.out.println("str2 주소 >>> " + System.identityHashCode(str2));
System.out.println();
// 2) new 키워드를 이용하는 방법.
String str3 = new String("홍길동");
String str4 = new String("홍길동");
if(str3 == str4) {
System.out.println("참조하는 주소가 같다.");
} else {
System.out.println("참조하는 주소가 다르다.");
}
System.out.println();
System.out.println("str3 주소 >>> " + System.identityHashCode(str3));
System.out.println("str4 주소 >>> " + System.identityHashCode(str4));
System.out.println();
}
}
예제2) 문자열 결합시 새로운 주소값을 참조하는 것을 확인
public class Ex02 {
public static void main(String[] args) {
String str1 = "abc";
String str2 = "def";
System.out.println("str1 주소 >>> " + System.identityHashCode(str1));
System.out.println("str2 주소 >>> " + System.identityHashCode(str2));
System.out.println();
str1 += str2; // str1 = str1 + st2
System.out.println("str1 주소 >>> " + System.identityHashCode(str1));
// 문자열이 결합이 되면 새로운 메모리 공간을 확보한 후,
// 그 메모리에 str1과 str2가 결합된 문자열이 들어가고 새로운 메모리 주소를 참조하게 된다.
}
}
예제3) String Class의 주요 메서드
public class Ex03 {
public static void main(String[] args) {
// 1. 소문자 -> 대문자 : toUpperCase()
// 대문자 -> 소문자 : toLowerCase()
String str = "java program";
System.out.println("대문자 >>> " + str.toUpperCase());
System.out.println("소문자 >>> " + str.toUpperCase().toLowerCase());
System.out.println();
// 2. length() : 문자열의 길이를 정수값으로 반환하는 메서드.
System.out.println("str 문자열의 길이 >>> " + str.length());
System.out.println();
// 3. concat() : 문자열을 결합하는 메서드.
String str1 = "JAVA ";
String str2 = str1.concat("PROGRAM");
System.out.println("str2 문자열 >>> " + str2);
System.out.println();
// 4. equalsIgnoreCase() : 대소문자를 구분하지 않는 메서드.
if(str.equalsIgnoreCase(str2)) {
System.out.println("두 문자열은 같은 문자열이다.");
} else {
System.out.println("두 문자열은 다른 문자열이다.");
}
System.out.println();
// 5. charAt(index) : 문자열에서 특정 단일 문자를 추출하는 메서드.
// index는 0부터 시작한다.
String juminNo = "123456-2345678";
char gender = juminNo.charAt(7);
if(gender == '1' || gender == '3') {
System.out.println("당신은 남자");
} else if( gender == '2' || gender == '4') {
System.out.println("당신은 여자");
} else {
System.out.println("당신은 외국인");
}
}
}
예제4) StringBuffer
public class Ex04 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("java ");
// 1. append() : 문자열을 추가하는 메서드.
System.out.println("문자열 추가 후 >>> " + sb.append("program"));
System.out.println();
// 2. replace() : 문자열을 교체하는 메서드
// 형식) replace(시작 index, 끝 index+1, 교체할 문자열)
sb.replace(0, 4, "spring");
System.out.println("문자열 교체 후 >>> " + sb);
System.out.println();
// 3. substring() : 문자열을 추출하는 메서드
// 형식1) substring(시작 index, 끝 index+1)
// 형식2) substring(시작 index) => 시작 index부터 끝까지
StringBuffer sb1 = new StringBuffer("2021/03/16 11:09:10");
System.out.println("오늘 날짜 >>> " + sb1.substring(0,10) );
System.out.println("현재 시간 >>> " + sb1.substring(11));
}
}
예제5) StringTokenizer
import java.util.StringTokenizer;
public class Ex05 {
public static void main(String[] args) {
String str = "id=hong&pwd=1234&age=27";
StringTokenizer st = new StringTokenizer(str, "&");
//int count = st.countTokens(); // 토큰으로 구분된 문자열의 갯수
System.out.println("토큰 수 >>> " + st.countTokens());
// hasMoreTokens() : 반환할 다음 토큰이 있는지 확인. 있으면 true 반환, 없으면 false 반환
while(st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
}
}