⭐String 과 StringBuffer
String 클래스
문자열을 표현하는데 사용된다.
💀불변 immutable 이다.
한 번 설정하면 변경할 수 없다.
String 클래스를 통해 문자열을 저장하는 방식엔 2가지가 있다.
리터럴 방식
String str1 = "Hello";
Heap 안에 존재하는 특정한 영역
String Constant Poll에 저장돼 재사용된다.
new 연산자 사용
String str1 = new String("Hello");
Heap 메모리에 객체로서 올라간다.
String 클래스의 특성으로 인해
문자열을 자주 변경한다면
메모리 낭비가 심해질 수 있다.
상수풀에 문자열을 저장한 뒤
이를 참조해서 재사용하면 메모리를 아낄 수 있다.
⭐StringBuffer
String 클래스의 불변성으로 인해
문자열을 자주 변경할 때 메모리 낭비가 발생할 수 있다.
StringBuffer를 사용하면
객체를 계속해서 생성시키지 않고 문자열을 변경 가능하다.
예제) String 클래스의 객체 선언 방식
package _string;
/**
* 4.24
* String 연습
*/
public class StringTest1 {
//변수
//생성자
//메서드
//main
public static void main(String[] args) {
String str1 = "문자열"; //Heap => StringPool에 저장
String str2 = new String("abc"); //Heap에 저장
String str3 = new String("abc");
//Heap에 올라가면 주소값이 생성된다.
/*
참조 비교
주소 == 주소
각각 객체의 주소값을 비교한다.
*/
System.out.println("str2 == str3: " + (str2 == str3));
//문자열을 리터럴 방식으로 만들어보자
String str4 = "abc";
String str5 = "abc";
String str6 = "abc";
System.out.println("str4 == str5: " + (str4 == str5));
/*
문자열은 아주 많이 사용되는 데이터 타입이다.
모든 문자열이 객체로 저장된다면
메모리 효율이 떨어지게 된다.
상수풀에 문자열을 저장한 뒤
이를 참조해서 재사용하면 메모리를 아낄 수 있다.
그래서 str1 = "abc" = str4,str5 인 것이다.
*/
String str7 = str6 + " 안녕"; //"abc 안녕"이라는 새로운 녀석이 상수풀에 올라갔다.
System.out.println(str7);
}//end of main
}//end of class
String은 리터럴 방식, 객체 방식으로 선언하면 저장방식의 차이로 인해 주소값이 달라질 수 있다.
str2, str3은 객체로
str4, str4는 리터럴로 선언됐다.
예제2)
String은 불면한다
💀String 객체는 불변 immutable 이다.
원래 객체 주소가 생성됐고
내부 변수 값이 변경된다면
String 클래스는 수정되지 않고 불변이다.
⭐ 만약 수정을 하게되면
새로운 String 객체를 만드는 동작이 실행된다.
package _string;
/**
* 4.24
* String 연습
*/
public class StringTest2 {
//main
public static void main(String[] args) {
//객체
String str1 = new String("Hello");
String str2 = new String("World");
/*
String 객체는 불변 immutable 이다.
원래 객체 주소가 생성됐고
내부 변수 값이 변경된다면
String 클래스는 수정되지 않고 불변이다.
만약 수정을 하게되면
새로운 String 객체를 만드는 동작이 실행된다.
*/
System.out.println("고유주소확인: " + System.identityHashCode(str1));
//문자열 연결 기능 호출
str1 = str1.concat(str2);
System.out.println("수정주소확인: " + System.identityHashCode(str1));
}//end of main
}//end of class
예제3)
String 클래스에 포함된 다양한 메서드를 사용해봤다.
⭐replace 메서드
문자열 내 특정 문자열을
다른 문자나 문자열로 교체할 때 사용한다
ex 비속어
⭐ substring 메서드
문자열 일부분을 추출하여
새로운 문자열로 반환한다.
두가지 오버로딩 메서드를 제공한다.
startindex~
startindex~ endIndex
index는 0부터 시작한다.
package _string;
/**
* 4.24
* String 연습
*/
public class StringTest3 {
//main
public static void main(String[] args) {
String str1 = "ABCD";
int countStr1 = str1.length(); //문자열 길이
System.out.println("countStr1: " + countStr1);
/*
replace 메서드는
문자열 내 특정 문자열을
다른 문자나 문자열로 교체할 때 사용한다
ex 비속어
World 를 Java로 대체해보자
*/
String str2 = "HelloWorld";
String str3 = str2.replace("World", "Java");
System.out.println("str2: " + str2); // HelloWorld
System.out.println("str3: " + str3); // HelloJava
/*
substring 메서드는
문자열 일부분을 추출하여
새로운 문자열로 반환한다.
두가지 오버로딩 메서드를 제공한다.
startindex~
startindex~ endIndex
index는 0부터 시작한다.
*/
String result1 = str2.substring(0, 5);
System.out.println("HelloWorld의 1~5번째 글자: " + result1);
}//end of main
}//end of class
예제4)
StringBuffer 활용
package _string;
/**
* 4.24
* String Buffer 연습
*/
public class StringBufferTest1 {
//main
public static void main(String[] args) {
String str1 = new String("Hello");
String str2 = new String("World");
//새로 배우는 데이터 타입 StringBuffer
StringBuffer buffer1 = new StringBuffer(str1);
System.out.println(buffer1);
System.out.println("수정전 해시코드: " + System.identityHashCode(buffer1));
//buffer1 값을 수정해보자 Replace
buffer1.append(str2); //문자열 합치기
buffer1.append("111");
buffer1.append("222");
System.out.println(buffer1);
System.out.println("수정후 해시코드: " + System.identityHashCode(buffer1));
/*
hashCode()
API7에서는 객체의 유일성 보장하는 정수값
API8부터는 buffer1.toString() 해야 값을 확인 가능
StringBuffer 데이터 타입을 String으로 형변환 하려면 toString()하면 됨
*/
String result1 = buffer1.toString();
System.out.println(result1);
}//end of main
}//end of class
'Java' 카테고리의 다른 글
쓰레드 Thread, 작업을 수행하는 단위 (0) | 2025.04.25 |
---|---|
예외처리 Exception, 예상치 못한 상황에 대비 (0) | 2025.04.24 |
자바 API 문서, 보는 습관을 들이자 (0) | 2025.04.24 |
오브젝트 Object 클래스, 자동으로 상속되는 최상위 클래스 (0) | 2025.04.24 |
SCM, VSC, and 분산형 저장 시스템 Git(계속) (0) | 2025.04.24 |