자바 String
문자열은 문자로 구성된 문장을 뜻한다. 자바에서는 문자열을 나타내는 자료형은 String이다. 자바의 String은 기본형 타입이 아닌 참조형 타입(하나의 클래스)이다.
String a = "Hello"
System.out.println(a.hashcode())
a = a + " World";
System.out.println(a.hashcode()) # 해시 값이 서로 다르다
String은 불변(immutable)으로 설계되었는데, 이는 처음 만들어진 String은 어딘가에 저장되고, 거기에 추가될 떄는 새로운 String 값으로 저장된다.
선언 방식
리터럴 방식
String str = "Hello";
상수풀에 문자열을 저장한다. 동일한 문자열 리터럴이 여러번 등장하면 동일한 객체를 재사용한다.
new 키워드 방식
String str = new String("Hello");
항상 새로운 String 객체를 생성하며 힙 영역에 저장된다.
String constant Pool
String constant Pool은 JVM이 문자열 리터럴을 메모리 상에서 관리하는 장소이다. 문자열 리터럴이 사용될 때, 이 문자열은 상수 풀에 저장되며 동일한 문자열을 사용할 때는 새로운 객체를 저장하지 않고 상수 풀에서 재사용된다.
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // true
s1과 s2는 동일한 문자열을 가졌기 때문에 s1, s2는 동일한 메모리 주소를 참조하게 된다. 따라서 == 연산자가 true를 반환하게 된다.
참고 ) String constant Pool은 기존에 permanent Generation 에 위치했지만, Java8부터는 PermGen이 없어지고 MetaSpace(Native 메모리 영역)라는 새로운 메모리 영역에 위치하게 되었다.
== vs equals()
==와 equals()는 모두 문자열을 비교할 때 사용하는 방법이다.
==
- 참조 비교
- 두 문자열 객체가 같은 메모리 주소를 가르키는 비교한다.
equals()
- 값 비교
- 두 문자열이 내용상 동일한지 비교한다
String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true
new 키워드를 사용하게 되면 항상 새로운 String 객체를 생성하게 된다(안의 내용이 동일하더라도!) 따라서 == 비교를 하게 되면 s1과 s2는 서로 다른 메모리 주소를 가지기 때문에 false를 반환하게 된다. 반면 equals()는 값을 비교하기 때문에 true를 반환한다.
문자열 내장 메서드
1 ) lenth()
: 문자열 길이를 반환
String str = "Hello"
System.out.println(str.length()); // 5
2 ) charAt(int index)
: 주어진 인덱스 위치에 있는 문자를 반환
String str = "Hello"
System.out.println(str.charAt(1)); // 'e'
3 ) substring(int start, int end)
: 문자열의 특정 인덱스 범위(start ~ end - 1)에 해당하는 부분 문자열을 반환
System.out.println(str.substring(0, 3)); // 'Hel'
4 ) toUpperCase, toLowerCase()
: 문자열을 대문자, 소문자로 변환한 새로운 문자열을 반환
String upper = str.toUpperCase(); // "HELLO"
String lower = str.toLowerCase(); // "hello"
5 ) trim()
: 문자열 앞뒤의 공백을 제거한 새로운 문자열을 반환
String trimmed = " Hello ".trim(); // "Hello"
6 ) split(String regex)
String[] parts = "apple,banana,orange".split(","); // ["apple", "banana", "orange"]
7 ) indexOf(String str)
: 특정 문자열이 처음 나타나는 인덱스를 반환
int index = str.indexOf("l"); // 2
참고자료
'Java' 카테고리의 다른 글
접근제어자 캡슐화, 정보 은닉 (0) | 2024.11.20 |
---|---|
String, Stringbuffer, Stringbuilder 차이 (0) | 2024.11.20 |
기본 타입과 참조 타입 (0) | 2024.11.15 |
JVM의 동작방식과 구조 (0) | 2024.11.14 |
가비지 컬렉션 (Garbage Collection, GC) (0) | 2024.11.14 |
댓글