자바에서 String 클래스란?
: 자바에서 문자열을 다루기 위해 제공되는 대표적인 클래스
문자열은 char의 배열로 구성된 데이터 타입이며 자바에서는 String 클래스가 이러한 문자열을 처리하고 관리하는 역할을 한다.
String 클래스 주요 특징
1. 불변성
String 객체는 한 번 생성되면 그 값을 변경할 수 없다. 문자열을 수정하는 경우 새로운 String 객체가 생성되고 원래의 문자열은 변경되지 않는다.
-> 멀티스레드 환경에서 안전하게 사용할 수 있다. (상태 변화가 없기 때문에 동기화 불필요, 공유 객체를 안전하게 재사용, 데이터 일관성 보장)
2. 리터럴로 선언 가능
String str = "Hello"; 처럼 문자열 리터럴을 이용해 선언할 수 있다. 자바는 동일한 리터럴 값을 가진 문자열을 메모리의 하나의 공간에서 재사용하기 때문에 성능상 이점이 있다.
-> 메모리 효율성, 성능 최적화 (String Constant Pool)
3. 메소드 제공
- length() : 문자열의 길이 반환
- charAt(int index) : 특정 인덱스에 위치한 문자 반환
- substring(int beginIndex, int endIndex) : 문자열의 부분 문자열 반환
- equals(Object anObject) : 두 문자열이 같은지 비교
- toUpperCase(), toLowerCase() : 대소문자 변경
4. 가변 문자열 사용을 위한 대안
String 객체가 불변이므로 자주 수정해야 하는 문자열 작업에서는 성능 이슈가 있을 수 있다. 이런 경우 StringBuilder 또는 StringBuffer 클래스를 사용하는 것이 좋다.
String 클래스 생성
String strA = new String("소유진");
String strB = "김유진";
문자열 복사
strA = strB;
String 클래스 인스턴스 비교
== 연산자
: 문자열이 저장된 주소를 비교하므로 인스턴스의 내용이 같은지를 올바르게 판단할 수 없다.
equals()
: 참조변수가 참조하는 내용이 같은지를 판단한다.
String strA = new String("ABBA");
String strB = "ABBA";
// 문자열에서 == 연산자는 주소를 비교
boolean resultA = (strA == strB);
System.out.printf("== 연산자는 주소 비교 : %b\n",resultA);
// 문자열에서 내용 비교 시 문자열에서 equals() 메소드 사용
boolean resultB = strA.equals(strB);
System.out.printf("equals() 메소드는 내용 비교 : %b\n",resultB);
-> 내용을 비교하려면 equals() 함수를 사용해야한다.
-> 만약 new 키워드 없이 했다면 주소로 비교하더라도 true 의 결과가 나온다. 자바는 동일한 리터럴 문자열을 하나의 메모리 공간에서 재사용하기 때문이다.
String 클래스의 문자열 연결
+ 연산자
연산할 두 개의 문자열 중 하나가 String 문자열이면 문자열이 아닌 값이 String 으로 변환하여 문자열을 연결한다.
// 문자열에서 + 연산자는 문자열을 연결
String strA = "안녕하세요. ";
strA += "저는 ";
strA += "소유진";
strA += "입니다.";
System.out.printf("문자열 연결의 경우 : %s\n",strA);
// 문자열과 숫자를 연결 시 숫자는 문자열로 변환되어 연결된다.
String strB;
strB = "당신의 자바 점수는 " + 100 + "점 입니다.";
System.out.printf("문자열과 숫자 연결의 경우 : %s\n",strB);
toString()
자바언어의 최상위 클래스는 Object 클래스이며 Object 클래스로부터 상속 받은 모든 클래스는 toString() 메서도를 가지고 있다.
이 메소드를 사용하여 기본형 데이터와 객체를 String 클래스인 문자열로 나타낼 수 있다.
// toString() 메소드 오버라이딩
public String toString() {
return String.format("이름 : %s, 주소 : %s, 핸드폰번호 : %s\n",name,address,phoneNumber);
}
PersonInfo 클래스 안에 이 메소드가 있으면
// PersonInfo 형 객체생성 후 초기값을 생성자에게 전달
PersonInfo prInfo = new PersonInfo("유진","서울","010-1212-3434");
// toString() 메소드는 객체를 문자열로 표현한 값을 리턴한다.
System.out.println(prInfo);
이렇게 했을 때 위의 형식대로 출력된다.
-> println() 메소드가 객체를 출력할 때 내부적으로 toString() 메소드를 호출하기 때문이다.
String 클래스 배열
문자열이 여러 개이면 배열을 사용할 수 있다.
// 문자열 배열 선언
String strA[] = new String[4];
// 문자열 배열에서 객체생성 후 초기값을 default 생성자에게 전달
strA[0] = new String("김태연");
// 문자열 배열은 객체이므로 객체를 생성하지 않고 문자열 저장
strA[1] = "권유리";
strA[2] = "이순규";
strA[3] = "황미영";
// 문자열에 저장된 값을 for 문을 이요하여 출력
for (String stA : strA)
System.out.printf(" %s",stA);
System.out.println();
// 문자열 배열 선언 및 초기값 부여2
String strB [] = {
"최수영", "임윤아", "서주현", "김효연"
};
for (String stB : strB)
System.out.printf(" %s",stB);
'JAVA > 기초공부' 카테고리의 다른 글
[JAVA] 메소드 오버라이딩 (0) | 2024.10.01 |
---|---|
[JAVA] 패키지 (3) | 2024.09.29 |
[JAVA] this와 this() 메소드 (0) | 2024.09.28 |
[JAVA] 생성자와 생성자 중복 (5) | 2024.09.28 |
[JAVA 기초] 클래스 정의 및 객체 생성 (1) | 2024.09.25 |