Java 자바 데이터 타입 기본형 & 참조형 특징과 차이점

데이터 타입이란?

자바에서 데이터 타입은 변수가 어떤 종류의 데이터를 저장하고 다룰 수 있는지를 정의하는데 사용됩니다. 데이터 타입을 크게 기본형과 참조형으로 나눌 수 있습니다. 기본형 데이터 타입은 실제 값을 저장하고 참조형 데이터 타입은 객체에 대한 참조(주소)를 저장하며, 두 타입 간에는 변수 대입 및 메서드 호출 시 동작하는 방식에서 차이가 있습니다.

데이터 타입 종류

기본형 데이터 타입 (Primitive Data Types)

  1. 정수형 (Integer Types):
    • byte: 8비트 부호 있는 정수를 표현합니다. -128부터 127까지의 값을 가집니다.
    • short: 16비트 부호 있는 정수를 표현합니다. 대략 -32,768부터 32,767까지의 값을 가집니다.
    • int: 32비트 부호 있는 정수를 표현합니다. 대략 -2,147,483,648부터 2,147,483,647까지의 값을 가집니다.
    • long: 64비트 부호 있는 정수를 표현합니다. 대략 -9,223,372,036,854,775,808부터 9,223,372,036,854,775,807까지의 값을 가집니다.
  2. 실수형 (Floating-Point Types):
    • float: 32비트 부동 소수점을 표현합니다. 대략 -3.4E38에서 3.4E38까지의 범위를 가집니다.
    • double: 64비트 부동 소수점을 표현합니다. 대략 -1.7E308에서 1.7E308까지의 범위를 가집니다.
  3. 문자형 (Character Type):
    • char: 16비트 유니코드 문자를 표현합니다. 유니코드 기준으로 모든 문자를 표현할 수 있습니다.
  4. 논리형 (Boolean Type):
    • boolean: 논리값인 true 또는 false를 표현합니다. 주로 조건문과 논리 연산에 사용됩니다.

참조형 데이터 타입 (Reference Data Types)

  1. 클래스 (Class):
    • 사용자가 직접 정의한 데이터 타입. 객체를 생성하기 위한 설계도 역할을 합니다.
  2. 인터페이스 (Interface):
    • 메소드의 집합을 정의한 추상 데이터 타입. 클래스가 여러 인터페이스를 구현할 수 있습니다.
  3. 배열 (Array):
    • 동일한 자료형의 데이터를 순서대로 저장하는 자료구조.
  4. 열거형 (Enum):
    • 서로 연관된 상수들의 집합. 주로 제한된 값 중에서 선택하는 경우에 사용됩니다.
  5. 기타 참조형 타입 (Other Reference Types):
    • 자바에서 제공하는 여러 클래스와 인터페이스들도 참조형 타입에 속합니다.
    • 예) 문자열 클래스 String

데이터 타입의 차이점

기본형(Primitive Type)

  1. 저장 방식: 기본형은 실제 값을 직접 저장합니다. 예를 들어, int, double, char와 같은 기본형 변수는 해당 값을 직접 메모리에 저장합니다.
  2. 메모리 사용: 각 기본형 변수는 정해진 크기의 메모리 공간을 차지합니다. 이는 메모리 사용 측면에서 효율적입니다.
  3. Null 값: 기본형은 null 값을 가질 수 없습니다. 초기화되지 않은 기본형 변수는 해당 형의 기본값으로 자동 초기화됩니다.
  4. 연산: 기본형 변수 간의 연산은 값에 대한 연산입니다. 예를 들어, 두 int 변수를 더하면 그 값이 더해집니다.
Java
int x = 5;
int y = 10;
int sum = x + y; // sum은 15가 됨
Java

참조형(Reference Type)

  1. 저장 방식: 참조형은 객체에 대한 참조(주소)를 저장합니다. 예를 들어, 클래스의 인스턴스, 배열 등은 참조형에 속합니다.
  2. 메모리 사용: 참조형 변수는 실제 데이터가 아닌 데이터에 대한 참조를 저장하므로 일반적으로 더 많은 메모리를 차지합니다. 객체 자체는 힙(heap) 메모리에 저장되고, 변수는 해당 객체를 가리키는 참조를 갖습니다.
  3. Null 값: 참조형 변수는 null 값을 가질 수 있습니다. 참조형 변수를 초기화하지 않으면 기본수는 null 값을 가질 수 있습니다. 참조됩니다.
  4. 연산: 참조형 변수 간의 연산은 참조에 대한 연산입니다. 예를 들어, 두 객체를 비교하면 객체의 실제 내용이 아닌 참조 주소가 비교됩니다.
Java
String str1 = "Hello";
String str2 = "Hello";

if (str1.equals(str2)) {
    // 이 부분은 실행됨. 내용 비교
}

if (str1 == str2) {
    // 이 부분은 실행되지 않음. 참조 주소 비교
}
Java

기본형과 참조형의 계산 방식

기본형과 참조형의 계산 방식은 각각의 특성에 따라 다르게 작동합니다.

기본형은 값 자체가 변수에 저장되어 계산되며, 참조형은 객체에 대한 참조가 변수에 저장되어 해당 객체의 내용이나 구조를 다루게 됩니다.

기본형(Primitive Type) 계산 방식

💡값에 의한 계산

기본형 변수 간의 연산은 해당 변수에 저장된 값들 간의 계산입니다. 이는 변수의 값에 직접 연산이 적용되는 방식입니다.

Java
int x = 5;
int y = 10;
int sum = x + y; // sum은 15가 됨
Java

💡복사에 의한 전달

메서드나 함수에 기본형 변수를 전달할 때는 변수의 값이 복사되어 전달됩니다. 따라서 메서드 내에서 해당 값을 변경하더라도 원본 변수에는 영향이 없습니다.

Java
void multiplyByTwo(int value) {
    value = value * 2;
}

int num = 10;
multiplyByTwo(num);
// num은 여전히 10
Java

참조형(Reference Type) 계산 방식

💡참조에 의한 계산

참조형 변수는 실제 데이터가 아니라 데이터에 대한 참조를 저장하므로, 변수 간의 연산은 참조에 대한 계산입니다. 즉, 실제 객체의 내용이 아닌 객체의 참조 주소를 다룹니다.

Java
String str1 = "Hello";
String str2 = " World";
String result = str1 + str2; // 새로운 문자열을 만들어 result에 저장
// String 은 참조형이지만 자바에서 특별하게 편의 기능을 제공한다.
Java

💡객체 내용 변경

참조형 변수가 객체를 가리키고 있다면, 해당 객체의 내용을 변경할 수 있습니다. 이는 참조를 통해 실제 객체에 접근하므로 가능합니다.

Java
StringBuilder builder = new StringBuilder("Hello");
builder.append(" World"); // 기존 객체의 내용을 변경
Java

기본형과 참조형의 변수 대입

기본형과 참조형의 변수 대입에는 중요한 차이점이 있습니다.

기본형은 값이 직접 저장되어 있기 때문에 값이 복사되고 서로 독립적입니다. 반면에 참조형은 객체에 대한 참조 주소가 복사되어 두 변수가 동일한 객체를 가리키게 되므로 한 변수를 통한 변경이 다른 변수에도 영향을 미칩니다.

기본형(Primitive Type) 변수 대입

💡값 복사

기본형 변수 간의 대입은 해당 변수에 저장된 값을 복사하는 것입니다. 따라서 대입 이후에는 두 변수가 완전히 독립적으로 움직입니다.

Java
int x = 5;
int y = x; // 값이 복사됨
Java

💡동일한 값을 갖지만 서로 독립적

변수 간의 값을 변경해도 다른 변수에는 영향을 미치지 않습니다.

Java
x = 10;
// y는 여전히 5
Java

참조형(Reference Type) 변수 대입

💡참조 주소 복사

참조형 변수를 다른 변수에 대입하면 객체에 대한 참조 주소만 복사됩니다. 즉, 두 변수가 동일한 객체를 가리키게 됩니다.

Java
StringBuilder builder1 = new StringBuilder("Hello");
StringBuilder builder2 = builder1; // 참조 주소가 복사됨
Java

💡같은 객체를 가리킴

두 변수가 동일한 객체를 가리키기 때문에 한 변수를 통해 객체의 내용을 변경하면 다른 변수를 통해서도 변경 내용이 반영됩니다.

Java
builder1.append(" World");
// builder2도 같은 객체를 가리키므로 builder2.toString()는 "Hello World"
Java

💡참조 주소 변경

참조형 변수에 새로운 객체를 할당하면 해당 변수는 새로운 객체를 가리키게 됩니다. 그러나 다른 변수에는 영향이 없습니다.

Java
builder1 = new StringBuilder("New Object");
// builder1은 새로운 객체를 가리킴, builder2는 여전히 이전 객체를 가리킴
Java

💡Null 대입

참조형 변수에 null을 대입할 수 있습니다. 이는 해당 변수가 어떤 객체도 가리키지 않음을 나타냅니다.

Java
builder1 = null;
// builder1은 더 이상 어떤 객체도 가리키지 않음
Java

기본형과 참조형의 메서드 호출

💡기본형 변수

  • 메서드에 기본형 변수를 전달하면 해당 값이 복사되어 전달됩니다.
  • 따라서 메서드 내에서의 변경이 원본 변수에 영향을 미치지 않습니다.

💡참조형 변수

  • 메서드에 참조형 변수를 전달하면 참조 주소가 복사되어 전달됩니다.
  • 메서드 내에서 객체의 내용을 변경하면 호출자에게도 영향을 미칩니다.
  • 그러나 참조형 변수에 새로운 객체를 할당하면 호출자에게는 영향을 미치지 않습니다. 이는 새로운 객체가 생성되어 해당 참조 변수가 새로운 객체를 가리키게 되기 때문입니다.

기본형(Primitive Type) 메서드 호출

💡값 복사

기본형 변수를 메서드에 전달할 때, 해당 변수의 값이 복사되어 전달됩니다.

Java
void multiplyByTwo(int value) {
    value = value * 2;
}

int num = 5;
multiplyByTwo(num);
// num은 여전히 5, 메서드 내에서 변경이 없음
Java

💡원본 변수에 영향 없음

메서드 내에서 기본형 변수를 변경하더라도 원본 변수에는 영향이 없습니다. 이는 값이 복사되었기 때문입니다.

Java
void addTen(int x) {
    x = x + 10;
}

int number = 20;
addTen(number);
// number는 여전히 20, 메서드 내에서 변경이 없음
Java

참조형(Reference Type) 메서드 호출

💡참조 주소 복사

참조형 변수를 메서드에 전달할 때, 변수가 가리키는 객체의 참조 주소가 복사되어 전달됩니다.

Java
void appendExclamation(StringBuilder strBuilder) {
    strBuilder.append("!");
}

StringBuilder message = new StringBuilder("Hello");
appendExclamation(message);
// message는 "Hello!"로 변경됨
Java

💡객체 내용 변경 가능

메서드 내에서 참조형 변수가 가리키는 객체의 내용을 변경할 수 있습니다.

Java
void addGreeting(StringBuilder strBuilder) {
    strBuilder.insert(0, "Greetings, ");
}

StringBuilder greeting = new StringBuilder("Hello");
addGreeting(greeting);
// greeting은 "Greetings, Hello"
Java

💡참조 주소 변경 불가

그러나 메서드 내에서 참조형 변수에 새로운 객체를 할당하더라도 호출자에게는 영향이 없습니다. 메서드 내에서 변수에 새로운 객체를 할당하면 해당 변수는 새로운 객체를 가리키지만, 호출자의 변수에는 영향이 없습니다.

Java
void createNewMessage(StringBuilder strBuilder) {
    strBuilder = new StringBuilder("New Message");
}

StringBuilder originalMessage = new StringBuilder("Original");
createNewMessage(originalMessage);
// originalMessage은 여전히 "Original", 메서드 내에서 변경이 없음
Java

💡참조에 null 대입 가능

참조형 변수에 null을 대입하여 해당 변수가 어떤 객체도 가리키지 않도록 할 수 있습니다.

Java
void setToNull(StringBuilder strBuilder) {
    strBuilder = null;
}

StringBuilder text = new StringBuilder("Some Text");
setToNull(text);
// text는 여전히 "Some Text", 메서드 내에서 변경이 없음
Java

기본형과 참조형 특성 정리

특성기본형참조형
변수 전달 방식값 복사참조 주소 복사
원본 변수 영향변경 없음내용 변경 시 영향 있음
메서드 내에서 변수 변경불가능가능
새로운 객체 할당불가능가능, 호출자에게 영향 없음
참조에 null 대입불가능가능

결론

데이터 타입은 프로그래밍에서 변수가 다루는 데이터의 종류를 정의하는 중요한 개념입니다. 정수, 실수, 문자, 논리와 같은 기본형 데이터 타입과 클래스, 배열, 문자열과 같은 참조형 데이터 타입은 각각 특정한 특성과 용도를 가지고 있습니다. 기본 자료형은 값 자체를 저장하고 참조 자료형은 객체에 대한 참조(주소)를 저장하기 때문에 변수 할당과 메서드 호출 시 동작 방식에서 차이가 있습니다.

Leave a Comment