Java

생활코딩 JAVA 객체 지향 프로그래밍 - 인스턴스 / static

소댓 2023. 1. 9. 00:49

5. 인스턴스

 

- 원형이 'class', 원형인 class를 복제한 것들이 'instance'

 

- new Print();

> Print라는 클래스를 '복제/분신술'한 아바타인 instance가 만들어지는 것

> 이러한 인스턴스가 Print라는 타입이고, delimiter가 -표다.

Print p1 = new Print();
p1.delimiter = "----";

 

<MyOPP>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class MyOPP {
    public static void main(String[] args) {
        Print p1 = new Print();
        p1.delimiter = "----";
        p1.A();
        p1.A();
        p1.B();
        p1.B();
        
        Print p2 = new Print();
        p2.delimiter = "****";
        p2.A();
        p2.A();
        p2.B();
        p2.B();
        
        p1.A();
        p2.A();
        p1.A();
        p2.A();
    
    }
 
}
cs

 

<Print>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Print{
    public String delimiter = "";
 
    public void A() {    
        System.out.println(delimiter);
        System.out.println("A");
        System.out.println("A");
    }
        public void B() {
        System.out.println(delimiter);
        System.out.println("B");
        System.out.println("B");
    }
}
cs

<결과>

 

6. static

- 인스턴스는 인스턴스를 통해 사용되도록 고안된 변수다.

- Class 메소드 안에서는 클래스 변수에는 접근이 되지만, 인스턴스 변수에는 접근할 수 없음

- 인스턴스 메소드는 인스턴스 소속이기 때문에 클래스를 통해 접근하는 것은 금지

 

* Class Foo

static String classVar = "I class var"

 

xxxx

String instanceVar = "I instance var"

 

static classMethod(){   }

 

xxxx

instanceMethod90{    }

 

 

*instance f1

 

static String classVar

> classVar는 class 소속이기 때문에 f1에는 실제 값이 존재하지 않음. Foo라는 클래스를 가리키고 있을 뿐

> instance f1의 값이 바뀌면 class Food의 값도 바뀌고, 반대의 경우에도 값이 바뀜

 

String instanceVar = "I instance var"

> instance var는 Foo에서 f1이라는 인스턴스가 생성될 때, instance var라는 변수가 생성되면서 class의 값까지 복제가 됨

> instance f1에서 값이 바뀐다고 class Foo의 값이 바뀌지 않음

 

static classMethod(){    }

> 메소드가 클래스를 참조

 

instanceMethod(){    }

> 클래스에 있는 instanceMethod를 복제한 것(서로 독립된 존재)

 

>> class의 변수를 바꾸면, 모든 instance의 변수의 값이 바뀐다.

>> instance에서 class의 변수를 바꿀 수도 있는데, 그럴 때 class의 변수가 바뀌고,

     그 class를 사용하고 있는 모든 instance의 값도 바뀜

 

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
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
    }
 
}
cs

 

 

> static은 클래스 소속, static이 없는 것은 인스턴스 소속

  클래스에서 여러 독립적인 인스턴스를 생성할 때 모든 인스턴스가 공통적으로 사용해야 하는 값에는 static을 취함

  반면에, 독립적인 인스턴스에서 클래스의 변수나 메소드를 가져와 변동하여 사용할 경우에는 static을 사용하지 않음

> classVar라는 변수는 클래스에 저장되어 있음

  f1에서 classVar의 값을 변경하게 되면, 클래스 뿐만 아니라 모든 인스턴스(ex. f2)의 값도 변함

  반대로, f1에서 instanceVar의 값을 바꾸게 되면, f1의 instanceVar 값만 변함