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 값만 변함
'Java' 카테고리의 다른 글
생활코딩 JAVA 상속 - (수업소개+)기능의 개선과 발전 (0) | 2023.01.09 |
---|---|
생활코딩 JAVA 객체 지향 프로그래밍 - 생성자와 this / 클래스와 인스턴스의 활용 (+수업을 마치며) (0) | 2023.01.09 |
생활코딩 JAVA 객체 지향 프로그래밍 - 변수와 메소드 / 클래스 (0) | 2023.01.08 |
생활코딩 JAVA 객체 지향 프로그래밍 - (수업 소개+) 남의 클래스 & 남의 인스턴스 (0) | 2023.01.08 |
생활코딩 JAVA method - 메소드의 활용 (+수업을 마치며) (0) | 2023.01.07 |