출처 | https://www.youtube.com/channel/UCtaUzBujIBjtrkqACmkM44g
String 클래스에 대한 개념이 확실하게 잡히지 않아서 유투버 나무소리님 강의를 듣고 작성한다.
자바는 문자열을 관리하기 위한 여러 클래스를 제공하고 있으며 대표적인 클래스가 Stirng
이다.
String 클래스는 문자열 제어를 위한 다수의 메소드를 정의하고 있다.
String 클래스는 배부적으로 byte[]
를 이용해 문자열을 관리한다. [Java 8까지 char[]] 사용 --> 메모리 누수 발생
자바의 문자형 체계는 UTF-16 코드 체계를 채택하고 있으며 이는 2byte 기반의 문자 체계다.
1byte로 표현 가능한 문자의 경우 남은 1byte에 대한 메모리 낭비가 발생하게 되어 이를 개선하기 위해 Java9부터 Compact String 개념이 도입되었다.
-> 몰랐음
String 클래스의 기능을 사용할 때 String 클래스의 특징을 이해하고 사용하는 것이 필요하다.
String 객체의 초기화 방식은 리터럴을 이용한 방식
과 객체생성을 통한 초기화 방식
2가지다. -> 용어 숙지하기 몰랐음
String은 불변의 특성을 가지고 있으며 내부적으로 String pool
을 통해 문자열 상수를 관리한다. -> String pool 몰랐음
문자열의 변경이 빈번한 로직에서 String의 사용은 메모리 누수(Memory leak)
이 발생할 수 있기 때문에 주의해야한다.
필자가 Focus 해서 공부해야 되는 부분
StringBuilder
와 StringBuffer
클래스는 동기화 특성
을 제외하고 모든 메소드의 기능이 동일하다.
-> 이 부분은 몰랐음
이 두 클래스는 String 클래스와 달리 가변(mutable)
의 특성을 가지고 있다.
StringBuilder, StringBuffer 두 클래스는 AbstractStringBuilder 추상 클래스를 상속하고 있으며 이 클래스는 내부적으로 문자열을 관리하기 위한 byte[]과 배열의 길이를 계산하기 위한 count 속성을 갖고 있다.
StringBuilder 클래스와 StringBuffer 클래스의 유일한 차이는 동기화 처리 여부
다.
StringBuffer 클래스는 멀티스레드(Multi Thread)
프로그램에서 데이터에 대한 동기화 문제가 발생하지 않도록 대부분의 메소드에서 동기화 처리를 하고 있다.
이런 동기화 처리 과정은 성능에 영향을 주기 때문에 단일스레드
프로그램에서는 StringBulider 클래스를 사용한다.
+
연산은 피연산자 문자열일 경우 두 피연산자을 문자열로 연결해 주는 기능을 갖고 있다.package com.util;
// String 원본이 바뀌지 않는다.
public class String2 {
public static void main(String[] args) {
String sql = "SELECT deptno";
sql = "dname,loc FROM dept";
System.out.println(sql);
}
}
----------------------------------------------
dname,loc FROM dept
package com.util;
// String 원본이 바뀌지 않는다.
public class String2 {
public static void main(String[] args) {
String sql = "SELECT deptno";
System.out.println(sql);
sql = "dname,loc FROM dept";
System.out.println(sql);
}
}
------------------------------------------------
SELECT deptno
dname,loc FROM dept
package com.util;
// String 원본이 바뀌지 않는다.
// 같은 이름의 두 개의 객체를 생성해서 처리함 - 문제제기
public class String2 {
public static void main(String[] args) {
String sql = "SELECT deptno";
sql += "dname,loc FROM dept";
System.out.println(sql);
}
}
-------------------------------------------------
SELECT deptnodname,loc FROM dept
package com.util;
// String 원본이 바뀌지 않는다.
// 같은 이름의 두 개의 객체를 생성해서 처리함 - 문제제기
public class String2 {
public static void main(String[] args) {
String sql = "SELECT deptno";
sql += "dname,loc FROM dept";
System.out.println(sql);
String s = "hello";
System.out.println(s.replace('e','o')); // e->o로 바뀌어줬으면 해
System.out.println(s); // 원본 바뀔까? --> No
}
}
---------------------------------------------
SELECT deptnodname,loc FROM dept
hollo
hello
package com.util;
// String 원본이 바뀌지 않는다.
// 같은 이름의 두 개의 객체를 생성해서 처리함 - 문제제기
public class String2 {
public static void main(String[] args) {
String sql = "SELECT deptno";
sql += "dname,loc FROM dept";
System.out.println(sql);
String s = "hello";
System.out.println(s.replace('e','o')); // e->o로 바뀌어줬으면 해
System.out.println(s); // 원본 바뀔까? --> No
// 원본을 바꾸러면? -> 치환을 해야한다.
s = s.replace('e', 'o');
System.out.println(s);
}
}
-----------------------------------------------------
SELECT deptnodname,loc FROM dept
hollo
hello
hollo
쿼리문을 쓸 때 String을 쓰지 않는 이유