티스토리 뷰
이렇게 생긴 예제가 있다고 하자.
class Robot {}
public class Test {
public static void main(String[] args) {
Robot r = new Robot();
}
}
여기서,
Robot r = new Robot();
오늘은 이 한 줄을 깊게 파볼 것이다.
일단 각각 의미부터 파헤쳐보자. ( gpt 형님 )
| Robot | 타입(Type) ➡ 클래스거나 인터페이스일 수 있음 |
참조 변수 a가 어떤 종류의 객체를 담을 수 있는지 정함 |
| r | 참조 변수(Reference Variable) | 객체(인스턴스)의 주소를 저장함 |
| new Robot() | 인스턴스(Instance) | 실제로 메모리에 생성된 객체 |
| = | 대입 연산자 | a가 new Dog() 객체를 참조하도록 연결 |
의미는 이렇게 간단하게 정리할 수 있다. 하지만, 나는 참조변수, 인스턴스와 객체의 차이에 대해서 궁금해서 더 알아보기로 했다.
■ 참조변수 : “어떤 객체(인스턴스)의 **주소(레퍼런스)**를 저장하는 변수” 이다.
좀더 감을 잡기 위해서 참조변수가 사용되는 큰 3가지 경우를 정리해보자. ( gpt 형님 )
📌 예제 1: 생성할 때
Dog d = new Dog(); // d는 참조변수
➡ new Dog()를 통해 객체 생성하고, d에 주소를 저장
➡ 이때 d는 참조변수임.
📌 예제 2: 파라미터로 전달할 때
void printDog(Dog d) {
d.bark();
}
➡ 메서드의 매개변수 d도 참조변수임.
➡ 이미 생성된 객체를 전달받은것이니, 객체 주소를 저장하고 있음
📌 예제 3: 반환값으로 받을 때
Dog getDog() {
return new Dog();
}
Dog myDog = getDog(); // myDog도 참조변수!
➡ getDog()가 반환한 객체를 myDog에 담음
➡ 이 myDog 역시 참조변수
참조변수, 인스턴스의 저장 공간은 다음과 같이 짧게 요약할 수 있다.
참조 변수는 Stack에 저장되고, 실제 객체는 Heap에 저장됨.
+)
참고로, 자바는 메모리를 크게 아래 3가지로 나눠서 관리함.
🧠 1. Stack(스택 메모리)
- 메서드가 호출될 때 생성되는 공간
- 지역변수, 매개변수, 참조 변수들이 저장됨!
- 참조 변수(예: Animal a)는 여기 저장됨!
🧱 2. Heap(힙 메모리)
- new로 생성한 **객체(인스턴스)**가 저장되는 공간
- 즉, new Dog()로 생성된 진짜 객체는 여기에 있음
🧙 3. Method Area(또는 Metaspace)
- 클래스, static 변수, 메서드 정의 등이 저장되는 곳
- 클래스가 로딩될 때 메서드 영역에 올라감
이제 객체와 인스턴스의 차이에 대해서 알아보자.
■ 객체 (Object) : 클래스 기반으로 만들어진 모든 실체
■ 인스턴스 (Instance) : 객체 중에서, 특정 클래스의 변수에 담긴 실체
예제로 이해하자!!
class Dog {
String name;
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog(); // 객체 생성됨!
}
}
- new Dog() ➡ 객체
- myDog ➡ Dog 클래스의 인스턴스
즉, 그 객체가 "Dog"라는 클래스의 변수에 담겼을 때,
그때 그 객체를 "Dog 클래스의 인스턴스"라고 부르는 것!!!!
여기서,
✅ 모든 인스턴스는 객체임.
❌ 하지만 모든 객체가 반드시 인스턴스인 건 아님.
이번 포스팅에서는 모든 객체가 반드시 인스턴스인 건 아님이 경우에 대해서 정리해볼 것이다.
일단 한 줄로 정리하자면, 다음과 같다.
"객체의 타입이 불명확할 때, 즉 어떤 클래스의 인스턴스인지 명확히 알 수 없을 때"
( 자바에서 Object 타입으로 다룰 때가 대표적인 예시이다.)
(예제)
Object obj = new Object(); // ← 여기서 obj는 그냥 "객체"
obj는 단순히 Object 타입의 객체이다. 즉, 나 Cat처럼 특정 클래스의 인스턴스는 아님.
따라서, 그래서 "그냥 객체"라고 부를 수는 있지만 "Dog의 인스턴스"라고는 할 수 없다.
오늘은 여기까지.
'Java' 카테고리의 다른 글
| 자바 - 제네릭, 제네릭 타입 (2) | 2025.08.08 |
|---|---|
| 자바 - 기본형, 참조형 각각의 ==, equals 의미. (2) | 2025.08.05 |
| 자바 - 자바의 다형성 → 인터페이스 (interface) (3) | 2025.07.31 |
| 멀티스레드 환경에서의 안전한 작업을 도와주는 CopyOnWriteArrayList랑 AtomicLong 에 대해. (6) | 2025.07.31 |
| 자바 - final 키워드 의미 (2) | 2025.07.30 |