안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
String 에 대해서 알아보기 전, 참조형에 대해서 간략하게 설명해보려고 합니다.
아래와 같이 stack 메모리 내에 실제 값이 아닌 데이터가 저장 되어 있는 공간의 주소값을 참조하여 갖고 있습니다.
참조형 변수는 기본 자료형 8가지를 제외한 모든 것입니다.
그렇다면 지금까지 클래스의 객체를 생성하였을 때도 동일하게 참조형을 사용하고 있었던 것인데요,
StringStudy 클래스를 만들어 객체를 생성해보았습니다.
public static void main(String[] args) {
//StringStudy study = new StringStudy();
StringStudy study;
study = new StringStudy();
}
변수 선언과 대입을 분리해보면 더 명확하게 알 수 있는데요,
type자료형은 StringStudy 클래스 // 변수명은 study // study는 StringStudy의 객체 위치값을 갖고 있다는 것을 알 수 있었습니다.
지금까지 계속 사용해왔던 객체 생성 시의 변수들은 모두 참조형이라는 것을 알 수 있게 되었습니다.
String 클래스의 객체 생성 방법
① new 키워드를 사용
public void test1() {
//String 참조형
String str = new String("안녕");
System.out.println(str);
}
@콘솔출력값
안녕
이전 객체 생성할 때와 동일하지만, 생성자의 입력매개변수로 저장할 문자열을 입력해주었습니다.
② 문자열 리터럴 (Literal)
public void test1() {
String str1 = "안녕하세요";
System.out.println(str1);
}
@콘솔출력값
안녕하세요
원래 참조형은 객체 레시피 (①번 방법) 처럼 써야하지만..
String 클래스를 너~무 많이 사용하다 보니, 참조형인데도 불구하고 기본형처럼 쓰게끔 유일하게 허락을 했습니다.
방식에 차이가 있지만 메모리 상의 저장 위치는 동일합니다.
String 클래스의 특징
① 객체 안의 값을 변경하면 새로운 객체 생성
String str2 = new String("하이");
String str3 = str2;
str2 = "헬로";
System.out.println(str2);
System.out.println(str3);
@콘솔출력값
헬로
하이
☞ 한 번 정의된 문자열은 변경할 수 없습니다.
위 코드를 보면 str2에는 "하이"라는 객체를 가르키는 위칫값이 저장될 것입니다. (예 : 100번지)
str3에 str2의 값을 복사하였는데, 스택메모리의 값이 복사되므로 str2의 객체("하이")가 아닌 위칫값(100번지)가 복사 될 것입니다.
그렇다면 str2와 str3은 동일한 위칫값(100번지)를 가르키게 되겠죠.
str2의 값을 "헬로"로 변경하여 str2와 str3를 출력해보니, 분명 동일한 위칫값을 갖고 있었는데 값이 "헬로", "하이"로 리턴 되었습니다.
즉, 기존의 문자열을 수정하는 것이 아닌 "헬로"라는 문자열을 포함하고 있는 새로운 String 클래스 객체를 생성하고, 그 위치를 str2에 저장한다는 것입니다.
② 리터럴을 바로 입력한 데이터는 문자열이 같을 때 하나의 객체를 공유
public void test1() {
String str1 = new String("안녕");
String str2 = "안녕";
String str3 = "안녕";
String str4 = new String("안녕");
//stack 메모리 값 (위칫값) 비교
System.out.println(str1 == str2);
System.out.println(str2 == str3);
System.out.println(str3 == str4);
System.out.println(str1 == str4);
}
@콘솔출력값
false
true
false
false
☞ 문자열 리터럴로 String 객체를 생성하면 하나의 문자열을 여러 개 공유할 수 있습니다. → 메모리 효율성 증가
new로 생성할 때 : 동일한 문자열 객체가 힙 메모리에 있든 없든, 무조건 새롭게 객체 생성
문자열 리터럴로 생성할 때 : 힙 메모리에 리터럴로 생성된 동일 문자열이 있으면 객체 공유
stack 메모리(위칫값)을 비교해보았을 때 리턴 값들을 보면 위 특징에 대해서 쉽게 확인 할 수 있을 것 입니다.
String 객체의 '+' 연산
① 문자열 + 문자열 연산
public void test1() {
String str1 = "기차";
str1 = str1 + "칙칙";
str1 = str1 + "폭폭";
System.out.println(str1);
}
@콘솔출력값
기차칙칙폭폭
문자열의 '+' 연산은 연결 연산입니다.
② 문자열 + 기본 자료형 / 기본자료형 + 문자열
public void test1() {
String str1 = "기차";
str1 = str1 + "칙칙";
str1 = str1 + "폭폭";
str1 = str1 + 123;
str1 = str1 + 45;
System.out.println(str1);
System.out.println("abc" + ('d' + 1)); //abc101
System.out.println("abc" + 'd' + 1); //abcd1
System.out.println('a' + 1 + "bcd"); //65bcd
}
@콘솔출력값
기차칙칙폭폭12345
abc101
abcd1
98bcd
기본 자료형이 먼저 문자열로 변환(형변환 개념 X)되고, 문자열 + 문자열 형태로 리턴 됩니다.
문자열이 왕 (KING) !!
Do it! 자바 완전 정복을 참고하여 포스팅하였습니다.
'Java > Java' 카테고리의 다른 글
연산자(Operator)란?, 이항연산자, 삼항연산자, 대입연산자 (0) | 2022.03.02 |
---|---|
Scanner 클래스란?, next()메소드, nextLine()메소드 (0) | 2022.03.01 |
형변환(Type Casting)이란?, 암묵적 형변환, 명시적 형변환, ASCII CODE (0) | 2022.02.28 |
데이터 오버플로우 (Data Overflow)란? (0) | 2022.02.25 |
상수 (Constant Variable)란? (0) | 2022.02.25 |