String literal = “”; / String object = new String ( “” );
- String literal = “”; : Java Heap메모리의 String Pool 객체 안에 선언된다.
- String의 inern() 메서드가 호출되는 방식
- String str = new String(“”); Java Heap메모리에 새로운 객체가 선언된다.
문자열 선언 성능 비교
- String str = “hello”; 1회당 로직 수행 시간 : 0.849856ns
- String str = new String(“hello”); 1회당 로직 수행 시간 : 0.8495613ns
*서로 성능은 동일하다.
“Hello” 라는 문자열을 2개 선언했지만 JVM Heap 메모리의 String Pool 에는 하나만 존재한다.
두 변수는 reference로 가르키게 된다.
new String(“Hello”);
new 키워드는 heap에 객체를 생성하게 된다.
- 보통 String Pool을 이용하는 방식을 사용한다.
- 한번 쓰이고 버려지는 문자열일 경우 객체로 선언하여 GC의 대상이 되도록 할 때 사용을 고려해볼 수 있다.
*문자열을 붙이는 방법
‘+’ 연산자
- jdk1.5 이전에는 문자열을 추가할 때 마다 새로 생성해서 등록해서 속도가 느렸지만 이후에는 StringBuilder로 변환해서 처리하는 것으로 변경되었다.
StringBuilder
- .append를 통해서 값을 변경할 수 있다. 기존 객체를 수정하는 방식으로 메모리에 할당하는 과정 없이 수정이 가능하여 빠르다는 장점이 있다.
- 반복문 안에서 문자열을 계속 추가해야하는 경우 사용하는 것이 좋다.
StringBuffer
- StringBuilder와 사용법은 동일하며 차이점은 thread-safe를 보장하여 이 객체에 동시에 접근했을 때, 동시성을 제어해주는 기능이 존재한다.
- 멀티스레드를 이용하여 하나의 문자열을 수정해야할 경우 사용한다.
- 한번 사용하고 버려지면서 동시접근 시 데이터 무결성이 중요한 문자열의 경우 사용하기 용이하다. ex) SQL문
*문자열 삽입 속도 측정
테스트 방식 : "a" 글자 1회 붙임
- String : 247.4ns
- StringBuilder : 45.3ns
- StringBuffer : 56.4ns
* 대량 삽입("a" 글자 20회 붙임 * 100만회) 속도 측정
- String : 300,938,900ns
- StringBuilder : 130,211,000ns
- StringBuffer : 353,035,600ns
str1.equals(str2);
- str2를 Object 매개변수로 받은 후 str1과 비교 연산자(주소 값 비교) 수행
- str2가 String을 상속받고 있다면 str2를 String으로 형 변환 후 길이 비교, char 배열로 나누어서 비교연산자 수행
str1 == str2;
- str1 과 str2 의 주소 값을 비교하는 방식
- literal == object; : false || obj1 == obj2; : false
*thread-safe
- 하나의 함수를 여러 Thread가 호출하더라도 함수 실행이 바르게 진행되는 것
- 하나의 자원을 여러 쓰레드가 참조하게 되면 동시성 문제가 발생된다.
하나의 자원(클래스)를 여러 쓰레드가 참조했을 때 결과값이 다르게 나오는 이유
멀티 쓰레드에서의 동시성 문제
- 연산 로직이 동시에 이루어지면 쓰레드의 실행 순서가 불명확하므로 서로 다른 결과를 만들어낼 수 있다
- ex) A = 100 변수에 1을 더하는 쓰레드 T1, T2가 동시에 접근했을 때 T1이 100을 조회하고 101을 저장하기 전에 T2가 100을 조회해서 1을 더하면 마지막 값은 101이 남게 되는 오류가 발생된다.
'Back-End > Java & Spring' 카테고리의 다른 글
[JAVA] JVM 메모리 구조와 라이프 사이클 (0) | 2022.08.02 |
---|---|
[JAVA] Java Framework 종류 (0) | 2022.08.02 |
[JAVA] Collection Framework 정의/성능 비교 (0) | 2022.08.02 |
[JAVA] int / Integer 차이 (0) | 2022.08.02 |
[JAVA] DBMS Driver (0) | 2022.08.02 |