본문 바로가기
공부/JAVA

자바의 변수와 메서드(함수)

by 떈구 2025. 3. 7.

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;

위 코드에서 ab는 기본형(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가 관리.

📌 가비지 컬렉터가 동작하는 방식

  1. 참조가 없는 객체 찾기: 더 이상 참조되지 않는 객체를 찾음.
  2. 객체 제거(메모리 해제): 사용되지 않는 객체를 힙에서 삭제.

메모리 정리(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는 인스턴스 변수에 접근하기 위함) ✅ 사용 가능