#### Class, Instance
public, protexted, default, private
static - class method
no static - instance method
class는 비슷한 맥락의 method와 variable을 정리해서 묶어놓은 것이다. class에 .을 찍어서 해당 class가 가지고 있는 method를 사용할 수 있다.
그런데 이를 여러번 반복해야한다면 매번 특정한 조건을 반복해서 적어야 할지도 모른다. 그래서 필요한 것이 instance. instance는 기본적으로 class의 복제본인데, 추가로 내가 설정해준 설정값을 갖는다. instance를 선언하는 것은, datatype이 해당 class인 변수를 선언하는 것과 같다.
public static String delimiter = ""; //전역변수 선언
public static void main(String[] args) {
delimiter = "----"; //전역변수 호출
printA();
printB();
delimiter = "****";
printA();
printB();
}
public static void printB() {
System.out.println(delimiter);
System.out.println("B");
System.out.println("B");
}
public static void printA() {
System.out.println(delimiter);
System.out.println("A");
System.out.println("A");
}
class Print{
public static String delimiter = ""; //전역변수 선언
public static void B() {
System.out.println(delimiter);
System.out.println("B");
System.out.println("B");
}
public static void A() {
System.out.println(delimiter);
System.out.println("A");
System.out.println("A");
}
public class MyOOPwithClass {
public static void main(String[] args) {
Print.delimiter = "----"; //전역변수 호출
Print.A();
Print.B();
Print.delimiter = "****";
Print.A();
Print.B();
}
}
}
편의성 차이가 크다. 유지보수에 훨씬 용이한 코드가 된다.
static이 붙은 클래스의 변수에서는 인스턴스에서 값을 변경하면 클래스 값도 변경되고, 반대로 클래스에서 변수를 변경하면 인스턴스 값들도 변경된다.
static이 붙지 않은 클래스의 변수에서는 인스턴스에서 변수를 바꾸더라도 클래스의 변수값은 변경되지 않는다.
class Foo{
public static String classVar = "I class var";
public String instanceVar = "I instance var";
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); // OK
// System.out.println(Foo.instanceVar); // Error
Foo.classMethod();
// Foo.instanceMethod();
Foo f1 = new Foo();
Foo f2 = new Foo();
//
System.out.println(f1.classVar); // I class var
System.out.println(f1.instanceVar); // I instance var
//
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
}
}