[Java] 참조타입/ String / 배열
참조타입
참조타입이란 기본타입과 다르게 객체의 번지(주소)를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스가 있다.
- 배열, 클래스, 인터페이스 등
- 동등비교 (== , !=)를 하는 경우에는 메모리 주소값으로 비교한다. (저장된 값으로 비교하는게 아님!)
- null(참조하는 주소가 없는 경우)이 가능하다.
그렇다면 참고자료형인 객체를 비교하는 예시를 알아보자.
RefType rt = new RefType();
RefType rt2 = new RefType();
System.out.println(rt == rt2); // 결과값: false
RefType rt3 = rt2;
System.out.println(rt3 == rt2); // 결과값: true
System.out.println(rt == rt2): rt와 rt2의 타입은 RefType로 같다. 하지만 다른 객체이기 때문에 false이다. 객체는 모두 참고자료형이기 때문이다.
System.out.println(rt3 == rt2): 같은 번지이기 때문에 두 변수는 heap영역에 같은 위치를 가리키는 참조하는 상태가 된다. 따라서 비교시 true 출력된다.
String은 Java에서 다른 클래스와 약간 다르기 때문에 아래와 가팅 적용된다.
public class StringEx3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = new String();
String b =a;
System.out.println(a == b); // 출력값: true
a = "안녕"; // String만 예외를 줘서 가능하게 만듬, 메모리의 새로운 저장소에 새롭게 저장시킴
System.out.println(a == b); // 출력값: false
System.out.println(a); // 출력값: 안녕
System.out.println(b); // 출력값:
System.out.println("-------------------------");
Str a2 = new Str();
Str b2 = a2;
System.out.println(a2 == b2); // 출력값: true
a2.name = "안녕";
System.out.println(a2 == b2); // 출력값: true
System.out.println(b2.name); // 출력값: 안녕
}
}
class Str {
String name;
}
String
- 동등비교 시 반드시 equals() 메서드 사용하기
- 불변(immutable) -> 만약 바꾸고 싶다면 문자열이 바뀌는게 아니라 새로운 메모리 공간을 차지하는 문자열이 새로 생기는 것이다. (느려짐)
- 기능(메서드) : split, replace, indexOf, substring, valueOf(다른 타입을 String으로 바꿔주는 것) 등
String text = "안녕하세요, 저는 홍길동입니다.";
String text2 = text.replace(",", "");
String text3 = text2.replace(" ", "");
System.out.println(text3);
// 메서드 체이닝
String text4 = text.replace(",", "").replace(" ", ""); // text.replace(",", "")가 새로운 문자열을 리턴하고 그 리턴한 값에 replace를 진행하는 것
배열
- 하나의 타입만 가능
- 길이가 정해지면 변경 불가
- 인덱스(순번), 0부터 시작
- for문과 같이 사용: for(int i=0; i<배열변수.length; i++)
double[] arr2 = new double[4];
for (int i=0; i<arr.length; i++) {
arr2[i] = arr[i];
}
for(int i=0; i<arr2.length; i++) {
System.out.println(arr2[i]);
}
// 출력값
//1.2
//1.5
//1.0
//0.0
참조타입 이미지 출처