선언위치에 따른 변수의 종류
변수의 종류 | 선언위치 | 생성시기 |
클래스(static) 변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스(instance) 변수 | 인스턴스가 생성되었을 때 | |
지역(local) 변수 | 클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) |
변수 선언문이 수행되었을 때 |
1. 인스턴스 변수
- 클래스 영역에 선언, 클래스의 인스턴스를 생성할 때 만들어진다
- 인스턴스 변수의 값을 읽어 오거나 저장하기 위해서는 먼저 인스턴스를 생성해야함
- 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있음
2. 클래스 변수
- 인스턴스 변수 앞에 static을 붙여 클래스 변수 선언
- 독립적인 저장공간을 갖는 인스턴스 변수와 달리, 클래스 변수는 모든 인스턴스가 공통된 저장공간(변수)을 공유
- 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우, 클래스변수로 선언
- 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있음
- 클래스가 메모리에 '로딩(loading)' 될 때 생성되어 프로그램이 종료될 때 까지 유지
(public을 앞에 붙이면 같은 프로그램 내에서 어디서나 접근할 수 있는 '전역변수'의 성격을 갖는다)
3. 지역 변수
- 메서드 내에 선언되어 메서드 내에서만 사용 가능, 메서드 종료시 소멸되어 사용 불가
JVM의 메모리 구조
1. 메서드 영역 (method area)
프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이 때, 그 클래스의 클래스변수도 이 영역에 함께 생성된다.
2. 힙 (heap)
인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다.
3. 호출스택 (call stack)
호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다. 메서드가 작업을 마치면 할당되었던 메모리공간은 반환되어 비워진다.
메서드
메서드를 사용하는 이유
- 높은 재사용성
- 중복된 코드의 제거
- 프로그램의 구조화
클래스 메서드(static메서드)와 인스턴스 메서드
- 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다
- 생성된 각 인스턴스는 서로 독립적이기 때문에 각 인스턴스의 변수(iv)는 서로 다른 값을 유지한다. 그러나 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여서 클래스변수로 정의해야 한다.
- 클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다
- static이 붙은 변수(클래스 변수)는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문
- 클래스 메서드(static메서드)는 인스턴스 변수를 사용할 수 없다
- 인스턴스 변수는 인스턴스가 반드시 존재해야만 사용할 수 있는데, 클래스 메서드(static이 붙은 메서드)는 인스턴스 생성 없이 호출 가능하므로 클래스 메서드가 호출되었을 때 인스턴스가 존재하지 않을 수도 있다. 그래서 클래스 메서드에서 인스턴스 변수의 사용을 금지한다.
- 인스턴스 변수나 인스턴스 메서드에서는 static이 붙은 멤버들을 사용하는 것이 언제나 가능하다. 인스턴스 변수가 존재한다는 것은 static 변수가 이미 메모리에 존재한다는 것을 의미하기 때문
- 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다
- 메서드의 작업내용 중에서 인스턴스 변수를 필요로 하지 않는다면 static을 붙이는 것이 좋다. 메서드 호출시간이 짧아지므로 성능이 향상된다. static을 안 붙인 메서드(인스턴스 메서드)는 실행 시 호출되어야할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.
cf) 클래스 영역에 선언된 변수를 멤버변수라 한다. 멤버변수는 인스턴스 변수와 static 변수를 모두 통칭하는 말
'JAVA' 카테고리의 다른 글
[JAVA] 다형성과 형변환 (상속과 참조변수, Up-casting, Down-casting) (0) | 2023.01.03 |
---|---|
[JAVA] 가변인자(varargs)와 오버로딩 (0) | 2023.01.03 |
[JAVA] empty()와 isEmpty() (0) | 2022.07.28 |
[JAVA] 컬렉션 프레임웍(Collections Framework) (0) | 2022.07.28 |
[JAVA] 지네릭스(Generics) (0) | 2022.07.28 |
댓글