기본형(Primitive)과 참조형(Reference)

/ 3 min read /
0 views

기본형(Primitive)과 참조형(Reference)

자바의 데이터 타입은 크게 기본형(Primitive)과 참조형(Reference)으로 나눌 수 있다. 기본형은 정수, 실수, 문자, 논리 등의 값을 저장하는 데이터 타입이고, 참조형은 객체의 주소값을 저장하는 데이터 타입이다. 기본형과 참조형의 차이점을 이해하고, 데이터 타입을 사용할 때 주의할 점을 살펴보자.

데이터 공유

기본형은 하나의 값을 여러 변수에서 절대로 공유할 수 없디. 하지만, 참조형은 하나의 객체를 참조값을 통해 여러 변수에서 공유할 수 있다.

여기서 하나의 값을 공유하거나 공유하지 않는다는 것은 무엇을 의미할까? 기본형과 참조형의 차이를 이해하기 위해 아래의 코드를 살펴보자.

먼저 기본형의 경우를 살펴보자. 기본형은 하나의 값을 여러 변수에서 공유할 수 없다.

int a = 10;
int b = a;
a = 20;
System.out.println(b); // 10

우선 기본형 변수 ab는 절대로 같은 값을 공유하지 않는다. b = a라고 하더라도 b 변수는 a 변수의 값을 복사하여 가지고 있는다. 그래서 ab 변수는 같은 숫자 값을 가지고 있게되지만, a가 가지고 있는 10b가 가지고 있는 10은 복사된 완전히 다른 10이다. 메모리 상에서도 ab는 서로 다른 메모리 주소를 가지고 있다.

이제 참조형의 경우를 살펴보자. 참조형은 하나의 객체를 참조값을 통해 여러 변수에서 공유할 수 있다.

class Person {
    String name;
    int age;
}

Person person1 = new Person();
person1.name = "Alice";
person1.age = 20;

Person person2 = person1;
person1.name = "Bob";
System.out.println(person2.name); // Bob

위 코드는 Person 클래스를 정의하고, Person 객체를 생성하여 person1 변수에 할당한다. 그리고 person2 변수에 person1 변수를 할당한다. person1 변수의 name 필드를 변경한 후, person2 변수의 name 필드를 출력하면 어떻게 되는지 테스트하는 코드다. 코드의 결과는 Bob이 출력된다.

참조형 변수들은 같은 참조값을 공유해 같은 인스턴스를 가리킨다. 따라서 person1 변수의 name 필드를 변경하면, person2 변수도 같은 인스턴스를 가리키고 있기 때문에 person2 변수의 name 필드도 변경된다.

공유 참조와 사이드 이펙트

사이드 이펙트(Side Effect)는 함수나 메소드가 주된 행위 및 작업 외에 추가적인 부수 효과를 일으키는 것을 의미한다. 앞서 살펴본 참조형 변수의 경우, person1name 필드를 변경하고자 person1.name = "Bob"를 실행한다. 하지만 person2person1과 같은 참조값을 가지고 있기 때문에 person2name 필드도 변경된다. 이렇게 같은 참조값을 공유할 때 발생하는 사이드 이펙트로 인해 디버깅이 어려워지고 코드의 안정성이 저하될 수 있다.

사이드 이펙트 방지

사이드 이펙트를 방지하기 위해서는 참조형 변수를 공유하지 않도록 해야한다. 그러면 어떻게 참조형 변수를 공유하지 않도록 할 수 있을까? 그것은 생각보다 단순하다. 참조형 변수를 공유하지 않으려면 새로운 인스턴스를 생성하여 참조값을 할당하면 된다.

Person person1 = new Person();
Person person2 = new Person();

위 코드는 Person 클래스의 인스턴스를 두 개 생성하여 person1 변수와 person2 변수에 할당한다. 이제 person1 변수와 person2 변수는 서로 다른 인스턴스를 가리키고 있기 때문에 person1 변수의 필드를 변경하더라도 person2 변수의 필드는 변경되지 않는다.

사실 이러한 사이드 이펙트를 방지하기 위해 불변 객체(Immutable Object)를 사용하는 방법 또한 존재한다. 불변 객체란 간단히 말해 객체의 상태가 변경되지 않는 객체를 의미한다. 이러한 불변 객체를 사용하면 객체의 상태가 변경되지 않기 때문에 사이드 이펙트를 방지할 수 있다. 불변 객체에 대한 자세한 내용은 Immutable Object를 참고하자.

Loading Comments...