String 클래스
- 문자열 객체를 처리하는 클래스.
2. 객체 생성 방법 - 2가지
1) 일반 변수 선언 방법으로 객체 생성
==> heap 영역에 있던 문자열을 참조하기에 주소값이 같음.
// 1) 일반 변수 선언 방법으로 객체 생성
System.out.println("일반 변수 선언 방법으로 객체 생성");
String str1 = "홍길동";
String str2 = "홍길동";
if(str1 == str2) {
System.out.println("참조하는 주소가 같다");
}else {
System.out.println("참조하는 주소가 다르다");
}
System.out.println("str1 주소 : " + System.identityHashCode(str1));
System.out.println("str2 주소 : " + System.identityHashCode(str2));
결과
일반 변수 선언 방법으로 객체 생성
참조하는 주소가 같다 // => heap 영역에 있던 문자열을 참조하기에 주소값이 같음.
str1 주소 : 366712642
str2 주소 : 366712642 // 두 주소가 같은 것을 볼 수 있다.
2) new 키워드를 이용하는 방법.
==> heap영역에 있던 문자열을 참조하지 않고 새로운 객체를 만듦.
// 2) new 키워드를 이용하여 객체 생성
System.out.println("new 키워드를 이용하여 객체 생성하는 방식");
String str3 = new String("홍길동");
String str4 = new String("홍길동");
System.out.println("str3.equals(str4) : "+str3.equals(str4));
if(str3 == str4) {
System.out.println("참조하는 주소가 같다");
}else {
System.out.println("참조하는 주소가 다르다");
}
System.out.println("str3 주소 : " + System.identityHashCode(str3));
System.out.println("str4 주소 : " + System.identityHashCode(str4));
결과
new 키워드를 이용하여 객체 생성하는 방식
str3.equals(str4) : true
참조하는 주소가 다르다
str3 주소 : 1829164700
str4 주소 : 2018699554
★ equals() : 객체의 내용(데이터)를 대상으로 비교하여
객체가 같으면 true, 틀리면 false값을 반환하는 메서드.
예) if(str.equals(str2)) { }
(중요!) 문자열이 결합이 되면 새로운 메모리 공간을 확보한 후,
그 메모리에 str1과 str2가 결합된 문자열이 들어가고 새로운 메모리 주소를 참조하게 된다.
public class Ex02 {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "world";
System.out.printf
("str1 문자열 주소 : %s\n"
+ "str2 문자열 주소 : %s\n",
System.identityHashCode(str1)
, System.identityHashCode(str2));
// 문자열 연산(결합)
str1 = str1 + str2;
System.out.printf
("str1 문자열 주소 : %s",
System.identityHashCode(str1));
}
}
결과
str1 문자열 주소 : 366712642
str2 문자열 주소 : 1829164700
str1 문자열 주소 : 685325104
문자(Char) 과 문자열(String)의 차이, 그리고 ""와 ''의 차이!
주의!)
https://opentutorials.org/module/2495/13969
자바는 문자(Character)와 문자열(String)을 구분한다.
문자는 한 글자를 의미하고, 문자열은 여러 개의 문자가 결합한 것을 의미한다.
자바에서 문자는 '(작은따옴표)로 감싸야 한다.
System.out.println('생');
문자열은 "(큰따옴표)로 감싸야 한다.
System.out.println("생활코딩");
만약 문자열을 작은 따옴표로 감싸면 에러가 발생한다.
System.out.println('생활코딩'); ==> error 발생
하나의 문자를 큰따옴표로 감싼다고 에러가 발생하지는 않는다. 한 글자도 문자열이 될 수 있기 때문이다.
System.out.println("생");
자바에서 문자는 '(작은따옴표)로 감싸야 한다.
문자열은 "(큰따옴표)로 감싸야 한다.
라고 되어있다.
예제 코드에서
5번째 charAt 코드를 따라치다가, 오류가 발생했었다
// 5. charAt(index) : 문자열에서 특정 단일 문자를 추출하는 메소드
System.out.println("charAt(index)");
String personNumber = "123456-2345777";
char gender = personNumber.charAt(7);
if(gender == "1" || gender == "3") {
System.out.println("당신은 남자 입니다.");
}else if(gender == "2" || gender == "4") {
System.out.println("당신은 여자 입니다.");
}else {
System.out.println("당신은 외국인 입니다.");
}
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Incompatible operand types char and String
Incompatible operand types char and String
Incompatible operand types char and String
Incompatible operand types char and String
at String.Ex03.main(Ex03.java:43)
언뜻보면 위 코드와 다른 점을 모르겠지만..
이렇게 해당 구문에 에러표시가 되어있는 것을 볼 수 있다.
그렇다!
charAt 메소드는 char 타입의 자료형을 return해 주는 메소드이다.
따라서 작은따옴표('')로 문자를 감싸야 되는 것이다.
다행히 작은 따옴표로 수정하니 에러가 사라졌다.
String 클래스의 주요 메서드
1. 소문자 -> 대문자 : toUpperCase()
대문자 -> 소문자 : toLowerCase()
// 1. toUpperCase() : 소문자를 대문자로 바꿔주는 메소드
// <-> toLowerCase() : 대문자를 소문자로 바꿔주는 메소드
System.out.println("toUpperCase, toLowerCase 메소드");
String str1 = "java program";
String str2 = "JAVA PROGRAM";
System.out.printf("%s을 대문자로 바꿔보기 : %s\n",
str1, str1.toUpperCase());
System.out.printf("%s을 소문자로 바꿔보기 : %s\n",
str2, str2.toLowerCase());
결과
toUpperCase, toLowerCase 메소드
java program을 대문자로 바꿔보기 : JAVA PROGRAM
JAVA PROGRAM을 소문자로 바꿔보기 : java program
2. length() : 문자열의 길이를 정수값으로 반환하는 메서드
// 2. length() : 문자열의 길이를 정수값으로 반환하는 메소드
System.out.println("lenth 메소드");
System.out.printf("%s 문자열의 길이 : %d\n", str1, str1.length());
결과
lenth 메소드
java program 문자열의 길이 : 12
3. concat() : 문자열을 결합하는 메서드.
// 3. concat() : 문자열을 결합하는 메소드
System.out.println("concat 메소드");
String str3 = "JAVA";
String str4 = str3.concat("PROGRAM");
System.out.println("문자열 결합 결과 : " + str4);
결과
concat 메소드
문자열 결합 결과 : JAVAPROGRAM
4. equalsIgnoreCase() : 대소문자를 구분하지 않는 메서드.
// 4. equalsIgnoreCase() : 대소문자를 구분하지 않는 메소드
System.out.println("equalsIgnoreCase 메소드");
if(str1.equalsIgnoreCase(str2)) {
System.out.printf("%s, %s 두 문자열은 같은 문자열이다.\n",
str1, str2);
}else {
System.out.printf("%s, %s 두 문자열은 다른 문자열이다.\n",
str1, str2);
}
결과
equalsIgnoreCase 메소드
java program, JAVA PROGRAM 두 문자열은 같은 문자열이다.
5. charAt(index) : 문자열에서 특정 단일 문자를 추출하는 메서드. index는 0부터 시작한다.
// 5. charAt(index) : 문자열에서 특정 단일 문자를 추출하는 메소드
System.out.println("charAt(index)");
String personNumber = "123456-2345777";
char gender = personNumber.charAt(7);
if(gender == '1' || gender == '3') {
System.out.println("당신은 남자 입니다.");
}else if(gender == '2' || gender == '4') {
System.out.println("당신은 여자 입니다.");
}else {
System.out.println("당신은 외국인 입니다.");
}
결과
charAt(index)
당신은 여자 입니다.
String 클래스의 단점
- 빈번하게 문자열 연산을 실행할 경우
- 메모리(heap)을 많이 차지하게 됨
- 매번 연산 시마다 새로운 객체를 생성하게 됨 ==> 힙(heap) 영역의 과부하가 발생할 가능성이 많음
- 이러한 단점을 개선한 클래스가 등장 : StringBuffer 클래스
StringBuffer 클래스
StringBuffer sb = new StringBuffer("Java"); // 원본
1. append() : 문자열을 추가하는 메서드.
// 1. append() : 문자열을 추가해주는 메소드
System.out.println("append() 메소드");
sb.append("program");
System.out.println("문자열 추가 후 " + sb);
System.out.println();
결과
append() 메소드
문자열 추가 후 Javaprogram
2. replace() : 문자열을 교체하는 메서드
형식) replace(시작 index, 끝 index+1, 교체할 문자열)
// 2. replace() : 문자열을 교환하는 메소드
// 형식) replace(시작 index, 끝(-1) index, "교체할 문자열");
System.out.println("replace() 메소드");
sb.replace(0, 4, "spring");
System.out.println("문자열 교체 후 : " + sb);
System.out.println();
결과
replace() 메소드
문자열 교체 후 : springprogram
3. substring() : 문자열을 추출하는 메서드
형식1) substring(시작 index, 끝 index+1)
형식2) substring(시작 index) => 시작 index부터 끝까지
// 3. substring() : 문자열을 추출하는 메소드
// 형식 1) substring(시작 index, 끝(-1) index)
// 형식 2) substring(시작 index)
// 띄어쓰기(공백)은 제외
StringBuffer sb1 = new StringBuffer("2021/08/20 09:38:10");
System.out.println("오늘 날짜 : " + sb1.substring(0,10));
System.out.println("현재 시간 : " + sb1.substring(11));
System.out.println();
결과
오늘 날짜 : 2021/08/20
현재 시간 : 09:38:10
StringTokenizer 클래스
- 특수 문자를 기준문자(delimiter)로 문자열을 잘라 주는 클래스(파싱).
- 기준문자로 분리된 문자열을 토큰(token)이라고 함.
- 웹에서 전화번호를 하이픈(-) 기준으로 앞자리, 중간자리, 뒷자리 형식으로 구분해서 번호 추출할 때 사용함.
(주민번호, 핸드폰 번호 등등)
1.countTokens() : 토큰으로 구분된 문자열의 갯수 반환
2.hasMoreTokens() : 반환할 다음 토큰이 있는지 확인. 있으면 true 반환, 없으면 false 반환
package String;
import java.util.StringTokenizer; // StringTokenizer클래스를 호출해야 한다.
public class Ex05 {
public static void main(String[] args) {
String str = "id=hong&pwd=1234&age=27";
StringTokenizer st = new StringTokenizer(str, "&");
// countTokens() 기존 문자로 분리된 토큰의 갯수를 정수값으로 반환해주는 메소드
System.out.println("토큰 수 : " + st.countTokens());
// hasMoreTokens() : 반환할 다음 토큰이 있는지 확인. 있으면 true 반환, 없으면 false 반환
// nextToken() : 존재하는 토큰(기존 문자로 분리된 문자열)을 반환
while(st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
}
}
결과
토큰 수 : 3
id=hong
pwd=1234
age=27
'Back-End > Java' 카테고리의 다른 글
[Java] 생성자(Constructor) (0) | 2021.08.23 |
---|---|
[Java] 메소드 호출 시 반환형 (0) | 2021.08.19 |
[Java] Util 패키지의 주요 클래스_Random, Math, Calendar , Array, ArrayList (0) | 2021.08.19 |
[Java] 예외(Exception) 처리 (1) | 2021.08.18 |
[Java] final 지정자 (0) | 2021.08.18 |
댓글