참조자료형 - 5. String 참조자료형

1. String 참조자료형

    ※ 참조자료형 데이터가 메모리에 저장되면, 해당 데이터의 첫 번째 주소를 참조하는 자료형

 

1) String 클래스

 - 문자열 저장 클래스 타입

 - 문자열은 쌍따옴표 (" ")안에 표기

 - 문자열 데이터는 String 이라는 클래스를 기반으로 만듦

    ※ 클래스(Class) : 참조자료형의 설계도. 그 안에는 참조자료형이 가진 속성이나 기능에 대한 정의가 쓰여있음
    ※ 객체(Object) : 클래스를 본 떠 만든 실제 대상
    ※ 클래스가 붕어빵 기계이면 객체는 붕어빵을 비유

// Example
String a = "apple"		// String : 클래스, apple : 객체

 

2) String 객체를 생성하는 2가지 방법

 - 방법 1. new 키워드를 사용한 객체 생성

// 기본 문법 구조
String 참조변수명 = new String("문자열");

// Example
String a = new String("안녕");

 

 - 방법 2. 참조변수에 바로 문자열 리터럴 입력

// 기본 문법 구조
String 참조변수명 = "문자열";

// Example
String a = "안녕";

 

3) 일반적인 참조자료형과는 다르게 String 클래스만이 가지고 있는 2가지 특징

특징 1 : 객체내의 값 변경 불가능 → 값 변경시, 새로운 객체를 생성하여 작성

// Example
String str1 = new String("안녕");
String str2 = str1;				// 이 과정으로 주소가 복사됨
str1 = "안녕하세요";
System.out.println(str1);			// 안녕하세요
System.out.println(str2);			// 안녕

// 문자열은 새로운 값을 대입하면, 변경이 되는 것이 아니라 주소를 바꿈


// Example 참조자료형 경우
int[] array1 = new int[] {3, 4 ,5};
int[] array2 = array1;
array1[0] = 6;
array1[1] = 7;
array1[2] = 8;
System.out.println(Arrays.toString(array1)); 	// [6, 7, 8]
System.out.println(Arrays.toString(array2)); 	// [6, 7, 8]

 

 - 특징 2 : 리터럴을 바로 입력한 데이터는 문자열이 같은  경우 하나의 객체를 공유

// Example1
String name = new String("abba");
String name2 = new String("abba");
String name3 = "abba";
String name4 = "abba";				// 이미 존재하는 "abba"를 함께 가리킴

// String은 클래스(설계도) 이름임
// new String()은 String에 설계되어 있는대로 데이터를 생성하겠다는 뜻

// Example2
String str1 = new String("안녕");
String str2 = "안녕";
String str3 = "안녕";
String str4 = new String("안녕");
// stack 메모리값 비교 (객체의 번지(위치))
System.out.println(str1 == str2)		// false
System.out.println(str2 == str3)		// true
System.out.println(str3 == str4)		// false
System.out.println(str4 == str1)		// false

 

4) String 객체의 '+' 연산 (Plus Operation)

 - CASE #1. 문자열 + 문자열 → 문자열을 연결

// Example
String str1 = "안녕" + "하세요" + "!";
System.out.println(str1);		// 안녕하세요!

String str2 = "반갑";
str2 += "습니다";
str2 += "!";
System.out.println(str2);		// 반갑습니다!

 

- CASE #2. 문자열 + 기본자료형 또는 기본자료형 + 문자열 → 기본자료형을 문자열로 변환 + 문자열 연결

// Example1
String str1 = "안녕" + 1;
String str2 = "안녕" + String.valueOf(1);		
// String.valueOf(기본자료형) → 기본자료형을 String으로 변환
String str3 = "안녕" + "1";
System.out.println(str1);		// 안녕1
System.out.println(str2);		// 안녕1
System.out.println(str3);		// 안녕1

// Example2
System.out.println(1 + "안녕");		// 1안녕
System.out.println(1+"안녕"+2);		// 1안녕2
System.out.println("안녕"+1+2);		// 안녕12 (안녕 + 1 을 한 뒤에 + 2를 하므로 안녕12)
System.out.println(1+2+"안녕");		// 3안녕 (1 + 2 를 한 뒤에 + 안녕을 하므로 3안녕)

 

5) String의 주요 메소드 (다 안 외워도 상관없음)

    ※ . : 객체가 가지고 있는 ex) sample.
    ※ 모든 메소드는 사용시 소괄호 '( )'를 사용
    ※ 속성은 객체가 가진 기능 (소괄호가 붙어야 함)

 

 - 문자열 길이 length()

// Example
String sample = "I hate Java!!";
System.out.println(sample.length());	// 13

 

문자열 내용비교 equals( ), equalsIgnoreCase( ) I : 대문자 i)

// Example
String str1 = new String("Java");
String str2 = new String("Java");		// 두 문자열은 내용은 같으나 주소가 다름

// 참조자료형은 등가 비교시. 주소를 비교함
System.out.println(str1 == str2);		// false

// 값을 비교하려면, 그 때는 equals 메소드를 사용
System.out.println(str1.equals(str2));		// true