객체의 메모리 주소를 참조하는 타입이다.
배열, 열거, 클래스, 인터페이스 타입이 있다.
기본 타입
기본타입으로 선언된 변수는 값 자체를 저장한다.
스택에 값 자체를 저장한다.
참조 타입
참조 타입으로 선언된 변수는 객체가 생성된 메모리 주소를 저장한다.
스택에 객체가 생성된 메모리 주소를 저장한다.
해당 메모리 주소를 참조하여 힙에 저장된 객체에 접근한다.
메소드, 힙, 스택 영역
JVM은 운영체제에서 할당받은 메모리 영역을 메소드 영역, 힙 영역, 스택 영역으로 구분해서 사용
메소드 영역
힙 영역
스택 영역
public static void main(String[] args) {
int[] arr1; //배열 변수 arr1 선언
int[] arr2; //배열 변수 arr2 선언
int[] arr3; //배열 변수 arr3 선언
arr1 = new int[] { 1, 2, 3 }; //배열 { 1, 2, 3 }을 생성하고 arr1 변수에 대입
arr2 = new int[] { 1, 2, 3 }; //배열 { 1, 2, 3 }을 생성하고 arr2 변수에 대입
arr3 = arr2; //배열 변수 arr2의 값을 배열 변수 arr3에 대입
System.out.println(arr1 == arr2); // arr1과 arr2 변수가 같은 배열을 참조하는지 검사
System.out.println(arr2 == arr3); // arr2와 arr3 변수가 같은 배열을 참조하는지 검사
}
결과
false
true
arr1
과 arr2
는 각각 선언 되었기에 서로 다른 객체의 메모리 주소를 참조한다.
arr3
에 arr2
를 대입했기 때문에 arr3
는 arr2
의 메모리 주소를 참조하고 있다. 따라서 arr2
와 arr3
는 true
가 나온다.
문자열은 Stirng 객체로 생성
String은 메모리 주소값을 참조하는 참조형 변수이다.
String 값을 비교하려면 equals로 비교해야한다.
String name1 = "홍길동"
String name2 = "홍길동"
String name3 = new String("홍길동");
name1 == name2
name1 == name3
결과
true
false
String
은 서로 같은 값을 가지고 있으면 같은 참조로 본다.
하지만 String name3
는 new String("홍길동");
으로 값은 같지만 새로 선언했기에 다른 참조를 가지고 있다.
그럼 참조가 아닌 값을 비교하려면 어떻게 해야할까?
name1.equals(name3);
로 값 자체가 같은지 비교하면 된다.
public static void main(String[] args) {
String strVar1 = "홍길동";
String strVar2 = "홍길동";
if(strVar1 == strVar2) {
System.out.println("strVar1과 strVar2는 참조가 같음");
} else {
System.out.println("strVar1과 strVar2는 참조가 다름");
}
if(strVar1.equals(strVar2)) {
System.out.println("strVar1과 strVar2는 문자열이 같음");
}
String strVar3 = new String("홍길동");
String strVar4 = new String("홍길동");
if(strVar3 == strVar4) {
System.out.println("strVar3과 strVar4는 참조가 같음");
} else {
System.out.println("strVar3과 strVar4는 참조가 다름");
}
if(strVar3.equals(strVar4)) {
System.out.println("strVar3과 strVar4는 문자열이 같음");
}
}
결과
strVar1과 strVar2는 참조가 같음
strVar1과 strVar2는 문자열이 같음
strVar3과 strVar4는 참조가 다름
strVar3과 strVar4는 문자열이 같음
문자열 추출
String subject = "자바 프로그래밍";
char charValue = subject.charAt(3);
System.out.print(charValue);
결과
프
charAt은 문자열의 앞에서부터 위치를 매겨 특정 위치의 문자를 추출할 수 있다.
0부터 시작한다.
자 | 바 | 프 | 로 | 그 | 래 | 밍 | |
---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
문자열 길이
문자열에서 문자의 개수를 얻고 싶다면 length()
메소드를 사용한다.
공백도 포함해서 계산된다.
문자열 대체
replace()
메소드는 기존 무자열은 그대로 두고, 대체한 새로운 문자열을 리턴한다.
String oldStr = "자바 프로그래밍";
String newStr = oldStr.replace("자바", "JAVA");
System.out.print(newStr);
결과
JAVA 프로그래밍
문자열 잘라내기
문자열에서 특정 위치의 문자열을 잘라내어 가져오고 싶다면 substring(시작 위치, 종료 위치)
메소드를 사용한다.
종료 위치의 -1까지 잘라낸다.
종료 위치를 작성하지 않으면 시작 위치부터 문자열의 끝까지 잘라낸다.
String ssn = "880815-1234567";
String firstNum = ssn.substring(0, 6);
String secondNum = ssn.substring(7);
System.out.println(firstNum);
System.out.print(secondNum);
결과
880815
1234567
8 | 8 | 0 | 8 | 1 | 5 | - | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
문자열 찾기
문자열에서 특정 문자열의 위치를 찾고자 할 때는 indexOf() 사용한다.
String subject = "자바 프로그래밍";
int index = subject.indexOf("프로그래밍");
// 포함되어 있지 않으면 -1을 리턴한다.
포함 여부 결과만 알고 싶은 경우 constains()
메소드를 사용한다.
boolean result = subject.contains("프로그래밍");
문자열 분리
구분자가 있는 여러 개의 문자열을 분리할 때 split()
메소드를 사용한다.
String board = "번호,제목,내용,글쓴이";
String[] arr = board.split(",");
배열의 선언 방법
자료형 배열명 = new 자료형[배열의 크기]; // 동적 초기화
자료형[] 배열명 = {값1, 값2, 값3, ...}; // 정적 초기화
배열의 길이
배열의 길이는 문자열과 비슷하게 length
로 확인한다.
문자열과는 ()의 유무의 차이가 있다
문자열: length();
배열: length;