쉽게 배우는 JAVA2-2(Class& Instance)
"이 글은 글쓴이가 부스트코스에 쉽게 배우는 JAVA2를 통해 배운 점을 기록하는 공간입니다."
Class를 어떤 사물을 찍어내는 틀이라고 가정한다면 Instance는 틀로 찍어낸 복제품이라고 할 수 있다.
사물을 찍어내는 틀의 형식을 바꾼다고 하면 본질이 바뀔 것이고 이 틀(Class)을 사용하여 만든 모든 복제품(Instance)의 본질 또한 변경될 것 이다. 만약에 복제품 중 몇 개의 특징만 바꾸고 싶다고 생각하면 어떻게 해야할까? 바로 Java에서 그 기능을 해주는 것이 Static키워드 이다.
각 메소드와 변수를 "클래스 혹은 인스턴스 중 어느 소속을 할 것인가"를 정할 수 있다.
public static String classVar = "I class bar";
와 같이 static을 붙여주면 Class의 소속이 되는 변수 혹은 메소드가 되는 것이고
public String instanceVar = "I instance bar;
와 같이 static을 붙여주지 않으면 Instance의 소속이 되는 것이다.
class Foo{
public static String classVar = "I class bar";
public String instanceVar = "I instanc bar";
public static void classMethod() {
System.out.println(Foo.classVar); //OK
//System.out.println(instanceVar); // Error
}
public void instanceMethod() {
System.out.println(classVar);
System.out.println(instanceVar);
}
}
public class StaticApp {
public static void main(String[] args) {
System.out.println(Foo.classVar); // OK
// System.out.println(Foo.instanceVar); //Error
Foo.classMethod();
//Foo.instanceMethod(); Error
Foo foo1 = new Foo();
Foo foo2 = new Foo();
System.out.println(foo1.classVar);
System.out.println(foo1.instanceVar);
foo1.classVar =" changed by f1";
System.out.println(Foo.classVar);
System.out.println(foo2.classVar);
foo1.instanceVar = "changed by f1";
System.out.println(foo1.instanceVar);
System.out.println(foo2.instanceVar);
}
}
결과값
I class bar
I class bar
I class bar
I instanc bar
changed by f1
changed by f1
changed by f1
I instanc bar
여기서 중요한 것은 위의 코드 Foo Class의 Instance foo1, foo2 둘 중 어느 하나를 통해 Class소속 변수인 classVar의 값을 바꾸다면 Class에서의 classVar와 Instance foo1, foo2의 classVar값이 모두 바뀐다는 것 이다. 그 이유는 Foo Class에서 생성된 변수 classVar는 메모리 공간에 저장되지만 Instance에서 생성된 classVar는 Class에서 생성된 classVar의 공간을 가리키고 있기 때문에 Class 나 Instance 둘 중 어느 곳의 값을 바꿔도 둘 다 바뀌는 것이다. 그렇다면 Instance 소속의 변수인 InstanceVar도 똑같이 작용될까? 그 답은 아니다. static을 사용하지 않은 Instance 소속의 변수와 메소드는 서로 독립적으로 메모리 공간에 저장되기 때문에 다른 Instance와 Class에 영향을 끼치지 않고 해당 Instance의 값만 바뀌게 된다.