위치(영역)에 따라 나뉘게 되는 변수의 종류
클래스 변수, 인스턴스 변수, 지역 변수는 선언 된 그 위치(영역)에 따라 나뉘게 됩니다.
1
2
3
4
5
6
7
8
|
class Variable {
int InstanceVariable;
static int ClassVariable;
void ExampleMethod() {
int LocalVariable = 10;
}
}
|
cs |
다음과 같이 Variable 이라는 변수 클래스를 정의하였습니다. 이때, static이 붙지 않은 클래스 영역 내의 변수는 인스턴스
변수라고 하고, static이 붙은 클래스 영역 내의 변수는 클래스 변수라고 합니다. 메서드 영역 내의 변수는 지역변수라고
합니다. 먼저 메서드 영역 내의 지역변수는 해당 메서드 내에서만 유효합니다. 따라서 유효 범위(Scope)는 해당 메서드의
시작과 동시에 메서드의 끝이라고 할 수 있습니다. (위 코드를 기준으로 5행부터 7까지 유효)
인스턴스 변수는 객체가 생성되었을 때 존재하게 되는 변수입니다. 인스턴스가 무엇인지를 알고 있다면 당연하게 받아
들이실 수 있으리라 생각합니다.
* 참고) 객체가 참조변수에 의해 더이상 해당 주소를 가리키지 않어 사용되지 않으면, 가비지 컬렉션(Garbage Collection)에 의해서 메모리
낭비 방지를 위해 자동으로 제거됩니다.
클래스 변수는 클래스를 필요로 할때에 메모리에 올라가면서 자동으로 생성되는 변수입니다. (// 부분은 당장 이해가 되
지 않는다면 우선 넘어가시기 바랍니다!) / CPU는 설계도로 사용하기 위해 Refrigerator.class라는 파일을 읽으려고 합
니다. 이때 HDD, SSD 등과 장치에서 속도의 차이로 인해 직접 읽어 들이지 못하고 메모리(RAM)에 올라오게 되는데 이
때 이 과정에서 자동으로 클래스 변수가 생성됩니다. /
따라서, 인스턴스 변수는 객체 생성을 필요로 하고, 클래스 변수는 객체 생성을 필요로 하지 않는다는 차이가 있습니다.
클래스 변수와 인스턴스 변수의 차이
예를 들어, 여러 장의 카드들을 인스턴스화 한다고 가정해보겠습니다. 이때, 카드마다 공통적으로 가져야 할 속성(변수)
은 가로 길이와 세로 길이가 있고, 카드마다 다르게 가져야 할 속성(변수)에는 숫자와 모양 같은 것들이 있을 것입니다.
카드마다 다르게 가져야 할 속성(변수)들은 인스턴스 변수로 지정하고, 공통적으로 가져할 속성(변수)들은 클래스 변수로
지정해야 할 것입니다. 그 이유는 각 객체마다 주소값을 가리키게 되므로, 객체마다의 인스턴스 변수들을 통해 객체마다
다르게 지정해줄 수 있기 때문입니다. 반대로 클래스 변수들은 한 저장 공간에서만 존재하게 되므로 공유되는 속성들은
클래스 변수로 지정하면 될 것입니다. 그렇다면 여기서 "클래스 변수들은 객체 내에 존재하지 않고 왜 따로 한 저장 공간
에서 존재하는가?"에 대한 궁금증이 생길 수 있습니다. 그 이유는 공유된다는 변수의 특성상 값을 하나로 유지할 필요가
있고, 모두 같은 값을 공유하므로 메모리 공간을 더 사용하여 낭비할 필요가 없기 때문입니다.
* 참고) 클래스 변수는 클래스명을 참조변수를 통해 사용될 수는 있으나 인스턴스 변수와의 구분을 위해서 권장되지 않
고 직접 다음과 같이 클래스명을 붙이는 것을 권장 ex) Card.width
요약 및 코드
클래스 영역 내의 변수
1. 인스턴스 변수 : 객체가 생성되면서 존재, 객체마다 다르게 가져할 속성들을 지정할 때 쓰임
2. 클래스 변수 : 객체의 생성과 별개로 자동 존재, 객체마다 공유해야 할 속성들을 지정할 때 쓰임
메서드 영역 내의 변수
지역 변수 : 메서드 시작과 끝에서만 유효
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
class Card {
int number; // 인스턴스 변수(카드 숫자)
String pattern; // 인스턴스 변수(카드 모양)
static int width = 50; // 클래스 변수(폭)
static int height = 100; // 클래스 변수(높이)
}
public class Exam02 {
public static void main(String[] args) {
System.out.println(Card.width); // 클래스 변수는 객체를 생성하지 않고도 사용 가능
System.out.println(Card.height);
Card firstCard = new Card(); // 인스턴스 변수는 객체를 생성해야 사용 가능
firstCard.number = 1;
firstCard.pattern = "heart";
Card SecondCard = new Card();
SecondCard.number = 2;
SecondCard.pattern = "spade";
System.out.println("첫 번째 카드의 정보 : " + firstCard.number + ", " + firstCard.pattern);
System.out.println("두 번째 카드의 정보 : " + SecondCard.number + ", " + SecondCard.pattern);
}
}
|
cs |
'java > 객체지향' 카테고리의 다른 글
5-1. (보충)메서드 return문 (0) | 2023.01.13 |
---|---|
5. 메서드(Method) 정의와 호출 (2) | 2023.01.13 |
3. 클래스의 다양한 측면 (0) | 2023.01.13 |
2-1. (보충) 객체 배열 (0) | 2023.01.12 |
2. 객체 생성 및 사용 (0) | 2023.01.12 |