주인장의 프로그래밍 개발 공부방

[Chapter 1 변수] 8. 참조형 변수(Reference Variable) 선언 방법 본문

프로그래밍 기본 지식/Chapter 1 변수

[Chapter 1 변수] 8. 참조형 변수(Reference Variable) 선언 방법

거신 2019. 5. 12. 19:51

이제 참조형 변수(Reference Variable)가 무엇인지와

기본형 변수와 어떤 차이가 있는지에 대해서 알고 있을 것이라 생각한다.

그렇다면 이제 참조형 변수를 우리가 직접 선언해보자.

 

목표 : 참조형 변수를 선언할 수 있다.

 

1. 참조형 변수의 종류?

 

우리가 한 가지 빠트린 내용이 있을 거라고 생각한다.

바로 형태(Type)이다.

기본형 변수에서는 총 8개의 자료형을 가지고 있다고 했고

실제 값, 리터럴에 맞는 형태로 선언해줘야 한다고 했었다.

그렇다면 참조형 변수의 형태는 무엇이 있을까?

정답은 모른다.

 

또다시 작성자가 미친 놈인가?하는 생각이 들겠지만

참조형 변수는 기본형 변수처럼 정해져 있는 녀석이 아니라

사용자가 원한다면 자기가 원하는, 필요한 변수형을 만들어서 사용할 수 있기 때문이다.

그렇기 때문에 정확히 말하자면 기본형 8가지를 제외한 모든 것이라고 할 수 있다.

 

이 무슨 뭐같은 경우가 다 있냐고 어이가 없겠지만

이런 특징을 가지고 있기 때문에 반대로 개발하는 입장에서는

굉장히 획기적인 것이기도 하다.

변수형을 만든다는 것은 기본형 변수에만 국한된 값만 사용하는 것이 아니라

기능과 특성까지 만들고 사용할 수 있다는 말이 되는 것이다.

이렇게 되면 개발을 하는데 있어서 유리한 부분은 말 안해도 알 것이라 생각한다.

 

그렇다고 아무것도 정해져 있는게 없는 건 아니다.

기본적으로 자바를 개발한 개발자들은 앞으로 자바 언어를 사용할 사용자들을 위해서

자주 쓰이거나 유용한 참조형 변수들을 고맙게도 미리 만들어 두었다.

그 중에서도 우리가 아주 기본적으로 알고 있어야할 참조형 변수 2가지를 알아보자.

참고로 우리가 기본형 변수에서는 자료형(Data Type)이라고 했지만

참조형 변수에서는 자료형이 아닌 그냥 형태, 즉, 타입(Type)이라고 한다.

 

1) String

기본적으로 자바에서는 문자열을 처리할 수 있는 자료형이 존재하지 않는다.

기본형 8가지 중에서 '문자'를 처리하는 char만 있지

문자'열'을 처리할 수 있는 것이 없다.

그렇기 때문에 만들어진 녀석이다.

이 녀석은 문자열을 처리하는데 사용하는 변수가 되겠다.

 

2) Scanner

Scanner사용자의 입력을 받아야할 때 사용하는 참조형 변수다.

너무나도 당연하지만 기본형 변수에서 사용자의 입력을 받는다는

그런 해괴한 변수타입은 존재하지 않는다.

그래서 만들어진 참조형 변수 Scanner가 되겠다.

Scanner는 입력을 위한 참조 변수지만 반대로 출력하는데 사용되는 참조 변수도 있으니

차근차근 알아가도록 하자.

 

이 2가지 참조형 변수는 진짜 지겹도록 만나게 될테니 이름 정도는 알아두자.

 

2. 참조형 변수의 선언 방법

 

그렇다면 이제 참조형 변수를 선언하는 방법에 대해서 알아보자.

참조형 변수의 선언 방법은 기본형 변수와는 조금 다른데

여기에서 새로운 명령어를 하나 배우게 된다.

 

먼저 예시부터 들어보면

 

String str = new String("자바");

 

라는 한 줄의 코드가 있다.

조금 쉽게 설명하기 위해서 기본형 변수의 형태로 바꿔보겠다.

 

char str = '자바';

 

다시 한 번 강조하지만 지금 char를 사용한 예시 코드는 틀린 코드이며

설명을 위한 코드임을 알린다.

 

일단 구조부터 차근차근 살펴보자.

char의 역할을 하고 있는 녀석은 맨 처음에 나오는 String이라는 참조 변수다.

char와 비슷하게 선언된 변수에 저장되는 값의 형태가 무엇인지와

변수의 크기를 지정하는 그런 역할을 할 것이다.

그리고 str은 당연히 우리가 선언하는 변수의 이름이 될 것이다.

그런데 지금부터 듣도보도 못한 녀석이 등장한다.

 

기본형 변수의 선언에서는 =기호 다음에 바로 실제 값, 리터럴이 등장하는데

참조형 변수에서는 new라는 요상한 녀석이 나타나 참조 변수 타입을 한 번 더 언급하더니

그제서야 ( )안에 우리가 변수에 저장하려는 값, 리터럴이 등장하게 된다.

전문적인 지식없이 그냥 눈에 보이는대로 생각하자면

'자바' = new String("자바")라는 뜻이 될 거 같아보인다.

그렇다면 도대체 이 new라는 녀석은 어디서 굴러온 녀석이며 뭐하는 녀석인지 한 번 알아보자.

 

new는 정확하게 말하면 생성자(Constructor)라는 이름을 가지고 있다.

new의 사전적 의미 그대로 새로운이라는 뜻을 가지고 있고

새로운 무언가를 만든다는 의미를 지니고 있다.

이해를 돕기 위해서 새로운 무언가를 만든다라고 했지만

정확하게 말하면 객체, 즉, 참조 변수를 생성할 때 사용되는 녀석이다.

다시 코드를 살펴보자면

 

new String("자바")

 

는 String이라는 참조 변수를 new라는 생성자가 새로 생성한다는 뜻이 되겠다.

문자열을 처리하는 String이라는 참조 변수를 생성해 "자바"라는 문자열을

변수에 저장한다는 뜻이 되겠다.

여기에서 new 뒤에 나오는 참조 변수의 이름은 우리가 처음에 선언한 참조 변수와

똑같은 이름이어야 한다는 점도 기억하자.

그리고 new 생성자를 사용하면 생성된 참조 변수는 모두 다른 주소를 갖게 된다.

다시 말해 new로 생성할 때마다 새 집을 준다는 뜻이다.

 

다시 한 번 예시 코드를 돌아보자.

 

String str = new String("자바");

 

라는 코드는

문자열을 처리하는 String 타입참조 변수를 선언하고

이름이 str이라는 변수를 메모리 Stack영역4byte 크기의 저장공간을 생성한 후,

new라는 생성자를 이용해 String 참조 변수(객체)를 생성해

( )안에 있는 문자열 "자바"라는 값메모리 Heap영역 어딘가에 저장한 후,

그 저장공간의 주소 값Stack영역에 생성된 이름이 str이라는 공간에 저장하는 것이다.

라고 설명할 수 있겠다.

 

이는 참조형 변수를 선언하는데 가장 대표적인 예시이며

다른 참조형 변수를 선언할 때도 동일한 구조를 가진다.

앞서 알아봤던 Scanner도 마찬가지로

 

Scanner scanner = new Scanner();

라는 형태로 역시 new라는 생성자를 사용해 Scanner 참조 변수를 생성하는 것을 볼 수 있다.

 

3. 마무리

 

참조형 변수의 선언은 기본형 변수와 다르게

새로 등장한 것도 있기 때문에 조금은 어렵게 느껴질 수도 있지만

사실 뜯어보면 변수 선언은 다 비슷하다는 것을 알 수 있다.

다만 new라는 생성자를 사용해야 한다는 것이고

왜 그렇게 복잡하게 만들었냐라고 이유를 묻는다면

앞서 설명했었던 참조형 변수주소 값을 저장하는 변수이고

메모리 상에서 기본형 변수와는 다른 과정으로 값이 저장되기 때문이다.

Comments