본문 바로가기
IT Programming/Java

[Java] 07. 자바 String / new String ?

by Euniieunii 2023. 3. 14.
자바의 String: 자바 프로그래밍 언어에서 문자열을 다루기 위한 타입. 
원시 타입(기본 타입)이라고 생각 할 수 있지만 int와 char와 달리 참조형 객체 타입이다.

- 문자열이란, 일련의 문자들의 집합으로, 쉽게 말해 단어나 문장 등으로 이루어져 있고, JAVA에서는 문자열을 String 클래스로 다루며, 이를 사용해 문자열을 생성하고 다양한 연산을 수행할 수 있다.

- String은 불변 객체이다. 한번 생성하면 그 값은 절대 바뀌지 않아 수정은 불가능하고 읽기만 가능하다.

- 자바에서는 String 문자열 끼리의 + 연산으로 문자열을 합칠 수가 있고 선언한 변수 안에서 연산이 이루어지는 것 같지만 사실은 새롭게 객체를 생성 하는 것이다.

- String 클래스는 java.lang 패키지에 포함되어 제공된다.

 

예를 들어,

String a = "abc";

String 타입 변수 a= "abc"에 +연산으로

String a += "def";

+"def"가 이루어졌다면, 이미 존재하는 a에 def가 붙어 a = abcdef 가 되는 것이 아니라

각각 새롭게 객체를 생성하는 구조를 가지고 있다는 것.

 


String 객체를 생성하는 방법은 리터럴로 생성하거나 new 연산자를 사용하는 2가지 방법이 있다.

 

01) 리터럴로 생성하기

리터럴 Literal : 변하지 않는 고정적인 값
String coffee = "coffee";

02) new 연산자 사용하기

new 연산자는 클래스 타입의 객체(인스턴스)를 생성시켜주는 역할을 담당한다
new 연산자를 통해 메모리(Heap 영역)에 데이터를 저장할 공간을 할당
                                                 ↓
                                       객체에게 반환
                                                 ↓
                                         생성자 호출

리터럴과는 달리 new 연산자로 생성된 객체는 똑같은 값을 가진 객체가 있어도 서로 다른 메모리를 할당하기 때문에 서로 다른 객체로 분류된다. Heap 영역에 각각의 데이터로 저장되기 때문이다.

따라서 자바에서는 스텍 메모리에 참조변수를 선언하고 이 변수를 힙 Heap메모리에 생성된 인스턴스(객체)의 참조 정보를 저장해서 접근하는 방식을 이용한다. 즉 이것은 "참조변수에는 할당된 메모리의 위치 정보가 저장된 것" 이다.

 

02 - 1) new 키워드를 사용하여 클래스 객체 만들기

1. 클래스의 이름을 선언하고 참조변수를 선언한다.                      
2. " = " 대입연산자를 통해 new 키워드를 선언한다.               
3. new 키워드를 선언하고 클래스이름을 붙여 만든다.
클래스명 참조변수명 = new 클래스이름();
String coffee = new String("coffee");

 


03) String 생성시 리터럴과 new의 차이점?

위의 "coffee" 예시를 보면 리터럴과 new로 각각 생성 하고 출력했을 때 값은 두가지 모두 동일하게 나온다.

하지만

리터럴은 자바 가상머신이 관리하는 "string costant pool" 에 저장이 되고

new 는 "heap" 영역에 저장이 된다.

 

 

( ++ 추가 예제)

//문자열 비교 심화
s1 = "1234"; //ex 벽에 붙은 화장실 비밀번호 정보 (참조)
s2 = "1234";
System.out.println(s1.equals(s2)); //true 내용을 비교하는 것
System.out.println(s1 == s2); //true 참조를 비교하는 것

s1 = new String("1234");
s2 = new String("1234");
//서로 다른 곳에 데이터가 존재하게 됨. 참조가 달라진다는 것.
//내용은 똑같아서 첫 문장은 true지만 각각 다른데이터로 생각하기 때문에 == 을 통하면 false라고 나옴.
System.out.println(s1.equals(s2)); // true
System.out.println(s1 == s2); //false

04) String 주요 메서드

<string의 주요 메소드>

추가적으로,

String 클래스안에 있는 equals라는 메서드를 사용하면 두 비교대상의 주소 값이 아닌 데이터값을 비교하기 때문에 어떻게 String을 생성하느냐에 따라 결과가 달라지지 않고 정확한 비교를 할 수 있다.

댓글