-
[ch9 JAVA] String 클래스 생성자 & String, new String() 차이프로그래밍 언어/JAVA 2022. 8. 4. 12:25
char bar = new char [value]; return new String(bar);
위의 코드에서 new String()의 매개변수로 char를 넣으면 문자열 형태로 나오길래 String에 대해 더 공부해야겠다 싶었다.
앞에서 정리했던 건데도 불구하고 예제로 나오니 헷갈렸다,, ★
그리고 String str ="" 과 String str = new String()" 의 차이에 대해서도 궁금증이 생겨 이번 포스팅에서 알아볼까 한다.
https://wonisdaily.tistory.com/31
스트링 클래스에서 사용하는 주요 생성자와 메서드는 위의 포스팅에서 정리해놨으므로 궁금하신 분들은 클릭해보세요.
(indexOf, length, replace, charAt, contains ,,, )
String 클래스
String 클래스에는 문자열을 저장하기 위해서 문자형 배열 참조변수(char []) value를 인스턴스 변수로 정의해놓고 있다. 인스턴스 생성 시 생성자의 매개변수로 입력받은 문자열은 이 인스턴스변수(value)에 문자형 배열로 저장되는 것이다.
한번 생성된 String인스턴스가 갖고 있는 문자열을 읽어 올 수만 있고 변경할 수는 없다.
예를 들어 아래의 코드 같이 '+' 연산자를 이용해서 문자열을 결합하는 경우 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열 "ab"가 담긴 String 인스턴스가 생성되는 것이다.
String a ="a";
String b = "b";
a = a+b;원래는 a의 값이 있는 0x100을 참조했던 a는, a의 값이 변경되면서 0x100 주소에 있는 값이 변경되는 것이 아니라 새롭게 0x300을 참조하게 되는 것! 거기엔 ab라는 값이 저장되어 있다.
이처럼 덧셈연산자 '+'를 사용해서 문자열을 결합하는 것은 매 연산 시 마다 새로운 문자열을 가진 String 인스턴스가 생성되어 메모리 공간을 차지하게 되므로 가능한 결합횟수를 줄이는 것이 좋다.
문자열 간의 결합이나 추출 등 문자열을 다루는 작업이 많은 경우 String 클래스 대신 StringBuffer 클래스를 사용하는 것이 좋다. (다음 포스팅에서 StringBuffer 클래스 포스팅 할 예정)
String 과 new String()
문자열을 만들 때는 두 가지 방법, 문자열 리터럴을 저장하는 방법과 String 클래스의 생성자를 사용해서 만드는 방법이 있다.
String str1 = "abc";
String str2 = "abc";
Strring str3 = new String("abc");
String str4 = new String("abc");위의 코드에서 몇개의 객체가 생성이 될까?
의문을 가졌을 때 4개라고 대답했다면 String에 대해 다시 공부해야 되는 것!! 정답은 3개이다. 아래 자세히 설명하겠다.
String 클래스의 생성자를 이용한 경우 new 연산자에 의해 메모리할당이 이루어지기 때문에 항상 새로운 String 인스턴스가 생성된다. 그러나 문자열 리터럴은 이미 존재하는 것을 재사용하는 것이다. 아래 그림을 살펴보자.
두 가지 방식 모두 String 객체를 생성하는 것은 같지만, JVM이 관리하는 메모리 구조상에서 명백히 다르다. String은 특별한 참조 자료형이다.' new 생성자를 이용해서 인스턴스를 생성한 뒤, heap에서 메모리 관리가 이루어진다. 다른 참조형과 다를게 없지만 한 가지 다른 점은 바로 변하지 않는 변경 불가능한 (immutable) 클래스 인 것!! 아래 그림을 참고해보면 String으로 객체의 연산이 이루어지면 heap 영역 안에 있는 String Pool에 만들어진 문자열 값이 저장되는 것이다.
<예제 1번>
package ch9; public class Ex9_6 { public static void main(String[] args) { //String = "" String str1 = "abc"; String str2 = "abc"; System.out.println("String str1 = \"abc\";"); System.out.println("String str2 = \"abc\";"); System.out.println("str1==str2 ? " + (str1 == str2) ); System.out.println("str1.equals(str2)?" + str1.equals(str2)); System.out.println(); //new String("") String str3 = new String("abc"); String str4 = new String("abc"); System.out.println("String str3 = new String(\"abc\");"); System.out.println("String str4 = new String(\"abc\");"); //equals()를 사용하면 문자열 그 자체. 문자열 내용인 "abc"를 비교하기 때문에 true라는 결과를 얻지만 //String 인스턴스의 주소를 등가비교연산자 '=='로 비교했을 때 결과는 다르다. System.out.println("str3==str4 ? " + (str3 == str4) ); System.out.println("str3.equals(str4)?" + str3.equals(str4)); System.out.println(); } }
String(char [ ] value)
String에 인자로 char형의 배열을 넣는다면 주어진 문자열(value)를 갖는 String 인스턴스를 생성한다.
char [ ] c = {'H', 'e' , 'l' , 'l', 'o' };
String s = new String(c);
// s = "Hello"
<예제 2번>
package ch11; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class Ex11_18 { public static void main(String[] args) { String [] data = {"A","D","K","Z","D","A","K","K","A","K"}; HashMap map = new HashMap(); for(int i=0; i<data.length;i++) { if(map.containsKey(data[i])) { int value = (int)map.get(data[i]); map.put(data[i], value+1); }else { map.put(data[i], 1); } } Iterator it = map.entrySet().iterator(); while(it.hasNext()) { Map.Entry entry = (Map.Entry)it.next(); int count = (int)entry.getValue(); Ex11_18 ex = new Ex11_18(); System.out.println(entry.getKey() + " : "+ ex.printBar('#',count)+ " " + count); } } public String printBar(char ch, int count) { // String str = "#"; // for(int i=1; i<count; i++) { // str += String.valueOf(ch); // } // // return str; char [] bar = new char[count]; for(int i=0; i<bar.length;i++) bar[i] = ch; return new String(bar); } }
HashMap을 통해서 빈도수를 구하는 예제였는데 '#'이라는 문자를 출력하기 위해서 char [ ] 형태의 배열인 bar 객체를 생성해서 그 값을 new String의 매개변수로 넣었을 때 출력되는 값은 문자열!!
char 형태의 문자 배열을 new String(" ") 에 넣는다면! 문자열이 나온다. 이번 포스팅에서 궁금했던 점 해결
반응형'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[ch11 컬렉션 프레임웍] HashSet & HashMap의 메서드 및 사용법 (0) 2022.08.04 [ch9 JAVA] StringBuffer 클래스의 생성자와 메서드 알아보기 (0) 2022.08.04 [ch11 컬렉션 프레임웍] Arrays의 중요 메서드 (복사, 정렬, 비교..) (0) 2022.08.03 [ch11 컬렉션 프레임웍] Iterator & Enumeration 와 Map (0) 2022.08.03 [ch11 컬렉션 프레임웍] Stack과 Queue의 메서드 (add vs offer) (0) 2022.08.03