지난 글에서는 int, double, char, boolean 같은 기본형(Primitive Type) 을 배웠습니다.
이번 글에서는 Java에서 아주 중요한 개념인 **참조형(Reference Type)**과 **객체(Object)**를 입문자 눈높이에서 천천히 알아봅니다.
🔸 복습: 데이터 타입은 두 가지
| 분류 | 설명 | 예시 |
| 기본형 | 하나의 값만 저장 | int, double, boolean, char |
| 참조형 | 여러 데이터나 기능이 모인 구조 | String, 배열, 클래스 등 |
🔹 객체(Object)란 뭘까?
객체란 데이터(속성) + 동작(기능) 이 묶여 있는 '하나의 덩어리'예요.
🧑🏫 예: 사람이라는 객체를 생각해봅시다
- 속성: 이름, 나이, 키
- 동작: 인사하다, 걷다
Java에서는 이렇게 속성과 동작이 함께 있는 구조를 "객체"라고 합니다.
이런 객체를 만들기 위한 설계도가 **클래스(class)**예요.
🔹 참조형 데이터 타입이란?
참조형은 실제 데이터를 저장하는 게 아니라, Heap 메모리에 있는 객체의 위치(주소)를 저장해요.
✅ 대표적인 참조형 타입
| 타입 | 설명 |
| String | 문자열 (문자 여러 개의 모음) |
| 배열 (int[]) | 같은 타입의 데이터를 여러 개 저장 |
| 클래스 | 내가 만든 데이터 구조 |
🔍 기본형 vs 참조형 차이 (비유로 쉽게!)
| 구분 | 기본형 예시 int x = 10; | 참조형 예시 String s = "Java"; |
| 저장 방식 | 값 자체 저장 (10) | 실제 "Java"는 다른 공간에 있음 |
| 변수 내용 | 숫자 10 | "Java"가 있는 위치(주소) |
| 메모리 | Stack | Stack에 주소, Heap에 실제 값 |
📌 비유:
- 기본형은 물건 그 자체를 손에 쥐고 있는 상태
- 참조형은 물건이 보관된 창고 주소를 손에 들고 있는 상태
📘 실습: 참조형의 실제 동작 보기
public class ReferenceTypeExample {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1 == str2); // true (문자열 상수 풀)
System.out.println(str1 == str3); // false (new로 생성된 객체는 별도 공간)
System.out.println(str1.equals(str3)); // true (내용 비교)
}
}
✨ 해설
- == : 참조형 변수끼리는 주소를 비교합니다.
- .equals() : 내용 자체를 비교합니다.
🔍 배열도 참조형!
int[] nums = {1, 2, 3};
System.out.println(nums[0]); // 1
배열도 참조형이기 때문에, nums는 Heap에 저장된 배열의 주소를 가리킵니다.
✅ 참조형 변수의 주의점
| 주의할 점 | 설명 |
| == 대신 .equals() 사용 | 참조형의 값 비교는 equals()로 해야 정확해요 |
| null 값 가능 | 참조형 변수는 null을 가질 수 있고, 이때 사용하면 NullPointerException 발생 |
| 메모리 구조 차이 | Stack에 변수, Heap에 데이터 → GC(가비지 컬렉터)가 정리함 |
🧠 추가 팁: String은 특별한 참조형
String a = "Java";
String b = "Java";
String c = new String("Java");
System.out.println(a == b); // true (문자열 상수 풀)
System.out.println(a == c); // false (new는 새 주소)
자바는 String을 효율적으로 관리하기 위해 **문자열 상수 풀(String pool)**을 사용합니다.
즉, "Java"는 이미 있는 문자열이면 재사용해요!
🎯 정리 요약
| 구분 | 기본형 | 참조형 |
| 값 저장 | 직접 저장 | 주소(참조) 저장 |
| 메모리 위치 | Stack | Stack(주소) + Heap(실제 데이터) |
| null 가능 | ❌ | ✅ 가능 |
| 비교 방식 | == | equals() 사용해야 안전 |
📘 다음 글 예고
다음 글에서는 Java 입문자들이 자주 겪는 변수 타입 관련 실수와 비교 실험을 다룹니다.
boolean에 숫자 넣기, byte 오버플로우, ==와 .equals()의 차이 등,
실수하기 쉬운 코드들을 예제로 직접 확인해볼 수 있어요!
[Java] 입문자가 자주 틀리는 변수 타입 실수 완벽 정리 - 실습 해설
Java를 처음 배우다 보면 헷갈리는 문법과 오류들이 꼭 나옵니다.이번 글에서는 실수하기 쉬운 변수 선언과 데이터 타입 비교 방식을 예제로 정리해볼게요. ✅ 1. boolean에 숫자 1을 넣으면?boolean b
hrlim.tistory.com
💬 연습 문제
다음 코드를 실행해보고 결과를 예측해보세요!
String a = "hello";
String b = new String("hello");
System.out.println(a == b); // ?
System.out.println(a.equals(b)); // ?
'프로그래밍언어 > JAVA' 카테고리의 다른 글
| [JAVA] 형 변환(Casting) – 기본형 타입 완전 정리 (1) | 2025.07.19 |
|---|---|
| [Java] 입문자가 자주 틀리는 변수 타입 실수 완벽 정리 - 실습 해설 (3) | 2025.07.14 |
| [Java] 변수와 기본형 데이터 타입 완벽 이해하기 (1편) (1) | 2025.07.13 |
| [Java] 자바 코드는 어떻게 실행될까? (JVM과 바이트코드 완전 이해) (0) | 2025.07.06 |
| [Java] IntelliJ 설치하고 첫 Java 프로젝트 만들기 (0) | 2025.07.05 |