
자바 프로그램은 실행될 때 JVM에 의해 메모리가 여러 영역으로 나뉜다.
메서드 영역 (Method Area)
클래스 정보, static 변수, 상수, 메서드 코드 등이 저장된다.
모든 객체가 공유하며 프로그램이 끝날 때까지 유지된다.
힙 영역 (Heap Area)
new 키워드로 생성한 객체와 배열이 저장된다.
GC(Garbage Collector)가 관리하며 참조가 끊긴 객체를 제거한다.
스택 영역 (Stack Area)
메서드 호출 시마다 스택 프레임이 쌓이고, 매개변수·지역 변수·중간 연산값 등이 저장된다.
메서드 실행이 끝나면 해당 스택 프레임은 제거된다.
public class MemoryExample {
public static void main(String[] args) {
int local = 10; // 스택에 저장
Data data = new Data("Hello"); // 참조 변수 data는 스택, 실제 객체는 힙
}
}
class Data {
String msg;
Data(String msg) {
this.msg = msg;
}
}
local : 스택에 저장 data : 스택에 저장된 참조 변수, 힙 객체를 가리킴 msg : Data 객체의 필드이므로 힙에 저장 public class Counter {
public static int count = 0; // 클래스 변수
public String name; // 인스턴스 변수
public Counter(String name) {
this.name = name;
count++;
}
}
Counter a = new Counter("A");
Counter b = new Counter("B");
System.out.println(Counter.count); // 2
public class Calculator {
public static int add(int x, int y) {
return x + y;
}
}
int result = Calculator.add(3, 7);
수학 유틸 클래스 예시를 통해 static 메서드의 장점을 살펴보자.
public class MathArrayUtils {
private MathArrayUtils() {
//private 인스턴스 생성을 막는다.
}
public static int sum(int[] values) {
int total = 0;
for (int value : values) {
total += value;
}
return total;
}
public static double average(int[] values) {
return (double) sum(values) / values.length;
}
public static int min(int[] values) {
int minValue = values[0];
for (int value : values) {
if (value < minValue) {
minValue = value;
}
}
return minValue;
}
public static int max(int[] values) {
int maxValue = values[0];
for (int value : values) {
if (value > maxValue) {
maxValue = value;
}
}
return maxValue;
}
}
클래스명.메서드명() 형식으로 호출한다.