💻 Java Static(정적) 과 Instance(객체)
🎯 목표 : Static 변수와 메소드를 활용하기 위한 기초를 이해
생활코딩의 강의 예제를 활용
📒Static
Static 변수와 메소드는 모든 객체가 공유하여 하나의 변수와 메소드를 어디서든지 참조 할수 있으며, 해당 클래스에 소속되어 고정된 변수와 메소드.
일반적으로 생성된 클래스는 Static 영역에 할당되고, new 연산자로 생성된 Instance(객체)는 Heap 영역에 할당된다. Heap 영역의 메모리는 Garbage Collector를 통하여 수시로 관리되며 Static 영역의 클래스는 정적으로 프로그램 실행과 종료시 까지 존재한다. Static 영역의 변수와 메소드는, 프로그램이 종료될때까지 메모리에 할당된 채로 존재하여 Static 영역의 데이터가 많아지면, 만들고자 하는 프로그램의 시스템 성능에 악영향을 미칠수 있다.
❗Static 예제
👉 Static 변수와 메소드 선언
class Foo {
//변수
public static String classVar = "I class var";
//method
public static void classMethod() {
System.out.println(classVar);
}
}
👉 Static 변수와 메소드 예제
- Foo Class에서 Static 키워드를 사용하여 생성된 변수와 메소드는 Foo Class 고정 맴버이고 모든 객체가 공유하기에 어디서든지 참조할수 있음.
class Foo {
//변수
public static String classVar = "I class var";
//method
public static void classMethod() {
System.out.println(classVar);
}
}
public class StaticApp {
public static void main(String[] args) {
System.out.println(Foo.classVar);
Foo.classMethod();
}
}
//==================
// 실행시 결과값
// I class var
// classVar
👉 Static 과 Non Static 변수와 메소드 비교
- Static - class method,variable
- Non Static - instance method,variable
- 코드 하단 설명과 그림 참조. 코드의 결과 값은 코드열 오른쪽 주석 처리
class Foo {
//변수
public static String classVar = "I class var";
public String instanceVar = "I instance var"; // Instance를 통해서 사용할수 있게 만든 변수
//method
public static void classMethod() {
System.out.println(classVar); // ok
// System.out.println(instanceVar); ## Error
}
public void instanceMethod() {
System.out.println(classVar);//ok
System.out.println(instanceVar);//ok
}
}
public class StaticApp {
public static void main(String[] args) {
System.out.println(Foo.classVar);
// System.out.println(Foo.instanceVar); ## Error
Foo.classMethod();
// Foo.instanceMethod(); ## Error
// Instance
Foo f1 = new Foo();
Foo f2 = new Foo();
f1.instanceMethod(); //I class var I instance var
f2.instanceMethod(); //I class var I instance var
System.out.println(f1.classVar); // I class var
System.out.println(f1.instanceVar); // I instance var
// 변수 값 변경의 영향
f1.classVar = "changed by f1";
System.out.println(f1.classVar); // changed by f1
System.out.println(Foo.classVar); // changed by f1
System.out.println(f2.classVar); // changed by f1
f1.instanceVar = "changed by f1";
System.out.println(f1.instanceVar); // changed by f1
System.out.println(f2.instanceVar); // I instance var
}
}
- Static 키워드를 사용하여 생성된 변수 classVar와 메소드 classMethod는 Foo Class의 고정된 소속이고, 모든 객체가 공유하므로 어디서든 참조될수 있다.
- Static 키워드 없이 생성된 변수 instanceVar와 메소드 instanceMethod는 Instance(객체)를 필히 생성하여 사용해야되므로 Foo Class내에서 Static 키워드로 생성된 메소드에 참조될수 없고 다른 클래스에서도 Instance(객체)를 생성하지 않으면 참조될수 없다. (위의 코드 주석 부분 중 Error 확인)
- Instance(객체)를 참조변수에 정의(f1,f2)하고 Static 키워드 없이 생성된 변수와 메소드를 호출하게 되면 정상적으로 출력 되는것을 볼수 있다.
- Instance f1 에서 Static 키워드로 생성된 변수의 값을 "changed by f1"으로 변경 하였을때 참조되어 있는 모든 Instance f1,f2의 Static 변수 값이 변경 되며, Foo Class에 고정된 classVar 변수의 값도 변경되는 것을 확인 할수 있다. - Instance에서 Class 변수를 초기화 가능
- Instance f1 에서 Static 키워드 없이 생성된 변수의 값을 "changed by f1"으로 변경 하였을때 Instance f1의 초기화 된변수 값은 변경되지만, f2의 변수의 값은 영향이 없는 것을 확인할수 있다.
- Static 변수, 메소드와 Instance 변수,메소드들이 서로 어떻게 참조,초기화 될수 있는지 아래 그림의 화살표를 보면 이해할수 있다.
'Language > JAVA' 카테고리의 다른 글
Java 기본형 / 참조형 매개변수 (0) | 2022.08.20 |
---|---|
Java Overloading(오버로딩) - OOP (0) | 2022.08.19 |
Java Object, Class, Instance(OOP) (0) | 2022.08.15 |
Java Method(메소드) (0) | 2022.08.13 |
Java Exception(예외)의 처리 (0) | 2022.08.13 |