본문 바로가기
카테고리 없음

변수3 (참조자료형)

by 낭만 코딩 2024. 7. 25.

1. 참조자료형이란

2. 문자열

3. 참조자료형의 특징

 

1. 참조자료형이란

참조자료형(Reference Type)은 기본자료형과 다르게 값을 직접 저장하는 것이 아니라 메모리에 저장된 위치정보를 저장하고 있는 자료형입니다.. 우리는 관련자료를 참고하거나, 시장조사 등을 할 때 레퍼런스 한다는 표현을 자주 쓰는데, 이 레퍼런스가 참조한다는 뜻을 가지고 있습니다.

배열, 클래스, 인터페이스가 참조자료형에 속하는데, 앞에서 배웠던 기본자료형 외 모든 자료형들이 참조자료형에 속합니다. 클래스나 인터페이스는 개발자가 직접 만들수 있는 자료형이라서 사용자 정의 자료형이라고도 부르는데요. 참조자료형은 뒤에서 자세히 배울 것이니, 이번 장에서는 참조자료형 중 문자열이라는 자료형에 대해 먼저 살펴보도록 하겠습니다.

 

2. 문자열

문자열은 앞에서 실습해봤던 Hello를 출력하는 프로그램을 작성해봤었는데, 이때 “Hello” 가 문자열입니다. ‘이라는 표현을 쓰는데, 열이라는 의미는 줄서다, 나열하다 라는 뜻으로 문자열은 문자들이 나열되어 있는 구조가 됩니다. ‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘ ’, ‘J’, ‘a’, ‘v’, ‘a’ 이렇게 각각의 문자들이 한 줄로 연결되어 있는 것이다. char 자료형은 앞에서 정수 자료형으로 분류하긴 했지만 문자 한 자였었죠? 그 char 자료형의 한 문자가 모인것이 문자'열' 입니다.

문자열의 사용법은 기본자료형과 유사한데, String 이라는 타입을 사용하며, 첫 자는 대문자입니다. 아래 코드 예제를 살펴보겠습니다.

String name;        // 변수 선언 
name = "홍길동";    // 변수 초기화 

String name2 = "홍길동"; // 선언과 동시에 초기화 
String name3 = null ;    // null값으로 선언 
String name4 = "" ;      // 빈문자열값으로 선언

 

위 예제는 String 타입의 name 이라는 변수를 선언하고 초기화했고, name2 변수는 선언과 동시에 초기화한 것입니다. name3이라는 변수는 null 이라는 값으로 선언되었는데, null 이라는 값은 참조하고 있는 데이터가 없다라는 의미입니다. name4는 ""로만 값이 지정되어 있는데, 값이 없는 것이 아니라 빈값(빈문자열)이 저장된 것이다. 다시 말해 null은 값이 없는 것이고, ""은 빈 문자열이 저장됐다는 뜻이다. 아래 예제를 실행해서 실행 결과를 확인해 보자.

 

public class StringSample {

	public static void main(String arg[]) {
		
		String name; // 변수 선언
		name = "홍길동"; // 변수 초기화
		
		String name2 = "홍길동"; // 선언과 동시에 초기화
		String name3 = null;   // null값으로 초기화
		String name4 = "";     // 빈문자열값으로 초기화

		System.out.println("name2="+name2);
		System.out.println("name3="+name3);
		System.out.println("name4="+name4);
	}

}

 

실행결과

name2=홍길동
name3=null
name4=

 

실행결과를 보면 문자열을 바로 출력하지 않고 숫자 연산 처럼 더하기 연산을 하고 있습니다. 문자열에서 + 연산은 숫자를 더하는 연산은 아니고 문자열과 문자열을 연결 결합하는 연산을 하게됩니다. 예를 들면 "A" 와 "B"를 더하면 "AB"가 되는 것입니다. 그래서 "name2="+name2는 "name2="+"홍길동"이 된것이고, 최종적으로 출력되는 결과값은 "name2=홍길동" 이 된것입니다.

name3 변수에는 null 이 출력되었는데 이 null이라는 값은 자바에서 값 자체가 존재하지 않는 형태를 의미합니다. 참조자료형에서만 가능합니다. 그리고 마지막 name4는 아무것도 출력되지 않은것처럼 보이지만, 사실은 빈문자열 값이 출력된 것입니다.

name4 = "";

 

이 코드는 값이 없는 것이 아니라, 빈 문자열값이 있는 것입니다. 빈 문자열도 값이 있긴 있는 것이죠. null 하고 혼동하시면 안됩니다.

 

그리고 항상 문자열을 만들 때는 반드시 쌍따옴표를 사용하여 앞,뒤로 감싸줘야 합니다. 반대로 얘기하면, 어떤 값도 쌍따옴표로 감싸면 문자열이 되게 됩니다. 아래 예제를 살펴보겠습니다.

String a = "1";
String b = "1.5";
String c = "true";

 

변수 a, b, c 모두 타입이 String 타입이죠? 모두 문자열입니다. 변수에 대입되는 값이 1 이어도, 1.5 이어도 쌍따옴표(")로 감싸져 있으면 그 어떤것도 문자열이 됩니다. 꼭 명심하세요.

 

3. 참조자료형의 특징

참조자료형은 뒤에서 배울 배열이나 객체에서 좀 더 자세히 다뤄야합니다만, 이번 시간에는 문자열에 대해서만 배웠으니 문자열을 사용해서 간단하게 참조자료형의 특징에 대해 살펴보도록 하겠습니다.

 

먼저 참조자료형은 기본자료형과 다르게 값을 직접 저장하는 형태가 아니라, 값이 저장된 메모리 위치(주소)값을 저장하게 됩니다. 그래서 변수를 비교할때 값을 비교하는것이 아니라, 메모리의 주소값이 같은지를 비교하게 됩니다. 예를 들어 보도록 하겠습니다.

public class RefSample {

	public static void main(String[] args) {
		
		// 기본자료형 비교
		int a = 1;
		int b = 1;
		System.out.println(a == b);
		
	}

}

 

기본자료형 정수 타입의 변수 a와 b를 ==로 같은지 비교했습니다. 이 == 연산은 같은 값인지를 비교하는 연산자입니다.

이 코드를 실행해보면 true가 출력됩니다. 즉 a 와 b 변수의 값이 같다는 말입니다. 이번엔 문자열로 비교해볼까요?

public class RefSample {

	public static void main(String[] args) {
		
		// 기본자료형 비교
		int a = 1;
		int b = 1;
		System.out.println(a == b);
		
		String c = "홍길동";
		String d = "홍길동";
		System.out.println(c == d);
		
	}

}

 

c 와 d 변수 모두 홍길동이라는 값이 저장되었고 비교연산 결과 역시 true가 출력되고 있습니다. 그럼 문자열은 참조자료형이라고 했고, c에는 홍길동이라는 값이 저장되어 있는 메모리의 주소값이 저장되어 있겠죠? 맞습니다. c와 d 모두 같은 주소값을 가지므로 true가 출력된것입니다. 그럼 조금 다른 예제로 살펴보겠습니다.

public class RefSample {

	public static void main(String[] args) {
		
		// 기본자료형 비교
		int a = 1;
		int b = 1;
		System.out.println(a == b);
		
		String c = "홍길동";
		String d = "홍길동";
		System.out.println(c == d);
		
		String e = new String("홍길동");
		System.out.println(e);
		System.out.println(d == e);
		
	}

}

 

이번엔 e라는 변수에 new String("홍길동"); 이라는 코드가 들어가 있습니다. 이 코드는 문자열 객체를 생성해주는 코드로 뒤에 클래스와 객체에서 다시 나오니 우선은 그냥 넘어가시고, 바로 밑에 e를 출력했습니다. 홍길동이 출력되었죠? 변수 c, d, e 모두 홍길동 이라는 문자열이 저장된것인데요. d == e 의 출력결과가 false가 출력됩니다. 즉, 같은 홍길동이지만 저장된 메모리의 위치가 다르다는 이야기입니다.

조금 더 쉽게 말씀드리면 서울의 홍길동과 부산의 홍길동은 이름은 같지만 다른 곳에 살고 있는 다른 사람이죠? 마찬가지로 c와 d는 같은 홍길동을 가르키지만, e는 다른 홍길동을 가르킨다고 생각하시면 됩니다. 

이게 바로 참조자료형의 특징입니다.

 

조금 어렵게 느끼셨더라도, 지금은 괜찮으니 넘어가시고, 뒤에서 배열, 클래스 배울 때 다시 여러번 나오게 될테니 걱정마세요.