자바 메모리 구조
- 자바 메모리 구조는 3개로 나뉜다.
- 메소드 영역 : 클래스 정보를 보관하는 영역
- 스택 영역 : 실제 프로그램이 실행되는 영역으로 메소드를 실행할 때마다 하나씩 쌓인다.
- 힙 영역 : 객체가 생성되는 영역으로 new 명령어 사용 시 힙 영역이 사용된다.
- 메소드 영역
- 프로그램을 실행하는데 필요한 공통 데이터를 관리하며 프로그램의 모든 영역에서 공유한다.
- 클래스의 메소드는 코드가 동일하고 필드와 같이 따로 관리할 필요가 없기에 메소드 영역에서 공통으로 관리되고 실행된다.
- 클래스 정보 - 클래스의 실행 코드(바이트 코드), 필드, 메소드와 생성자 코드등 모든 실행 코드가 존재한다.
- static 영역 - static 변수들을 보관한다.
- 런타임 상수 풀 - 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.
- 스택 영역
- 자바 실행 시 (메인 메소드) 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수(매개 변수), 중간 연산 결과, 메소드 호출 정보등을 포함한다.
- 더 정확히 말하면 각 쓰레드 별로 하나의 실행 스택이 생성된다. (실행 스택 수 = 쓰레드 수)
- 스택 프레임 : 스택 영역에 쌓이는 하나 하나를 의미하며 메소드 호출 때마다 쌓이고 메소드 종료 시 스택 프레임이 제거된다.
- 스택 프레임 종료 시 지역 변수도 함께 제거된다.
- 스택 프레임이 모두 종료 시 프로그램이 종료된다.
- 힙 영역
- 객체와 배열이 생성되는 영역으로 GC가 이루어지는 주요 영역으로 더 이상 참조 되지 않는 객체는 GC에 의해 제거된다.
- 힙 영역 외부가 아닌, 힙 영역 안에서만 객체끼리 서로 참조하는 경우에도 GC의 대상이 된다.
- Stack 자료구조
- LIFO, 후입 선출 구조를 가지고 있는 자료 구조
- Queue 자료 구조
- FIFO, 선입 선출 구조를 가지고 있는 자료 구조
Static
- static 변수
- 멤버 변수에 static 키워드를 사용해서 선언하면 static 변수, 정적 변수, 클래스 변수라고 불린다.
- static 변수는 메소드 영역에서 관리한다. ( = 인스턴스에서 공용으로 사용한다.)
- 객체 생성 시 static 변수는 인스턴스 영역에 생성되지 않는다.
- static 변수에 접근 시 클래스명.변수명 으로 접근한다.
- 자신의 클래스에 있는 정적 변수라면 클래스명을 생략할 수 있다.
- 객체명.변수명으로도 접근이 가능하지만 사용하지 않는다.
- 클래스명이 아닌 객체명으로 접근 시 사용하는 입장에서 인스턴스 변수로 오해할 수 있기 때문에
- 클래스 명을 통해 접근하는 것이 더 명확하다.
- 일반 멤버 변수들은 객체 수 만큼 변수가 존재하지만 static 변수는 클래스가 하나이므로 변수도 하나만 존재한다.
- 멤버 변수(필드)의 종류
- 인스턴스 변수 : static이 붙지 않은 멤버 변수
- 인스턴스를 생성해야 사용할 수 있고 인스턴스에 소속되어 있다.
- 인스턴스를 생성할 때마다 인스턴스 변수는 새로 만들어진다.
- 클래스 변수 : static 변수 / 정적 변수 / 클래스 변수라는 용어를 모두 사용한다.
- 인스턴스와 무관하게 클래스에 바로 접근해서 사용할 수 있고 클래스 자체에 소속되어 있다.
- 자바 프로그램 시작 시 클래스 변수는 딱 한 개만 생성된다.
- 여러 곳에서 공유하는 목적으로 사용된다.
- 인스턴스 변수 : static이 붙지 않은 멤버 변수
- 변수의 생명 주기
- 지역 변수(매개 변수 포함) : 스택 영역의 스택 프레임안에 보관된다.
- 메소드 종료 시 스택 프레임이 제거됨과 동시에 지역 변수도 함께 제거된다.
- 인스턴스 변수 : 힙 영역에 보관되며 GC가 발생하기 전까지 생존한다.
- 클래스 변수 : 메소드 영역의 static 영역에 보관된다.
- 해당 클래스가 JVM에 로딩되는 순간 생성되며 JVM 종료 시까지 생존한다.
- 지역 변수(매개 변수 포함) : 스택 영역의 스택 프레임안에 보관된다.
- static 변수가 정적 변수인 이유?
- 인스턴스 변수는 동적으로 생성되고 제거된다.
- 반면 static 변수는 프로그램 실행 시점에 생성되고 프로그램 종료 시점에 제거된다.
- static 메소드
- 클래스 메소드 / 정적 메소드 / static 메소드라 부른다.
- static이 붙은 정적 메소드는 객체 생성 없이 클래스명.메소드명으로 호출할 수 있다.
- 정적 변수와 마찬가지로 객체.메소드명으로 호출할 수 있지만 오해의 여지가 있기에 사용하지 말 것!!
- 불필요한 객체 생성 없이 편리하게 메소드를 사용할 수 있다.
- 객체를 생성하는 이유는 멤버 변수를 사용하려는 목적이 큰데 멤버 변수 없이 메소드(기능)만 제공하는 경우 static 메소드로 선언해서 객체 생성 없이 사용하면 편하다.
- 보통 유틸리티성 메소드에 자주 사용한다.
ex) 인스턴스 변수 없이 입력한 값을 계산하고 반환하는 메소드
- 클래스 내부 기능을 사용할 때 정적 메소드 / 클래스 메소드 / static 메소드는 static이 붙은 정적 메소드나 정적 변수만 사용할 수 있다.
- 정적 메소드는 인스턴스 변수나 인스턴스 메소드를 사용할 수 없다.
- 반대로 모든 곳에서는 static을 호출할 수 있다.
- 정적 메소드는 공용 기능이기에 모든 곳에서 호출할 수 있다.
- 멤버 메소드의 종류
- 인스턴스 메소드 : static이 붙지 않은 멤버 메소드는 인스턴스를 생성해야 호출할 수 있기에 인스턴스 메소드라 부른다.
- 클래스 메소드 : static이 붙은 멤버 메소드
- 클래스 메소드, 정적 메소드, static 메소드라고 부른다.
- 정적 메소드가 인스턴스 변수 / 메소드를 사용할 수 없는 이유?
- 인스턴스 변수, 메소드를 사용하려면 객체의 참조 값을 알아야 접근할 수 있는데 정적 메소드는 참조 값 없이 호출되기 때문에 정적 메소드 내에서 인스턴스 변수, 메소드를 사용할 수 없다.
- 만약 매개 변수로 참조 값을 받는 경우에는 인스턴스 변수, 메소드를 호출할 수 있다.
- 객체를 생성하지 못하도록 하는 방법?
- 생성자를 private으로 선언하면 객체를 생성하지 못하도록 막을 수 있다.
- 그렇다면 왜 객체를 생성하지 못하도록 막는가?
- static 메소드, 변수만 존재하는 클래스의 경우 객체 생성을 할 필요 없이 메소드에 접근할 수 있기 때문에 실수로 객체를 생성하지 못하게, 용도에 맞게 사용하도록 제약을 하기 위함.
- static import
- static 메소드를 많은 곳에서 사용하는 경우 기본 import와 같이 static import로 선언하면 해당 패키지의 클래스 내 메소드들을 사용할 때 클래스명을 생략하고 메소드명으로만 호출할 수 있다.
- main() 메소드
- 인스턴스 생성 없이 실행하는 가장 대표적인 static 메소드
- 프로그램을 시작하는 시작점 역할을 한다.
- 프로그램의 시작점이므로 객체를 생성해줄 곳이 없기에 main() 메소드는 객체 생성 없이 호출할 수 있는 static 메소드로 선언되어 있는 것이다.
- 정적 메소드인 main() 메소드에서 호출하는 메소드는 정적 메소드로 선언해서 사용한다.
- 정적 메소드는 정적 메소드만 호출할 수 있기 때문에
출처:[인프런 김영한 실전 자바 - 기본편]
김영한의 실전 자바 - 기본편 강의 | 김영한 - 인프런
김영한 | 실무에 필요한 자바 객체 지향의 핵심 개념을 예제 코드를 통해 쉽게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문
www.inflearn.com
'Java > [인프런 김영한 실전 자바 - 기본편]' 카테고리의 다른 글
[인프런 김영한 실전 자바 - 기본편] 상속 (0) | 2024.07.16 |
---|---|
[인프런 김영한 실전 자바 - 기본편] final (0) | 2024.07.16 |
[인프런 김영한 실전 자바 - 기본편] 접근 제어자 (0) | 2024.07.16 |
[인프런 김영한 실전 자바 - 기본편] 패키지 (0) | 2024.07.15 |
[인프런 김영한 실전 자바 - 기본편] 생성자 (0) | 2024.07.15 |