1. Jave의 자료형
📌 기본형(Primitive Type)과 참조형(Reference Type) 변수의 차이
기본 자료형 : 실제데이터값을 저장
참조 자료형 : 데이터가 저장된 메모리 주소 값을 저장
기본형 (Primitive Type) |
int, double, char, boolean | 스택(Stack) | 값 자체를 저장 |
참조형 (Reference Type) |
String, Integer, Double, 배열(int[], String[]), 사용자 정의 클래스 |
힙(Heap) | 객체가 힙에 저장되고, 참조 변수는 스택에 주소 저장 |
📌 자료형별 메모리 저장 방식
자료형저장 위치값 저장 방식
자료형 | 저장 위치 | 저장 방식 |
int, double, char, boolean, float, double (기본형) | 스택(Stack) | 값 자체를 저장 |
String (리터럴 생성) => String s = "안녕"; | 스트링 풀(String Pool, 힙 내부) | 값 공유 가능 (동일한 문자열 재사용) |
String (new 사용) | 힙(Heap) | 별도의 메모리 공간 할당 |
Integer, Double (Wrapper 클래스) | 힙(Heap) | 객체 형태로 저장 |
배열 (int[], String[] 등) | 힙(Heap) | 힙에 데이터 저장, 스택에는 참조값 저장 |
클래스의 객체 (사용자 정의 클래스) |
힙(Heap) | 힙에 데이터 저장, 스택에는 참조값 저장 |
2. Java의 변수와 메모리 구조
Java에서 변수 선언 방식은 C++과 다소 차이가 있다. 특히, new 키워드를 사용하여 객체를 생성하는 경우와 그렇지 않은 경우 메모리 할당 방식이 다르게 동작한다.
📌 변수 선언 방식과 메모리 할당 차이
🔹 기본형(Primitive Type) 변수 선언
int a = 3;
int b = 3;
위 코드에서 a와 b는 기본형(Primitive Type) 변수이며, 스택(Stack) 메모리에 저장된다. 같은 값을 가지면 같은 메모리 주소를 가리키게 된다. (JVM 내부적으로 최적화 처리됨)
🔹 new를 사용한 변수 선언
Integer a = new Integer(3);
위 코드에서 a는 힙(Heap) 메모리에 저장된다. new를 사용하면 새로운 객체가 생성되며, 기본형 변수가 아닌 객체(Object)로 저장된다. 따라서 int a = 3; 과 Integer a = new Integer(3); 은 서로 다른 메모리 영역을 차지하게 된다.
📌 new 키워드를 사용하는 이유
- 기본형 변수를 직접 할당하면 스택 메모리에 저장되므로 동일한 값은 동일한 메모리 주소를 공유할 가능성이 있다.
- new를 사용하면 힙 메모리에 새로운 객체를 생성하여 별도의 메모리 공간을 사용하도록 강제할 수 있다.
- Garbage Collector(GC, 가비지 컬렉터) 가 존재하는 Java에서는 사용하지 않는 객체를 자동로 정리해주므로, 동적으로 할당된 메모리도 필요에 따라 해제된다.
📌 C++ 과 Java의 메모리 할당 차이
언어 | 기본형 변수 저장 위치 | 객체 저장 위치 | new 사용 시 |
C++ | 스택(Stack) | 명시적으로 new 사용 시 힙(Heap) | 명시적으로 delete 호출 필요 |
Java | 스택(Stack) | 기본적으로 모든 객체는 힙(Heap)에 저장 | 가비지 컬렉터(GC)가 자동으로 메모리 정리 |
📌 C++ vs Java 배열 메모리 구조
C++ | int arr[5]; | 스택(Stack) |
C++ | int* arr = new int[5]; | 힙(Heap) |
Java | int[] arr = new int[5]; | 힙(Heap) (항상 힙 사용) |
왜 Java는 배열을 힙에 저장할까?
1️⃣ Java의 배열은 객체로 취급되므로, 참조형 데이터는 무조건 힙에 저장됨.
2️⃣ Java는 가비지 컬렉터(GC) 가 있기 때문에, 배열을 직접 해제할 필요가 없음.
3️⃣ Java의 배열은 동적 크기 조절이 가능하며, C++처럼 크기가 정해진 스택 메모리에 저장될 필요가 없음.
📌 결론적으로, Java는 모든 배열이 힙(Heap)에서 생성되며, 스택에는 참조값(주소)만 저장된다. 🚀
📌String 리터럴 생성과 new 사용 차이
Java에서 String은 특별한 방식으로 메모리에 저장됨.
리터럴(literal) 생성과 new 키워드를 사용한 생성 방식이 다름.
문자열 생성 방식저장 위치메모리 특성
String s = "Hello"; | String Pool (힙 내부) | 동일한 문자열 재사용 (같은 값이면 같은 메모리 참조) |
String s = new String("Hello"); | 힙(Heap) | 새로운 객체 생성 (같은 값이어도 다른 메모리 할당) |
📌 String Pool이란?
- Java에서 문자열 리터럴("Hello")을 사용하면 JVM의 String Pool(힙 내부의 특별한 공간)에 저장됨.
- 동일한 값을 가진 문자열이 이미 String Pool에 존재하면, 새로운 메모리를 할당하지 않고 기존 문자열을 재사용.
- 하지만 new String("Hello")를 사용하면 강제로 새로운 메모리를 할당하여 독립적인 객체를 생성.
String s1 = "Hello"; // String Pool에 저장됨
String s2 = "Hello"; // 기존 "Hello"를 재사용 (메모리 절약)
String s3 = new String("Hello"); // 힙에 새 객체 생성 (s1, s2와 다른 메모리 위치)
s1 == s2 → true (같은 String Pool 참조)
s1 == s3 → false (s3는 힙에서 새로 생성됨)
3. 가비지 컬렉터(Garbage Collector, GC)
Java는 C++과 달리 명시적으로 메모리를 해제(delete)할 필요가 없다. 대신, 가비지 컬렉터(GC) 가 필요하지 않은 객체를 자동으로 정리해준다.
📌 가비지 컬렉터의 역할
- 더 이상 사용되지 않는 객체를 자동으로 제거하여 메모리 누수를 방지.
- 메모리를 효율적으로 관리하여 프로그램이 안정적으로 실행되도록 유지.
- 스택(Stack) 메모리는 직접 정리되지만, 힙(Heap) 메모리는 GC가 관리.
📌 가비지 컬렉터가 동작하는 방식
- 참조가 없는 객체 찾기: 더 이상 참조되지 않는 객체를 찾음.
- 객체 제거(메모리 해제): 사용되지 않는 객체를 힙에서 삭제.
메모리 정리(Compaction): 단편화된 메모리를 정리하여 새로운 객체를 저장할 공간 확보
4. Java의 메서드(함수)
C++과 Java는 함수(메서드)를 정의하는 방식이 다르다. 특히, Java에서는 접근 제한자(Access Modifier)와 static 키워드를 함수 앞에 붙이는 것이 일반적이다.
📌 C++과 Java의 함수(메서드) 선언 비교
🔹 C++ 함수 선언
void av() {
// 함수 내용
}
🔹 Java 메서드 선언
public static void av() {
// 메서드 내용
}
📌 Java에서 public static을 사용하는 이유
🔹 1. 접근 제한자 (public)
- Java에서는 클래스 내부의 메서드를 다른 클래스에서 사용할 수 있도록 공개(public)할지, 특정 클래스 내에서만 사용할 것인지(private) 정할 수 있다.
- public을 사용하면 해당 메서드는 어디서든 접근 가능하다.
🔹 2. static 키워드
- static 키워드는 해당 메서드가 특정 객체의 인스턴스가 아니라, 클래스 자체에 속함을 의미한다.
- 일반적으로 Java에서 static을 붙이지 않은 메서드는 객체를 생성한 후(new ClassName()) 사용해야 하지만, static 메서드는 객체 생성 없이도 바로 호출할 수 있다.
- 예를 들어, main() 메서드는 프로그램의 시작점이므로 객체 생성 없이 실행되도록 static이 필수적으로 붙는다.
📌 static 메서드와 일반 메서드의 차이점
구분 | static 메서드 | 인스턴스(일반) 메서드 |
호출 방식 | 객체 생성 없이 호출 (ClassName.method()) | 객체를 생성해야 호출 가능 (object.method()) |
사용 목적 | 공통적으로 사용되는 기능 제공 | 객체의 상태를 변경하는 메서드 |
this 사용 가능 여부 | ❌ 사용 불가 (this는 인스턴스 변수에 접근하기 위함) | ✅ 사용 가능 |
'공부 > JAVA' 카테고리의 다른 글
자바의 클래스 (Java Class) (1) | 2025.03.07 |
---|---|
자바의 가비지 컬렉터 (Garbage Collector, GC) (0) | 2025.03.07 |
Java의 입출력 (1) | 2025.03.05 |
자바의 시작 - 프로그램 셋팅 및 헬로우 월드 (0) | 2025.03.05 |