반응형
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 |