참조타입
참조형 타입은 기본형 타입을 제외한 모든 타입이다.
배열도 참조형이고, 클래스도 모두 참조 타입이다.
대표적인 참조형 변수 String
String str = new String("hello");
- str 변수 앞에 기본형 타입이 아닌 String 클래스가 적혀있다.
- 등호(=) 뒤에는 new 다음에 생성자라는 것이 있다.
- new 라는 키워드는 객체를 메모리에 올려준다. 이렇게 메모리에 올라간 객체를 인스턴스라고 말한다.
- 메모리에 올라간 인스턴스를 가리키는 변수, 참조하는 변수, 레퍼런스하는 변수가 str이다.
- str이라는 변수에는 메모리의 위치 값이 저장되는 것이다. 메모리의 위치값이 저장된다고 하더라도, 어떤 메모리에 저장되는지 그 정보를 알 수 있는 방법은 없다.
-> str 변수는 String 인스턴스를 참조한다라고만 알면 된다.
- 앞으로 배울 클래스들은 모두 참조형이다.
String 클래스
문자열을 표현, 자바에서 가장 많이 사용하는 클래스이다.
String 인스턴스 생성 방법
- new 연산자를 이용하지 않고, 인스턴스를 만드는 경우
String str1 = "hello";
String str2 = "hello";
- "hello"라는 문자열이 메모리 중에서 상수가 저장되는 영역에 저장된다. 상수는 변하지 않는 값을 의미한다.
- String 클래스는 다른 클래스와 다르게 연산자 new를 사용하지 않고도 참조 가능하다. new를 사용하지 않고 참조하면 메모리를 아낄 수 있다.
- String str2 = "hello"; 이 문장이 실행될 때에 hello 라는 문자열 상수는 이미 만들어져 있으므로 str1이 참조하는 인스턴스를 str2도 참조한다.
- new 연산자를 이용해서 인스턴스를 만드는 경우
String str3 = new String("hello");
String str4 = new String("hello");
- new 연산자를 이용해서 인스턴스를 생성하면 인스턴스는 위의 1번과 다르게 무조건 새로 만들어진다.
- 따라서 str3과 str4는 서로 다른 인스턴스를 참조한다.
if(str1 == str2){
System.out.println("str1과 str2는 같은 참조입니다.");
}
if(str1 == str3){
System.out.println("str1과 str3는 같은 참조입니다.");
}
if(str3 == str4){
System.out.println("str3과 str4는 같은 참조입니다.");
}
- 참조변수끼리 ==로 비교하면 서로 같은 것을 참조하는지 비교한다.
- 따라서 결과는 "str1과 str2는 같은 참조입니다."가 출력된다.
String 클래스 특징
- String은 불변 클래스이다. String이 인스턴스가 될 때 가지고 있던 값을 나중에 수정할 수 없다.
- String은 문자열과 관련된 다양한 메소드를 가지고 있다. 메소드를 호출한다고 하더라도 String 내부의 값은 변하지 않는다.
코테 풀면서 String 관련 메소드를 더 많이 알아두면 더 편리해질 것 같다,, String 관련 메소드들도 따로 더 공부해놔야겠다.
- String이 가지고 있는 메소드 중 String을 반환하는 메소드는 모두 새로운 String을 생성해서 반환한다.
String str5 = "hello world";
String str6 = str5.substring(3);
- 출력 결과를 통해 substring 메소드를 사용해도 본래 값 str5는 변하지 않는다.
- str6은 str5가 가지고 있는 문자열 중 3번째 위치부터 자른 결과, 즉 새로운 String을 참조하게 된다.