일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- frontend
- 자바문제풀이
- node
- 그럼에도 불구하고
- JS
- 코딩테스트
- TypeScript
- 자바
- redux
- java
- 반응형 페이지
- 코드업
- media query
- cleancode
- Servlet
- max-width
- HTML
- webpack
- 프론트엔드
- 그럼에도불구하고
- git
- 변수
- react-router-dom
- node.js
- @media
- coding
- github
- react
- CSS
- JavaScript
- Today
- Total
그럼에도 불구하고
String Class 본문
자바에서 가장 대표적인 클래스인 String 클래스를 얘기해보려고 한다.
String 클래스는 두 가지의 특징을 가지고 있다.
1. 객체 생성법이 두 가지이다. (암시적, 명시적)
2. 한번 생성된 문자열의 내용은 변하지 않는다. (불변의 법칙)
//String 클래스 만이 new 없이 heap에서 메모리를 할당받을 수 있다.
String s1 = "abc";
String s2 = "abc";
// "abc" 라는 값을 s1과 s2가 주소를 공유하는 것 (암시적 방법)
여기서 s1과 s2를 boolean a = (s1 == s2);라고 묻는다면
결과는 True가 나온다.
"abc"라는 값을 s1과 s2가 주소를 공유하기 때문이다.
"=="는 클래스간의 비교 시 값이 아닌 주소 값을 비교한다.
String s3 = new String("abc");
String s4 = new String("abc");
// 명시적 방법
s3과 s4의 경우 s1, s2와 다르게 new라는 키워드를 사용했다.
new라는 키워드가 사용되면 heap 영역에 같은 집이 있더라도 자기 자신만의 집을 새로 만드는 것이다.
그래서 boolean a = (s3 == s4);의 결과는
False이다.
//ver_1
String greet = "안녕"; // 암시적 생성
greet += "하세요";
System.out.printLn(greet);
//ver_2
String greet2 = new String("안녕"); //명시적 생성
greet2 += "하세요";
System.out.println(greet2);
ver_1에서의 System.out.println(greet); 의 결과는
"안녕하세요"가 나온다.
하지만, 안녕하세요가 나오는 것은 "안녕"이라는 값에 하세요가 추가된 것이 아니다. (불변의 법칙)
새로운 안녕하세요 라는 공간을 갖고 있는 주소 값이 새로 추가되고
greet의 주소 값이 "안녕"이 담긴 공간에서
"안녕하세요"의 공간으로 옮겨진 것이다.
즉, "안녕"이라는 빈집이 생겨 메모리 낭비가 된다. (Grabage Collector)
왜 "안녕"이라는 값이 "안녕하세요"라고 바뀌면 안 되는 걸까?
ver_2
greet2에 "안녕" 이라고 명시적으로 지정되어 있을 때 "안녕"의 값이 "안녕하세요"라고 바뀐다면
greet2 까지 값이 "안녕하세요" 로 바뀌기 때문이다.
즉, heap 영역에 기존에 저장되어 있던 "안녕"의 값을 "안녕하세요"라고 바꾸는 것이다.
System.out.println(greet2);의 결과도 마찬가지로 "안녕하세요"가 나온다.
'Java, Servlet > Java basics' 카테고리의 다른 글
String 클래스의 여러가지 메서드 (0) | 2022.10.25 |
---|---|
삼항연산자란 무엇인가? (0) | 2022.09.21 |
형변환이란 무엇인가? (2) | 2022.09.21 |
데이터 타입이란? (1) | 2022.09.17 |
변수란 무엇인가 (1) | 2022.09.17 |