자바에서 데이터 타입은 변수가 어떤 종류의 데이터를 저장하고 다룰 수 있는지를 정의하는데 사용됩니다. 데이터 타입을 크게 기본형과 참조형으로 나눌 수 있습니다. 기본형 데이터 타입은 실제 값을 저장하고 참조형 데이터 타입은 객체에 대한 참조(주소)를 저장하며, 두 타입 간에는 변수 대입 및 메서드 호출 시 동작하는 방식에서 차이가 있습니다.
int x = 5;
int y = 10;
int sum = x + y; // sum은 15가 됨
JavaString str1 = "Hello";
String str2 = "Hello";
if (str1.equals(str2)) {
// 이 부분은 실행됨. 내용 비교
}
if (str1 == str2) {
// 이 부분은 실행되지 않음. 참조 주소 비교
}
Java기본형과 참조형의 계산 방식은 각각의 특성에 따라 다르게 작동합니다.
기본형은 값 자체가 변수에 저장되어 계산되며, 참조형은 객체에 대한 참조가 변수에 저장되어 해당 객체의 내용이나 구조를 다루게 됩니다.
기본형 변수 간의 연산은 해당 변수에 저장된 값들 간의 계산입니다. 이는 변수의 값에 직접 연산이 적용되는 방식입니다.
int x = 5;
int y = 10;
int sum = x + y; // sum은 15가 됨
Java메서드나 함수에 기본형 변수를 전달할 때는 변수의 값이 복사되어 전달됩니다. 따라서 메서드 내에서 해당 값을 변경하더라도 원본 변수에는 영향이 없습니다.
void multiplyByTwo(int value) {
value = value * 2;
}
int num = 10;
multiplyByTwo(num);
// num은 여전히 10
Java참조형 변수는 실제 데이터가 아니라 데이터에 대한 참조를 저장하므로, 변수 간의 연산은 참조에 대한 계산입니다. 즉, 실제 객체의 내용이 아닌 객체의 참조 주소를 다룹니다.
String str1 = "Hello";
String str2 = " World";
String result = str1 + str2; // 새로운 문자열을 만들어 result에 저장
// String 은 참조형이지만 자바에서 특별하게 편의 기능을 제공한다.
Java참조형 변수가 객체를 가리키고 있다면, 해당 객체의 내용을 변경할 수 있습니다. 이는 참조를 통해 실제 객체에 접근하므로 가능합니다.
StringBuilder builder = new StringBuilder("Hello");
builder.append(" World"); // 기존 객체의 내용을 변경
Java기본형과 참조형의 변수 대입에는 중요한 차이점이 있습니다.
기본형은 값이 직접 저장되어 있기 때문에 값이 복사되고 서로 독립적입니다. 반면에 참조형은 객체에 대한 참조 주소가 복사되어 두 변수가 동일한 객체를 가리키게 되므로 한 변수를 통한 변경이 다른 변수에도 영향을 미칩니다.
기본형 변수 간의 대입은 해당 변수에 저장된 값을 복사하는 것입니다. 따라서 대입 이후에는 두 변수가 완전히 독립적으로 움직입니다.
int x = 5;
int y = x; // 값이 복사됨
Java변수 간의 값을 변경해도 다른 변수에는 영향을 미치지 않습니다.
x = 10;
// y는 여전히 5
Java참조형 변수를 다른 변수에 대입하면 객체에 대한 참조 주소만 복사됩니다. 즉, 두 변수가 동일한 객체를 가리키게 됩니다.
StringBuilder builder1 = new StringBuilder("Hello");
StringBuilder builder2 = builder1; // 참조 주소가 복사됨
Java두 변수가 동일한 객체를 가리키기 때문에 한 변수를 통해 객체의 내용을 변경하면 다른 변수를 통해서도 변경 내용이 반영됩니다.
builder1.append(" World");
// builder2도 같은 객체를 가리키므로 builder2.toString()는 "Hello World"
Java참조형 변수에 새로운 객체를 할당하면 해당 변수는 새로운 객체를 가리키게 됩니다. 그러나 다른 변수에는 영향이 없습니다.
builder1 = new StringBuilder("New Object");
// builder1은 새로운 객체를 가리킴, builder2는 여전히 이전 객체를 가리킴
Java참조형 변수에 null을 대입할 수 있습니다. 이는 해당 변수가 어떤 객체도 가리키지 않음을 나타냅니다.
builder1 = null;
// builder1은 더 이상 어떤 객체도 가리키지 않음
Java💡기본형 변수
💡참조형 변수
기본형 변수를 메서드에 전달할 때, 해당 변수의 값이 복사되어 전달됩니다.
void multiplyByTwo(int value) {
value = value * 2;
}
int num = 5;
multiplyByTwo(num);
// num은 여전히 5, 메서드 내에서 변경이 없음
Java메서드 내에서 기본형 변수를 변경하더라도 원본 변수에는 영향이 없습니다. 이는 값이 복사되었기 때문입니다.
void addTen(int x) {
x = x + 10;
}
int number = 20;
addTen(number);
// number는 여전히 20, 메서드 내에서 변경이 없음
Java참조형 변수를 메서드에 전달할 때, 변수가 가리키는 객체의 참조 주소가 복사되어 전달됩니다.
void appendExclamation(StringBuilder strBuilder) {
strBuilder.append("!");
}
StringBuilder message = new StringBuilder("Hello");
appendExclamation(message);
// message는 "Hello!"로 변경됨
Java메서드 내에서 참조형 변수가 가리키는 객체의 내용을 변경할 수 있습니다.
void addGreeting(StringBuilder strBuilder) {
strBuilder.insert(0, "Greetings, ");
}
StringBuilder greeting = new StringBuilder("Hello");
addGreeting(greeting);
// greeting은 "Greetings, Hello"
Java그러나 메서드 내에서 참조형 변수에 새로운 객체를 할당하더라도 호출자에게는 영향이 없습니다. 메서드 내에서 변수에 새로운 객체를 할당하면 해당 변수는 새로운 객체를 가리키지만, 호출자의 변수에는 영향이 없습니다.
void createNewMessage(StringBuilder strBuilder) {
strBuilder = new StringBuilder("New Message");
}
StringBuilder originalMessage = new StringBuilder("Original");
createNewMessage(originalMessage);
// originalMessage은 여전히 "Original", 메서드 내에서 변경이 없음
Java참조형 변수에 null을 대입하여 해당 변수가 어떤 객체도 가리키지 않도록 할 수 있습니다.
void setToNull(StringBuilder strBuilder) {
strBuilder = null;
}
StringBuilder text = new StringBuilder("Some Text");
setToNull(text);
// text는 여전히 "Some Text", 메서드 내에서 변경이 없음
Java특성 | 기본형 | 참조형 |
---|---|---|
변수 전달 방식 | 값 복사 | 참조 주소 복사 |
원본 변수 영향 | 변경 없음 | 내용 변경 시 영향 있음 |
메서드 내에서 변수 변경 | 불가능 | 가능 |
새로운 객체 할당 | 불가능 | 가능, 호출자에게 영향 없음 |
참조에 null 대입 | 불가능 | 가능 |
데이터 타입은 프로그래밍에서 변수가 다루는 데이터의 종류를 정의하는 중요한 개념입니다. 정수, 실수, 문자, 논리와 같은 기본형 데이터 타입과 클래스, 배열, 문자열과 같은 참조형 데이터 타입은 각각 특정한 특성과 용도를 가지고 있습니다. 기본 자료형은 값 자체를 저장하고 참조 자료형은 객체에 대한 참조(주소)를 저장하기 때문에 변수 할당과 메서드 호출 시 동작 방식에서 차이가 있습니다.
소개 자바에서 Set은 중복을 허용하지 않는 데이터 집합을 의미합니다. List와 달리 동일한 요소를 여러 번…
해시(Hash)란 무엇인가? 해시(Hash)는 자바 프로그래밍에서 빠르고 효율적인 데이터 저장 및 검색을 위한 핵심적인 개념입니다. 이…
LinkedList란 무엇인가? LinkedList는 자바에서 유용하게 사용되는 자료구조 중 하나로, 연결 리스트 방식을 이용하여 데이터를 관리하는…
ArrayList란 무엇인가? ArrayList는 자바에서 가장 널리 사용되는 컬렉션 중 하나로, 가변 크기의 배열을 구현한 클래스입니다.…
제네릭(Generic)이란? 자바 제네릭은 코드의 재사용성을 높이고 타입 안전성을 보장하는 중요한 개념입니다. 이 블로그 글에서는 자바…