[객체지향 프로그래밍] 변수와 메서드
by mignon25오늘 배운 것을 나에게 설명해주기.
변수의 종류와 선언위치
변수는 클래스변수, 인스턴스변수, 지역변수 모두 세 종류가 있다.
변수의 종류를 결정짓는 중요한 요소가 '변수가 선언된 위치' 이므로 각각의 변수가 어느 영역에 선언되는지를 파악하자.
class Example { // => 클래스 영역
int instanceVariable; // 인스턴스 변수 // 필드
static int classVariable; // 클래스 변수(static 변수, 공유변수) // 필드
void method() { // => 메서드 영역
int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
}
}
멤버(필드, 메서드, 이너 클래스) 중 필드에 속하는 인스턴스변수와 클래스변수를 멤버 변수라고도 한다.
- 인스턴스 변수(instance variable)
- 클래스 영역에 선언
- 클래스의 인스턴스를 생성할 때 만들어진다.
=> 인스턴스가 생성된 후에 인스턴스변수의 값을 사용할 수 있다. - 인스턴스별로 서로 다른 값을 가질 수 있다.
- 인스턴스는 독립적인 저장공간을 가지기 때문
- 인스턴스마다 고유한 상태를 유지해야 하는 속성의 경우 인스턴스변수로 선언
- 클래스 변수(class variable)
- 인스턴스변수 앞에 static만 붙이면 클래스 변수
- 클래스가 메모리에 로딩(loading)될 때 생성되어 프로그램이 종료될 때까지 유지된다.
- public 을 붙이면 같은 프로그램 내 어디서나 접근할 수 있는 전역변수의 성격을 갖는다.
- 모든 인스턴스가 공유하는 값.
- 클래스 변수는 모든 인스턴스가 공통된 저장공간(변수)를 공유한다.
- 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야 하는 속성의 경우 클래스 변수로 선언
- 인스턴스를 생성하지 않고도 바로 사용할 수 있다.
- 클래스이름.클래스변수 와 같은 형식으로 사용.
- 지역 변수(local variable)
- 메서드 내에 선언되어 메서드 내에서만 사용 가능
- 메서드가 종료되면 소멸되어 사용할 수 없게 된다.
클래스 변수에 인스턴스에서 접근하는 방식으로 접근할 수도 있지만
- 클래스이름.클래스변수
- 인스턴스이름.클래스변수
클래스변수를 인스턴스변수로 오해하기 쉬우므로 클래스이름.클래스변수 의 형태로 사용하는 것이 좋다.
어느 한 인스턴스에서 클래스변수의 값을 바꾸면 모든 인스턴스에서의 클래스변수값이 바뀌게 된다.
메서드
- 메서드를 사용했을 때의 이점
- 높은 재사용성(reusability)
- 중복 코드의 제거
- 프로그램의 구조화
JVM의 메모리 구조
클래스와 인스턴스의 변수나 메서드의 동작 방식을 이해하려면 JVM메모리 구조에 대한 이해가 필요하다.
응용프로그램이 실행될 때,
JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고,
JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
JVM의 3가지 주요 영역 - Method area, Call stack, heap

- 메서드 영역(method area)
- 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 클래스파일(*.class)을 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장
- 클래스 변수(class variable)도 메서드 영역에 생성된다.
- 힙(heap)
- 인스턴스가 생성되는 공간
- 인스턴스 변수(instance variable)들도 힙 영역에 생성된다.
- 호출스택(call stack 또는 execution stack)
- 메서드의 작업에 필요한 메모리 공간 제공
- 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.
- 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다.
- 메서드가 수행을 마치면 사용했던 메모리를 반환하고 스택에서 제거된다.
- 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.
- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.
클래스 메서드(static 메서드)와 인스턴스 메서드
static이 붙어 있으면 클래스 메서드, 붙어 있지 않으면 인스턴스 메서드
클래스 메서드도 객체를 생성하지 않고 클래스이름.메서드이름(매개변수) 의 형태로 호출이 가능하다.
위의 내용은 변수와의 공통점이다.
그런데 JVM 메모리 구조를 살펴봤을 때 인스턴스변수와 클래스변수의 저장위치는 다르지만,
메서드는 모두 메서드 영역에 저장되고 모든 인스턴스는 메서드 영역에서의 해당 메서드 위치를 가리키는 참조값만 가질 뿐이다.
어짜피 메서드 영역에 저장되고 저장된 하나의 메서드를 모든 인스턴스가 공유하는데 클래스 메서드와 인스턴스 메서드는 무슨 차이가 있는 걸까?
=> 메서드에서 참조하는 변수의 종류에 따라 구분된다.
- 인스턴스 메서드
- 인스턴스 변수와 관련된 작업을 하는 메서드.
- 즉, 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 한다.
- 인스턴스 변수는 인스턴스(객체)를 생성해야만 만들어지므로 인스턴스 메서드 역시 인스턴스를 생성해야만 호출할 수 있다.
- 클래스 메서드
- 인스턴스와 관계없는 메서드를 클래스 메서드(static 메서드)로 정의한다.
- 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드
- 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려하자.
- 메서드 호출시간이 짧아지므로 성능이 향상된다.
- 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드를 인스턴스 메서드로 생성할 수도 있다. 그렇지만 인스턴스 메서드는 실행 시 호출되어야 할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.
클래스 멤버와 인스턴스 멤버 간의 참조와 호출
인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만,
클래스 멤버가 존재하는 시점에 인스턴스 멤버는 존재하지 않을 수도 있다.
- 클래스 멤버
- 클래스 멤버 참조, 호출 가능
- 인스턴스 멤버를 참조, 호출 하려면 -> 인스턴스 생성 후 가능
- 인스턴스 멤버
- 클래스 멤버 참조, 호출 가능
- 인스턴스 멤버 참조, 호출 가능
(인스턴스 멤버가 존재한다는 것은 인스턴스가 이미 생성되었다는 것을 의미)
'Java' 카테고리의 다른 글
| 클래스의 상속(inheritance) (0) | 2023.02.24 |
|---|---|
| 오버로딩(overloading), 생성자(Constructor), 초기화 블럭(initialization block) (0) | 2023.02.23 |
| 객체지향 프로그래밍 공부를 시작하며... (0) | 2023.02.21 |
| 배열을 복사하는 방법들 (0) | 2023.02.20 |
| Java 연산자 주의사항 (0) | 2023.02.18 |
블로그의 정보
Mignon'S Dev Log
mignon25