※[컬러잇 자바] 시리즈는 "왜?"라는 질문을 중심으로 자바의 기초문법에서 고급 자바기술까지 알아보는 컬러잇 개발블로그 시리즈입니다.
https://color-it.tistory.com/2
[컬러잇 자바] #2. 왜 객체를 사용할까?
※[컬러잇 자바] 시리즈는 "왜?"라는 질문을 중심으로 자바의 기초문법에서 고급 자바기술까지 알아보는 컬러잇 개발블로그 시리즈입니다. https://color-it.tistory.com/1 [컬러잇 자바] #1. 왜 자바를 배
color-it.tistory.com
저번시간에는 객체가 무엇인지, 그리고 객체를 정의하는 클래스에 대해서 알아보았습니다. 컬러잇자바 3편에서는 클래스에 들어가는 두 가지 요소 중 첫 번째 요소인 변수에 대해서, 변수의 종류와, 어떤 차이점이 있는지에 대해서 알아보겠습니다.
1. 변수는 왜 사용할까?
변수는 값을 저장하기 위해 사용합니다. 어떤 특정한 값을 저장해두고 싶을 때 변수를 만들어서 저장합니다.
타입 변수명;
변수를 사용하기 위해서는 내가 이 변수를 사용하겠다는 선언을 해야합니다. 선언에는 변수의 타입과 변수의 이름이 필요합니다.
int count;
간단한 예시는 위와 같습니다. int가 타입, count가 변수 이름이 됩니다. (타입은 곧 나옵니다.)
count = 33;
변수가 선언되었다면 이제 값을 넣어줄 수 있는데, 이를 대입이라고 합니다.
int count = 33;
그래서 보통 선언과 대입이 같이 이루어지는 경우가 많습니다.
2. 타입이란?
타입은 변수가 어떤 값을 저장할 수 있는지 나타냅니다. 즉, 변수의 선언에 사용된 타입으로 해당 변수에 어떤 값이 들어올 수 있는지 알 수 있고, 실제로 대입된 값의 타입과 변수의 타입이 다르면 에러가 발생합니다.
그렇기 때문에 자바에서는 변수의 타입을 알아두는 것이 아주 중요합니다. 그리고 자바의 타입은 크게 두 가지로 구분할 수 있습니다.
기본형(primitive) 타입
문자, 숫자, 또는 참과 거짓을 저장하기 위해서는 기본형 변수를 사용할 수 있습니다. 기본형 변수는 다시 8개의 타입으로 나뉘어집니다.
1. boolean
참 또는 거짓을 저장합니다. 내부적으로는 1바이트의 크기를 갖습니다.
2~5. byte - short - int - long
정수를 저장합니다. byte부터 1바이트 - 2바이트 - 4바이트 - 8바이트의 크기를 갖습니다. 가장 널리 사용되는 타입은 int 입니다.
6~7. float - double
실수를 저장합니다. float는 4바이트, double은 8바이트의 크기를 가지며 가장 널리 사용되는 타입은 double 입니다.
8. char
문자 한 개를 저장합니다. 2바이트의 크기를 가집니다.
컴퓨터에는 0 또는 1을 저장할 수 있는 공간 한 개를 비트라고 칭합니다. 그리고 컴퓨터는 비트 여러 개를 이용하여 숫자를 표현하는데, 예를들어 십진수 5는 이진수 101이므로 비트 3개를 사용해 표현할 수 있습니다.
바이트는 비트가 8개 있는 것으로, int형의 경우에는 4바이트의 크기를 가지므로 총 32개의 비트로 수를 표현합니다. 가령 숫자 5를 int형으로 저장하면 000000000000000000000000000000101 로 표현할 수 있는 것입니다.
따라서 int형의 경우에는 숫자를 2^32 개를 표현할 수 있으며, 보통 맨 앞 자리 비트는 부호를 표현하는데 사용되므로 (0이면 양수, 1이면 음수) int형은 -2^31부터 2^31 - 1 까지 2^32 개의 숫자를 표현할 수 있습니다.
class Dog {
int age;
float weight;
}
다시 기본형 변수 얘기로 돌아오자면, 저번에 배운 클래스에는 객체의 상태를 나타내는 변수가 있다고 했습니다. 클래스 내에서 기본형 변수를 위와같이 사용할 수 있습니다.
그래서 Dog 클래스는 상태로 나이와 몸무게를 가질 수 있게되는 것이죠
참조형(Reference) 타입
참조형 변수는 기본형 변수에 해당하지 않는 변수들입니다.
이전 게시글에서 자바는 객체로 이루어졌고, 객체 간의 상호작용으로 프로그램이 작동한다고 했습니다. 이 "객체 간의 상호작용"은 객체에 정의된 변수나 메서드에 접근하는 것을 중심으로 이루어집니다.
그렇다면 변수나 메서드에는 어떻게 접근할까요?
그것은 바로 객체를 "가리키는" 변수를 정의한 후에 그 변수를 통해서 접근할 수 있습니다.
class Dog {
String name; //String은 곧 나옵니다. 문자열을 저장하는 용도로 사용됩니다.
int age;
float weight;
}
class Person {
Dog myDog;
}
개의 주인 클래스를 하나 만들었을 때, 주인이 처음 개를 만나서 이름을 정해줘야한다고합시다. 그러면 Person 객체가 Dog 객체의 변수 중 하나인 name 변수의 값을 수정해야하죠. 이 과정이 객체 간의 상호작용의 예시입니다. 객체가 다른 객체에 접근해서 변수와 메서드에 접근하는 것이죠.
class Person {
Dog myDog = new Dog(); //이 부분은 생성자에 해당합니다.
//나중에 다룰 예정이기에 간단히 설명하자면 new 연산자를 통해 객체를 "생성"합니다.
void setMyDogInfo() { //이 부분은 메서드로, 다음시간에 다룹니다.
myDog.name = "초코";
myDog.age = 3;
}
}
Person 객체에서 Dog 객체에 접근하는 간단한 예시입니다. (변수명).(해당 객체 내의 변수명)을 통해서 그 객체의 변수에 접근할 수 있습니다.
위의 setMyDogInfo 코드를 실행한다면 Person 객체가 이름이 초코고 나이가 3살인 예쁜 강아지 객체를 변수로 가지게 되는 것이죠.
이렇게 객체는 다른 객체를 변수로 가질 수 있습니다. 그리고 이러한 변수들을 모두 참조형 변수라고 합니다.
중요한 것은 같은 클래스에 속하는 객체들은 클래스에 정의된 메서드와 변수들을 공유하지만, 그 값은 서로 다르다는 것입니다. 어떤 Person 객체는 이름이 뽀삐이고 나이가 9살인 개를 가질 수도 있고, 어떤 Person 객체는 이름이 쿠키이고 나이가 4살인 개를 가질 수도 있습니다. 이 부분은 서로가 가진 참조형 변수들을 어떻게 '세팅'하느냐에 달렸죠.
용어정리
객체와 참조에서 몇 가지 용어가 존재하고, 이 용어들은 자주 나오므로 익혀두면 좋습니다.
특정 변수가 어느 한 객체를 저장하고 있을 때, 이것은 그 특정 변수가 객체를 참조한다라고 합니다.
참조형 변수가 객체를 참조하기 시작하면, 그 변수를 객체 레퍼런스 변수라고 칭합니다.
클래스 내에서 정의된 변수들을 인스턴스 변수라고 칭합니다.
유용한 객체 하나 더, String
자바의 기본형 변수에는 문자를 나타내기 위해서 char 타입을 사용합니다. char 타입은 문자 한 개를 표현하는데 사용됩니다. 그래서 개 이름으로 char 타입을 사용하면 개 이름을 A, c, k 이런식으로 밖에 짓지 못합니다.
사람들은 개 이름으로 A, c, k 와 같은 이름을 지어주고 싶지 않아합니다. 초코, 뽀삐, 백구 등 문자 여러 개로 표현하고 싶어하죠. 이를 위해서는 char 배열을 사용해야합니다. 배열도 나중에 배우겠지만 배열은 초반에 설정한 길이 이상으로 늘어날 수도 없는 등의 문제가 있습니다. 따라서 이 불편을 줄이고 몇 가지 기능을 추가한 String 이라는 참조형 변수를 문자열을 표현할 때 사용합니다.
class Dog {
int age;
float weight;
String name;
}
class Person {
Dog myDog = new Dog();
void setMyDogInfo() {
myDog.age = 3;
myDog.name = "뽀삐";
}
}
위의 예시에서도 나왔지만 String을 사용한다면 더욱 편리하게 문자열을 다룰 수 있습니다.
3. 왜 둘이 구분하나요?
이제 참조형 변수와 기본형 변수의 차이에 대해서 알아보았습니다.
그렇다면, 얼핏보면 객체를 저장하냐, 수, 문자 등을 저장하냐의 차이인 것 같은데 왜 참조형변수와 기본형변수를 구분해서 사용할까요?
그 이유는 메모리에 저장되는 방식이 달라서입니다.

기본형 변수를 사용한다면 변수가 저장되는 공간에 값이 그대로 저장됩니다. 만약 Dog 객체에서 age 변수에 값을 저장했다면, age 변수가 저장된 메모리에 그 값이 그대로 저장됩니다.
하지만 참조형 변수는 그렇지 않습니다. 참조형 변수는 먼저 객체가 저장된 다음에, 참조형 변수에는 그 객체의 주소값이 저장됩니다. (참조값이라고도 합니다.)
즉, 기본형 변수에는 변수에 저장한 값이 그대로 저장되고, 참조형 변수는 객체가 저장되고 그 메모리 주소가 변수에 저장되는 것이죠. 그래서 변수가 객체를 '가리킨다'라고 표현하는 경우도 있습니다.
1. 기본형 변수
class Dog {
int age;
float weight;
}
class Person {
Dog myDog = new Dog();
void setMyDogInfo() {
myDog.age = 3;
myDog.age = 4;
}
}
위의 코드는 Person 객체에서 Dog 객체의 age 변수를 3으로 설정한 후에, 다시 4로 바꾸는 코드입니다. 즉, 기본형변수에 값을 저장하고 새로운 값을 저장하는 코드입니다.

내부적으로는 기본형 변수가 저장된 메모리 주소에 새로이 값을 저장하게됩니다. 즉, age 변수에 저장된 값을 3에서 4로 바꾸죠.
참조형 변수
class Person {
Dog myDog = new Dog();
Dog myDog2 = new Dog();
void setMyDogInfo() {
myDog.age = 3;
myDog2.age = 9;
myDog = myDog2;
}
}
위 코드는 Dog 객체 두 개를 설정하고 나이를 설정한 뒤, myDog2가 가리키던(참조하던) 객체를 myDog도 참조하게 하는 코드입니다. 이러면 어떤 일이 일어날까요?

이렇게 참조형 변수가 참조하던 객체가 바뀔 경우, 그 참조형 변수는 새로이 대입된 객체를 참조합니다. 즉, 기존 참조형 변수가 '가리키던' 객체를 버리고, 새로운 객체를 '가리키게' 되는 것입니다.
위의 상황을 보시면 myDog 변수에 myDog2 변수가 대입되었습니다. 위에서 말했듯이, 참조형변수에는 그 참조값이 저장된다고 했었죠? myDog 변수에 myDog2 변수를 대입하면 myDog 변수가 myDog2에 저장된 참조값을 대입받습니다. 즉, 같은 객체를 가리키게 되는 것입니다.
참조형 변수는 서로 값 수정이 가능하다
어쩌다보니 myDog 변수와 myDog2 변수가 같은 Dog 객체를 가리키게 되었습니다. 그런데 여기서 myDog 변수에 저장된 객체의 age 값을 11로 수정하면 어떻게 될까요?
class Person {
Dog myDog = new Dog();
Dog myDog2 = new Dog();
void setMyDogInfo() {
myDog.age = 3;
myDog2.age = 9;
myDog = myDog2;
myDog.age = 11;
}
}

myDog 변수가 참조 중인 객체의 age 변수를 수정하게됩니다. 그런데 myDog 변수가 참조 중인 객체는 myDog2 변수가 같이 참조 중이었죠. 그럼 결국 myDog2.age를 통해 age 변수에 접근해보면 값이 변경되어있습니다.
따라서 같은 객체를 참조 중인 여러 변수들 중에 어느 하나의 변수에 접근해서 객체의 변수를 수정하면, 다른 변수에도 이 변경사항이 영향을 받게됩니다. 왜냐하면 그 변수들은 같은 객체를 참조 중이기 때문이죠.
int age = 33;
int age2 = 25;
age = age2;

기본형 변수는 참조형변수처럼 객체가 저장된 주소를 가리키게 하는 것이 아니라, 기본형 변수에 대입된 값을 '복사'해서 변수의 값을 저장하게됩니다. 이 방식을 통해서 두 기본형 변수는 서로 아무런 영향도 끼치지 않습니다.
이렇게 오늘은 클래스의 상태를 나타내는 요소, 변수에 대해서 알아보았습니다. 간단히 내용을 정리해보자면,
1. 자바는 객체의 상태를 표현하기 위해 변수를 사용합니다.
2. 클래스 내에서 변수를 정의하려면 타입과 변수명이 필요합니다.
3. 변수의 타입은 기본형과 참조형으로 나뉩니다.
4. 기본형 변수는 숫자, 참/거짓, 문자를 저장하기 위해 사용되며, 기본형 변수에 저장하려는 값이 저장됩니다.
5. 참조형 변수는 기본형 변수가 아닌 변수이며, 객체를 저장하기 위해 사용합니다. 참조형 변수는 먼저 객체를 저장하고, 그 객체가 저장된 메모리 주소가 변수에 저장됩니다.
6. 기본형 변수에 새 값을 대입하면 그 변수의 메모리 주소에 저장된 값이 수정됩니다.
7. 참조형 변수에 새 객체를 대입하면 새로운 객체의 주소값이 변수에 저장됩니다.
8. 이렇게 같은 객체를 참조 중인 변수들은 하나의 변수에서 객체의 상태를 변경하면 그 변경사항이 나머지 변수들에게 영향을 미칩니다.
이렇게 객체의 상태를 나타내는 변수들에 대해 알아봤습니다. 그렇다면, 이 상태를 어떻게 변경해야할까요? 가령 개가 나이가 들어 age 변수를 수정해야한다거나, 개를 새로 들여서 새로운 Dog 객체를 추가해야한다던가 말이죠.
이러한 기능들은 모두 메서드에서 담당합니다. 따라서 다음시간에는 클래스를 이루는 또다른 요소, 메서드에 대해서 알아보도록 하겠습니다. 감사합니다!
'Language > ColorIt_Java' 카테고리의 다른 글
| [컬러잇자바] #6. 왜 main 메서드를 사용할까? (0) | 2026.02.02 |
|---|---|
| [컬러잇자바] #5. 왜 생성자를 사용할까? (0) | 2026.01.26 |
| [컬러잇자바] #4. 왜 메서드를 사용할까? (1) | 2026.01.19 |
| [컬러잇 자바] #2. 왜 객체를 사용할까? (1) | 2026.01.05 |
| [컬러잇 자바] #1. 왜 자바를 배워야할까? (0) | 2025.12.29 |
