(2021.01.23)
생각보다 6장의 내용이 많아서 3개로 나누어서 업로드 했다.
이번에는 변수, 메서드, JVM의 메모리구조에 대해 공부하고, 정리했다.
참고도서: 자바의 정석
| 변수
자바에서 변수는 클래스변수, 인스턴스변수, 지역변수 이렇게 3가지 종류가 있다.
변수의 종류를 결정하는 중요한 요소는 '변수의 선언된 위치'이다.
멤버변수를 제외한 것은 모두 지역변수,
멤버변수 중 static 이 붙은 것은 클래스변수,
멤버변수 중 static 이 붙지 않은 것은 인스턴스 변수이다.
iv 와 cv 는 클래스 영역에 선언 되어있기 때문에 멤버변수이다.
cv 는 static 이 붙어있기 때문에 클래스변수이고,
iv 는 static 이 붙어있지 않기 때문에 인스턴스변수이다.
lv는 메서드 영역에 선언되어 있기 때문에 지역변수이다.
변수의 종류 | 선언위치 | 생성시기 |
클래스변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스변수 | 인스턴스가 생성되었을 때 | |
지역변수 | 클래스 영역 이외의 영역 (메서드 , 생성자. 초기화 블럭 내부) |
변수 선언문이 수행되었을 때 |
1. 인스턴스변수 (instance variable)
인스턴스변수는 독립적인 저장공간을 가지기 때문에 서로 다른 값을 가질 수 있다.
인스턴스마다 고유한 상태를 유지해야할 경우, 인스턴스변수로 선언한다.
2. 클래스변수 (class variable)
클래스변수는 모든 인스턴스가 공통된 저장공간을 가진다.
한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 경우, 클래스변수로 선언한다.
3. 지역변수 (local variable)
메서드 내에 선언되어 메서드 내에서만 사용가능하고, 메서드가 종료되면 사용할 수 없다.
for/while 문 내에 선언되면, 선언된 블럭{ } 내에서만 사용가능하다.
| 메서드
c언어에서의 함수와 비슷한 개념이다.
메서드의 장점은
1. 높은 재사용성
2. 중복된 코드의 제거
3. 프로그램의 구조화 이다.
위처럼 메서드를 선언했다면, int ans = add ( 1, 2 ) ; 와 같이 메서드를 호출할 수 있다.
| JVM의 메모리 구조
메서드 영역
- 프로그램 실행 중에 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일을 읽고 클래스 데이터를 메서드영역에 저장한다. 클래스의 클래스변수가 메서드영역에서 생성된다.
호출스택
- 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되고, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용된다. 메서드가 작업을 마치면 할당되었던 메모리 공간을 반환되어 비워진다.
힙
- 인스턴스가 생성되는 공간이다. 인스턴스변수가 힙에서 생성된다.
메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.
메서드가 수행을 마치고 나면 메모리를 반환하고, 스택에서 제거된다.
호풀스택의 가장 위에 있는 메서드가 현재 실행 중인 메서드이다.
아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.
| 클래스 메서드와 인스턴스 메서드
1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에는 static 을 붙인다.
2. 클래스 변수(static 변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
3. 클래스 메서드(static 메서드)는 인스턴스 변수를 사용할 수 없다.
4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static 을 붙이는 것을 고려한다.
▷ 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 보고, 있다면 static 을 붙인다.
▷ 작성한 메서드 중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드에 static 붙인다.
'Coding > Java' 카테고리의 다른 글
[Java] 객체지향언어 (3) - 상속 (3) | 2021.01.30 |
---|---|
[Java] 백준 2869번: 달팽이는 올라가고 싶다 (0) | 2021.01.24 |
[Java] 객체지향언어 - (1) 클래스, 객체, 인스턴스 (1) | 2021.01.22 |
[Java] String 배열, 다차원 배열 (1) | 2021.01.17 |
[Java] 커맨드 라인을 통해 입력받기 (이클립스) (0) | 2021.01.17 |