변수의 종류
변수의 선언된 위치에 따라 멤버변수와 지역변수로 나뉘고 멤버변수 중 static이 붙은 것은 클래스변수(static변수, 공유변수), 붙지 않은 것은 인스턴스변수이다.
class Person {
int age; // 인스턴스 변수
static int countryCode; // 클래스 변수
void isPretty(){
boolean goodLooking = true; // 지역변수
}
}
인스턴스 변수, 클래스 변수
인스턴스변수와 클래스변수는 모두 클래스 영역에서 선언된다.
인스턴스변수
- 클래스의 인스턴스를 생성할 때 만들어진다.
- 인스턴스마다 독립적인 저장공간을 가지므로 인스턴스마다 서로 다른 값을 가질 수 있다.
클래스변수
- 클래스가 메모리에 올라갈 때 생성되며 프로그램이 종료될 때까지 유지된다.
- 모든 인스턴스가 공통된 저장공간(변수)를 공유하므로 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우 클래스변수로 선언한다.
- 인스턴스를 생성하지 않아도 '클래스이름.클래스변수'와 같은 형식으로 사용한다.
- public을 붙이면 프로그램 내 어디서나 접근 가능한 전역변수(global variable)로 사용하 수 있다.
[핵심내용]
인스턴스 변수
> 인스턴스가 생성될 때마다 생성되므로, 인스턴스마다 각기 다른 값을 유지할 수 있다.
클래스 변수
> 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.
public class ExampleJAVA {
public static void main(String[] args) {
System.out.println("K자동차 최대속도 = " + K_Car.maxSpeed); // 클래스 변수는 객체 생성 없이 사용가능!
System.out.println("K자동차 제로백= " + K_Car.zero100); // 클래스이름.클래스변수 로 직접 사용한다.
K_Car k3 = new K_Car();
k3.model = "22년도k3";
k3.price = 1700;
K_Car k5 = new K_Car();
k5.model = "22년도k5"; //인스턴스 변수의 값을 변경
k5.price = 2300;
System.out.println(k3.toString());
System.out.println(k5.toString());
k5.maxSpeed = 300; //클래스변수의 값을 변경
k5.zero100 = 4;
System.out.println(k3.toString());
System.out.println(k5.toString());
}
}
class K_Car{
String model;
int price;
static int maxSpeed = 250;
static int zero100 = 6;
@Override
public String toString() {
return "K_Car{" +
"모델='" + model + '\'' +
", 가격=" + price + '\'' +
", maxSpeed=" + maxSpeed + '\'' +
", 제로백=" + zero100 +
'}';
}
}
각 자동차별로 모델연식과 가격을 가진다고 설정하여 인스턴스 변수를 선언하고,
최대 속도와 제로백의 제한은 모든 자동차에 공통적으로 설정되는 가정을 하여 클래스 변수를 사용하였습니다.
K_Car의 클래스변수는 '클래스이름.클래스변수'와 같은 방식으로 사용이 가능합니다. 인스턴스인 k3와 k5는 클래스 변수를 공통적으로 사용하기 때문에 k3의 최대 속도와 제로백을 변경해도 k5도 적용이 된다.
근데 사실 사용할 때 k3.maxSpeed 같이 객체 인스턴스가 클래스 변수를 사용할 수는 있지만 권장하지는 않는다.
ide에서도 자동완성을 시켜주지도 않을뿐더러 인스턴스 변수로 오해하기 쉽기 때문이다.
[핵심결론]
클래스에서 공통된 속성을 가진다고 생각되면 클래스 변수로,
각각 독립된 값을 가지면 인스턴스 변수를 사용하면 됩니다!
지역 변수
메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 소멸된다.
for문, while문, if문 등 블럭 내에 선언된 지역변수는 블럭을 벗어나면 소멸되어 사용할 수 없게 된다.
'개인공부' 카테고리의 다른 글
객체지향 4가지 특징 정리 (OOP) (0) | 2022.12.12 |
---|---|
메서드 (Method) 정리 (0) | 2022.12.10 |
클래스 / 객체 / 인스턴스 정리 (0) | 2022.12.06 |
2022.12.06 TIL (hibernate naming) (0) | 2022.12.06 |
2022.12.06 TIL (0) | 2022.12.06 |
댓글