선언위치에 따른 변수의 종류
인스턴스 변수
각 인스턴스의 개별적인 저장공간 인스턴스마다 다른 값 저장이 가능하다.
인스턴스 생성 후 '참조변수. 인스턴스변수명'으로 접근
인스턴스를 생설할 때 생성되고, 참조 변수가 없을 때 가비지컬렉터에 의해 자동제거됨.
클래스 변수
같은 클래스에서 공유하는 변수이다. 즉, 같은 클래스의 모든 인스턴스들이 공유하는 변수.
인스턴스 생성없이 '클래스이름. 클래스변수명'으로 접근할 수 있다.
클래스가 로딩될 때 생성되고 프로그램 종료될 때 소멸한다.
지역 변수
메서드 내에 선언되며, 메서드의 종료와 함께 소멸한다. 메서드뿐만 아니라 반복문내의 변수들도 지역변수이다.
조건문, 반복문의 블럭{} 내에 선언된 지역변수는 블럭을 벗어나면 소멸한다.
인스턴스 변수와 클래스 변수
인스턴스 변수는 평범하게 타입 변수이름으로 선언할 수 있고,
클래스 변수는 'static'이라는 키워드를 붙여 선언한다.
class Data{
static int classVariable; //클래스변수 static
int x; //인스턴스변수
}
위 코드처럼 변수타입 앞에 static을 사용하면 클래스변수가 되는 것이다.
class MethodAssignment{
public static void main(String[] args){
Data d = new Data();
Data d2 = new Data();
d.x = 1;
d2.x = 5;
System.out.println("d.x = "+d.x);
System.out.println("d2.x = " + d2.x);
d.x = 300;
System.out.println("d.x = "+d.x);
System.out.println("d2.x = " + d2.x);
Data.classVar = 880;
System.out.println("d.classVar = "+d.classVar);
System.out.println("d2.classVar = " + d2.classVar);
System.out.println("Data.classVar = "+Data.classVar);
}
}
class Data{
int x;
static int classVar;
}
클래스변수에 접근할 때는 클래스.클래스변수명으로 접근한다.
클래스변수는 같은 클래스의 모든 인스턴스에 공유된다. 즉, 참조값이 다른 인스턴스든 다 상관없이 클래스변수 값을 변경하면 class에 있는 classVar의 값이 변경되는 것이다.
참조형 변수와 기본형 변수
class Main{
public static void main(String[] args){
Data d = new Data();
d.x = 10;
System.out.println("d.x = " + d.x);
d.changeVariable(d.x);
System.out.println("d.x = " + d.x);
}
}
class Data{
int x;
void changeVariable(int x){
x = 5000;
}
}
class Main{
public static void main(String[] args){
Data d = new Data();
d.x = 10;
System.out.println("d.x = " + d.x);
d.changeVariable(d);
System.out.println("d.x = " + d.x);
}
}
class Data{
int x;
void changeVariable(Data d){
d.x = 5000;
}
위 두개의 코드는 당연할 수 있지만 첫 번째 코드는 changeVariable의 매개변수(Parameter)가 int형이다. 인자값으로 d.x를 보냈다.
Java에서 기본형 변수(int, double, boolean 등)를 메서드 매개변수에 전달하면, 값의 복사본이 생성되어 메서드에 전달되는 것이다.
Java의 대원칙 = 연산 값을 복사해서 전달하는 것이다.
d.x의 값인 10을 복사해서 매개변수 x에 전달되는 것이다. 이후, 메서드 내부에서 x=5000;으로 값을 변경해도 복사본 변수에만 적용된다. 즉, 원래 객체 d.x는 영향을 안 받는다.
반대로 밑에 코드는 Parameter로 Data d 즉, 참조형 변수로 받는다.
d.x는 기본형이므로 참조형으로 매개변수를 전달 못하니 참조변수 d를 매개변수에 보낸다.
d는 인스턴스값(주소값)을 지니고 있다. 주소값을 복사해서 전달하는 것이다.
여기서 복사한 주소값이나 원래 주소값 모두 같은 객체를 가리킨다.
같은 객체를 가리키므로 복사한 주소값으로 변경하든 원래 주소값으로 값을 변경하는 객체를 통해 값이 변경되므로 영향을 미치는 것이다.
정리하자면
기본형 매개변수(int, double 등): 변수의 값을 읽기만 할 수 있다. (read only)
참조형 매개변수(Data, 클래스이름 등): 변수의 값을 읽고 변경할 수 있다. (read & write)
나중에 기본형과 참조형에 대해서 더 공부해 정리해보자.
'Java > OOP' 카테고리의 다른 글
[OOP] 다형성에 대해서 (0) | 2025.03.24 |
---|---|
[OOP] 캡슐화 Encapsulation (0) | 2025.01.05 |
절차 지향 프로그래밍VS객체 지향 프로그래밍 (1) | 2024.11.20 |
[Java] Argument로 참조값을 보내면? (0) | 2024.11.16 |
[Java] 기본형vs참조형 (4) | 2024.11.15 |