자바 - String [구체화]

지환·2023년 10월 7일
0

JAVA

목록 보기
18/39

출처 | https://www.youtube.com/channel/UCtaUzBujIBjtrkqACmkM44g

String 클래스에 대한 개념이 확실하게 잡히지 않아서 유투버 나무소리님 강의를 듣고 작성한다.

문자열 클래스(1/6)

  • 자바는 문자열을 관리하기 위한 여러 클래스를 제공하고 있으며 대표적인 클래스가 Stirng이다.

  • String 클래스는 문자열 제어를 위한 다수의 메소드를 정의하고 있다.


문자열 클래스(2/6) - String 클래스 문자체계

  • String 클래스는 배부적으로 byte[]를 이용해 문자열을 관리한다. [Java 8까지 char[]] 사용 --> 메모리 누수 발생

  • 자바의 문자형 체계는 UTF-16 코드 체계를 채택하고 있으며 이는 2byte 기반의 문자 체계다.

  • 1byte로 표현 가능한 문자의 경우 남은 1byte에 대한 메모리 낭비가 발생하게 되어 이를 개선하기 위해 Java9부터 Compact String 개념이 도입되었다. -> 몰랐음


문자열 클래스(3/6) - String 클래스 특징

  • String 클래스의 기능을 사용할 때 String 클래스의 특징을 이해하고 사용하는 것이 필요하다.

  • String 객체의 초기화 방식은 리터럴을 이용한 방식객체생성을 통한 초기화 방식 2가지다. -> 용어 숙지하기 몰랐음

  • String은 불변의 특성을 가지고 있으며 내부적으로 String pool을 통해 문자열 상수를 관리한다. -> String pool 몰랐음

  • 문자열의 변경이 빈번한 로직에서 String의 사용은 메모리 누수(Memory leak)이 발생할 수 있기 때문에 주의해야한다.


필자가 Focus 해서 공부해야 되는 부분

문자열 클래스(4/6) - StringBuilder, StringBuffer 클래스

  • StringBuilderStringBuffer 클래스는 동기화 특성을 제외하고 모든 메소드의 기능이 동일하다.
    -> 이 부분은 몰랐음

  • 이 두 클래스는 String 클래스와 달리 가변(mutable)의 특성을 가지고 있다.

  • StringBuilder, StringBuffer 두 클래스는 AbstractStringBuilder 추상 클래스를 상속하고 있으며 이 클래스는 내부적으로 문자열을 관리하기 위한 byte[]과 배열의 길이를 계산하기 위한 count 속성을 갖고 있다.

문자열 클래스(5/6) - StringBuilder, StringBuffer 클래스의 차이

  • StringBuilder 클래스와 StringBuffer 클래스의 유일한 차이는 동기화 처리 여부다.

  • StringBuffer 클래스는 멀티스레드(Multi Thread) 프로그램에서 데이터에 대한 동기화 문제가 발생하지 않도록 대부분의 메소드에서 동기화 처리를 하고 있다.

  • 이런 동기화 처리 과정은 성능에 영향을 주기 때문에 단일스레드 프로그램에서는 StringBulider 클래스를 사용한다.

  • 동기화 처리에 대한 공부가 필요함


    자열 클래스(6/6) - +연산자

  • 자바의 + 연산은 피연산자 문자열일 경우 두 피연산자을 문자열로 연결해 주는 기능을 갖고 있다.
  • 문자열의 연결은 String 클래스의 concat(), StringBuilder 클래스의 append() 와 동일한 기능이다.
  • Java8까지 문자열에 대한 + 연산은 StringBuilder 클래스의 append() 기능을 이용해 수행했다.
  • Java9부터는 StringConcatFactory라는 새로운 클래스의 기능을 이용해 문자열에 대한 + 연산을 진행한다.

String 예제

String 예제1

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

String 예제2

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

String 예제3

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

String 예제4

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을 쓰지 않는 이유

  • StringBuilder를 사용하면 +로 치환 하는 것 보단, 메모리에 대한 누수를 막을 수 있다. (메모리에 대한 이익이 있다.)
profile
아는만큼보인다.

0개의 댓글