Java 메모리 구조
- 메서드 영역 : 클래스 정보 보관
- 스택 영역 : 실제 프로그램이 실행되는 영역. 메서드를 실행할 때마다 하나씩 쌓임.
- 힙 영역 : 객체가 생석되는 영역 -> new 명령어를 사용하여 이 영역 사용 ex) A a = new A();
- 메서드 영역 : 이 영역은 프로그램을 실행하는 데 필요한 공통 데이터를 관리. 이 영역은 프로그램의 모든 영역에서 공역
- 클래스 정보 : 클래스의 실행 코드, 리드, 메서드와 생성자 코드 등 모든 실행 코드 존재
- static 영역 : static 변수들을 보관. - 스택 영역 : 자바 실행 시 , 하나의 실행 스택 생성. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함.
- 힙 영역 : 객체와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)이 이루어지는 주요 영역이다.
스택과 큐 자료 구조
스택(Stack) 구조 : 후입 선출. 1(넣기) -> 2(넣기) -> 3(넣기) -> 3(빼기) - > 2(빼기) - > 1(빼기)
큐 구조(Que) : 선입 선출. 1(넣기) -> 2(넣기) - > 3(넣기) - > 1(빼기) -> 2(빼기) -> 3(빼기) *알바 당시 음료수 넣을 때.
중요한 것은 스택 ! 프로그램 실행과 메서드 호출에는 스택 구조가 적합
why?
:가장 최근에 호출된 메서드를 먼저 완료하고 이전 메서드로 돌아가는 순서가 스택의 후입선출(LIFO) 특성과 정확히 일치하기 때문.
정리 :
- 자바는 스택 영역을 사용해서 메서드 호출과 지역 변수(매개변수 포함)를 관리한다. 메서드를 계속 호출하면 스택 프레임이 계속 쌓인다.
- 지역 변수(매개변수 포함)는 스택 영역에서 관리한다.
- 스택 프레임이 종료되면 지역 변수도 함께 제거된다.
- 스택 프레임이 모두 제거되면 프로그램도 종료된다.
스택 영역과 힙 영역
지역 변수는 스택 영역에, 객체(인스턴스)는 힙 영역에 관리되는 것.
이제 나머지 하나가 남았다. 바로 메서드영역이다.
메서드 영역이 관리하는 변수도 있다. 이것을 이해하기 위해서는 먼저 static 키워드를 알아야 한다.
static 키워드는 메서드 영역과 밀접한 연관이 있다.
Static 변수
Static 변수는 쉽게 이야기해서 클래스인 붕어빵 틀이 특별히 관리하는 변수! 붕어빵 틀은 1개이므로, 클래스 변수도 하나만 존재한다.
반면에 인스턴스인 붕어빵은 인스턴스의 수만큼 변수가 존재한다.
코드로 살펴보자 !
package static1;
public class Data3 {
public String name;
public static int count; //static
public Data3(String name) {
this.name = name;
count++;
}
}
package static1;
public class DataCountMain3 {
public static void main(String[] args) {
Data3 data1 = new Data3("A");
System.out.println("A count = " + Data3.count);
Data3 data2 = new Data3("B");
System.out.println("B count = " + Data3.count);
Data3 data3 = new Data3("C");
System.out.println("C count = " + Data3.count);
}
}
count는 정적(static) 변수 또는 클래스 변수 ->하나만 존재!
name은 각 객체마다 별도로 존재하는 인스턴스 변수 -> 인스턴스의 수만큼 존재!
*변수 개념이 혼동되면 과거 내가 정리한 글 보면서 공부 다시하자!
https://soo-develop.tistory.com/7
쉽게 말해, 내가 이해한 바로는 Data3이 말한다 가정하면
"야 니네 객체들! 나(Data3 클래스)를 참조할 거면 name은 각각 써도 되는데 count는 공용으로 써라!" 느낌 ?ㅋ (오글 거려유 ㅎ)
Static 메서드
클래스 메서드
메서드 앞에서도 static을 붙일 수 있다. 이것을 정적 메서드 또는 클래스 메서드라 한다.
변수의 개념과 마찬가지로 클래스 메서드는 인스턴스 생성 없이 마치 클래스에 있는 메서드를 바로 호출하는 것처럼 느껴짐.
인스턴스 메서드
static이 붙지않은 메서드는 인스턴스를 생성해야 호출할 수 있다. 이것을 인스턴스 메서드라 한다.
* 변수자체와 static 자체의 개념은 비슷하다 .
정적 메서드는 객체 생성없이 클래스에 있는 메서드를 바로 호출할 수 있다는 장점이 있다.
하지만 정적 메서드는 언제나 사용할 수 있는 것이 아님
정적 메서드 사용법
static 메서드는 static 만 사용할 수 있다.
클래스 내부의 기능을 사용할 때, 정적 메서드는 static 이 붙은 **정적 메서드나 정적 변수만 사용할 수 있 다.
클래스 내부의 기능을 사용할 때, 정적 메서드는 인스턴스 변수나, 인스턴스 메서드를 사용할 수 없다.
반대로 모든 곳에서 static 을 호출할 수 있다.
정적 메서드는 공용 기능이다. 따라서 접근 제어자만 허락한다면 클래스를 통해 모든 곳에서 static 을 호 출할 수 있다.

정적 메서드가 인스턴스의 기능을 사용할 수 없는 이유
정적 메서드는 클래스의 이름을 통해 바로 호출할 수 있다. 그래서 인스턴스처럼 참조값의 개념이 없음!
특정 인스턴스의 기능을 사용하려면 참조값을 알아야 하는데, 정적 메서드는 참조값 없이 호출한다. (클래스를 통해 바로 호출)
따라서 정적 메서드 내부에서 인스턴스 변수나 인스턴스 메서드를 사용할 수 없다.
다만 객체의 참조값을 직접 매개변수로 전달하면 인스턴스 호출 가능!
public static void staticCall(DecoData data) {
data.instanceValue++;
data.instanceMethod();
}
결론 :
Java의 메모리 구조를 통해 변수와 메서드가 어디에 저장되고 어떻게 동작하는지 이해할 수 있었고,
static을 활용해 메모리를 효율적으로 관리하는 방법과 유틸리티 기능을 구현하는 방법을 배웠다.
오늘 배웠다고 휘발성으로 끝내지말고 항상 복습하며 더 효과적인 코드 작성의 밑바탕을 단단히 다지도록 노력해야겠다.
너무 배가고파유..🤯
'Language > ☕ Java' 카테고리의 다른 글
[Java] 상속 (0) | 2024.08.12 |
---|---|
[Java] 반복문(for) (2) | 2024.08.08 |
[Java] 접근 제어자 (0) | 2024.08.07 |
변수란? (전역 변수,매개변수, 인스턴스 변수, 클래스 변수) (0) | 2024.05.23 |
자주 나오는 프로그래밍 용어 정리 (클래스, 객체, 메서드, 인스턴스, 생성자.. etc) (0) | 2024.04.25 |