본문 바로가기
프로그래밍

컴알못 Java 공부 중. 변수.

by Lihano 2022. 3. 8.
반응형

어느 프로그래밍 언어든 가장 처음 배우는 건 변수일 것이다.

변수란 데이터를 저장할 수 있는 바구니같은 거다.

Java같은 경우엔 담고 싶은 데이터의 종류에 따라 여러 사이즈의 바구니를 준비했다.

그게 변수의 타입(Type)이다.

그리고 바구니에 들어가는 순수한 데이터들을 리터럴(Literal)이라고 부른다.

변수라는 바구니는 A라는 리터럴을 담다가 바꿔서 B라는 리터럴을 담을 수도 있다.

그래서 리터럴 자체는 변하지 않는 것이지만 변수는 변할 수 있다.

반면, 한번 리터럴을 담으면 안에 담은 내용을 변하지 못하는 특수한 바구니가 있다.

그걸 상수(constant)라고 부른다.

 

변수라는 바구니는 타입을 통해 어떤 값을 담을 것인지 명시할 수 있다.

예를 들어, int라는 타입의 변수는 4byte의 정수를 담는 바구니고

char이라는 타입의 변수는 4byte의 문자를 담는 바구니다.

이처럼 숫자, 문자, 논리값 같은 리터럴을 담기 위한 타입은 '기본 자료형(primitive)'이라고 한다.

 

하지만 우리가 바구니에 담고 싶은 건 숫자, 문자 따위가 아닐 수도 있다.

Java란 모든게 객체로 이루어진 객체 지향 언어다.

우리는 생성할 객체를 담을 바구니가 필요하다.

하지만 객체라는 하나의 데이터 덩어리를, 숫자나 문자 따위로 분류할 수 없다.

변수의 타입이란 안에 들어갈 값의 개념을 표현해야하는데, 객체의 개념은 그 객체를 만든 생성자가 직접 정의하는 것이다.

한마디로 객체의  타입이란 만들어내는 사람 마음이기에 무궁무진하게 많을 수 있다.

그래서 객체를 담는 변수의 타입은 당연히 그 객체의 클래스명이 된다.

클래스가 그 객체의 개념을 정의하기 때문이다.

 

아무튼 이처럼 변수란 객체 또한 저장할 수 있다.

라고 말했지만, 사실 변수는 객체를 저장할 수 없다.

이게 무슨 뚱딴지 같은 소리야 라고 말할 수 있다.

이걸 설명하기 위해선 쓰레드(Thread)라는 녀석을 먼저 소개해야한다.

자바 코드가 실행되는 프로그램을 프로세스라는 작업장으로 비유한다면,

쓰레드란 그 작업장 안의 일꾼으로 비교할 수 있다.

모든 작업장 안에는 반드시 한 명 이상의 일꾼이 존재한다.

작업장은 일꾼에게 일을 할 수 있는 작업대를 제공한다.

이 작업장을 스택(Stack)이라고 하자.

이 스택은 쓰레드라는 일꾼이 개인적으로 작업을 하는 개인 책상인 셈이다.

책상 위에는 일꾼이 처리할 작업물들이 올라온다.

리터럴들을 저장하고 있는 기본 자료형 변수들은 이 스택이라는 책상 위에 존재한다.

하지만 객체는 크기가 크고 쓰레드끼리 서로 공유하는 경우가 많기 때문에 책상 위에 두지 않는다.

작업장에서 일꾼의 책상 외의 공간을 힙(HEAP)이라고 부른다.

객체는 이 힙 공간에 존재한다.

사실 JAVA의 메모리 운용이 스택과 힙만 있는건 아니지만 그냥 그렇다고 생각해도 나같은 초심자들에겐 큰 문제는 없을 것이다.

스택이 일꾼의 개인 작업 공간이라면, 힙은 공용 메모리 공간이다.

 

그래서 일꾼은 객체를 가지고 작업을 할 때 객체를 웃차 들어서 책상에 올려놓지 않는다.

객체가 어디있는지 위치(주소값)를 가져와서 책상 위의 변수에 저장하는 것이다.

이렇게 실질 값이 아니라 원하는 객체의 주소값으로 그 객체를 참조하는 변수를 참조 변수라고 한다.

 

아 발그림 ㅈㅅ;; 터치패드로 그림

아무튼 변수는 이처럼 기본자료형 변수와 참조형 변수로 나뉜다.

위에서 설명했듯 쓰레드 책상 위의 참조 변수는 실제로 그 객체를 저장하는게 아니라 그 객체의 주소값을 저장한 것에 불과하다.

그러니 그 변수를 출력시키면 객체의 데이터값이 아니라 주소값을 얻게된다.

그리고 객체 자체가 아니라 주소값이라는 단순한 문자열을 저장하는 거기 때문에 당연히 같은 주소값을 가진 서로 다른 참조 변수들이 존재할 수 있다.

이게 무슨 뜻이나면, 이 참조 변수 다~ 같은 객체를 가리키고 있어요. 라는 뜻이다.

당연히 비교연산자로 비교해봐도 서로 같다고 나온다.

하나의 참조변수를 통해 객체의 값에 어떤 변화를 주면 다른 참조변수들도 전부 다 같은 영향을 받는다.

 

변수의 개념은 어느 프로그래밍 언어를 배우든 대게 비슷하기 때문에 확실히 짚고 넘어갈 필요가 있을 것 같다.

우선 오늘은 여기까지!

 

반응형

댓글