본문 바로가기

Java/java

[Java] static

반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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 Main {
 
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        System.out.println(Foo.classVar); //OK
//        System.out.println(Foo.instanceVar); //ERROR
        Foo.classMethod();
//        Foo.instanceMethod();// ERROR
 
        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 bt f1
 
        f1.instanceVar = "changed by f1";
        System.out.println(f1.instanceVar); //changed by f1
        System.out.println(f2.instanceVar); //I instance var
 
    }
}
cs
우선 위의 코드를 보며 이해해 보자.

클래스에서 인스턴스를 만들면 클래스와 인스턴스는 서로 독립적이다.

클래스는 단지 인스턴스를 만들어 주는 틀과 같다고 생각할 수있다.

(붕어빵을 만드는 기계 : 클래스 , 붕어빵 : 인스턴스)

 

이해를 돕기 위해...

  • 클래스 안에 존재하는 non-static 변수, non-static 메서드는 인스턴스를 만들기 전에는 생성되지 않았다고 생각을 하겠다. 인스턴스를 생성할때 각각을 복제하여 각각 인스턴스가 가지고 있게 된다.
    • f1.instanceVar를 바꾼다고 f2.instanceVar가 바뀌지 않는다(서로 독립된 존재로 다른 존재이다.)
  • 클래스 안에 존재하는 static 변수, static 메서드는 인스턴스를 생성할때 non-static메서드 처럼 각각의 복제품을 만드는 것이 아니라 클래스 안에 있는 변수의 래퍼런스를 가르킨다.
    • classVar를 변경하면 f1.classVar, f2.classVar, Foo.classVar는 모두 똑같은 값으로 바뀐다.(같은곳을 바라보고 있기 때문에 당연하다.)
    • static 변수는 클래스변수, 래퍼런스변수라고도 한다.

 

static 메소드에서 non-static변수는 사용할 수 없다.

non-static변수는 사실 인스턴스가 생성 되어야 만들어 지는 변수인데 인스턴스가 없기 때문에 static 메소드에서 사용할 수 없는게 당연하다.

 

마찬가지로 non-static메소드는 클래스를 생성자를 통해서 인스턴스를 생성하지 않고서는 사용할 수 없다.

 

Foo.classMethod();

 

Foo f1 = new Foo();

f1.instanceMethod();

f1.classMethod();

 

위와 같이 사용해야 정상적으로 사용할 수 있다.

 

반응형

'Java > java' 카테고리의 다른 글

[Java] 버퍼 입출력(Buffer I/O)  (0) 2020.07.08
[Java] 스트립입출력(Stream I/O)  (0) 2020.07.07