[Java] 참조 타입

Juni_woo·2025년 4월 17일
0

Java

목록 보기
7/8
post-thumbnail

참조형 타입에 대해

객체의 메모리 주소를 참조하는 타입이다.
배열, 열거, 클래스, 인터페이스 타입이 있다.



기본 타입과 참조 타입의 차이

기본 타입
기본타입으로 선언된 변수는 값 자체를 저장한다.
스택에 값 자체를 저장한다.

참조 타입
참조 타입으로 선언된 변수는 객체가 생성된 메모리 주소를 저장한다.
스택에 객체가 생성된 메모리 주소를 저장한다.
해당 메모리 주소를 참조하여 힙에 저장된 객체에 접근한다.



메모리 사용 영역

메소드, 힙, 스택 영역

  • 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

arr1arr2는 각각 선언 되었기에 서로 다른 객체의 메모리 주소를 참조한다.
arr3arr2를 대입했기 때문에 arr3arr2의 메모리 주소를 참조하고 있다. 따라서 arr2arr3true가 나온다.



문자열 타입

문자열은 Stirng 객체로 생성
String은 메모리 주소값을 참조하는 참조형 변수이다.

String 값을 비교하려면 equals로 비교해야한다.

String name1 = "홍길동"
String name2 = "홍길동"
String name3 = new String("홍길동");

name1 == name2
name1 == name3

결과

true
false

String은 서로 같은 값을 가지고 있으면 같은 참조로 본다.

하지만 String name3new 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는 문자열이 같음

문자열 추출

  • charAt() 메소드로 문자열에서 매개값으로 주어진 인덱스의 문자를 추출한다.
String subject = "자바 프로그래밍";

char charValue = subject.charAt(3);

System.out.print(charValue);

결과

charAt은 문자열의 앞에서부터 위치를 매겨 특정 위치의 문자를 추출할 수 있다.
0부터 시작한다.

01234567

문자열 길이
문자열에서 문자의 개수를 얻고 싶다면 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
880815-1234567
012345678910111213

문자열 찾기
문자열에서 특정 문자열의 위치를 찾고자 할 때는 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;

profile
개발 공부!

0개의 댓글