1. class
1) class란?
- 연관된 메소드들과 변수들을 그룹핑하여 이름을 붙인 것
Math라는 class 안에는 원주율을 나타내는 변수인 PI가 들어 있고, 각각 올림과 버림을 해주는 메소드인 floor, ceil이 들어 있다.
class들 중에서는 일회용 작업이 아니라 긴 맥락의 작업이 가능해야 하는 class들도 있다.
이러한 class들은 class 앞에 new를 붙임으로써 어떤 특정한 상태를 가지고 있는 class의 복제본을 생성하여 사용할 수 있다.
위 코드는 data.txt를 저장한다는 상태를 가지는 FileWriter class의 복제본을 f1에 저장하는 것이다.
여기서 f1이 가리키고 있는 값을 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
|
class Print {
public static String delimiter = "";
public static void A() {
System.out.println(delimiter);
System.out.println("A");
System.out.println("A");
}
public static void B() {
System.out.println(delimiter);
System.out.println("B");
System.out.println("B");
}
}
/*변수와 메소드들을 Print라는 하나의 class로 묶음으로써
이들이 서로 연관되어 있음을 명확하게 알 수 있음.*/
public class MyOOP {
public static void main(String[] args) {
Print.delimiter = "----";
Print.A();
Print.A();
Print.B();
Print.B();
Print.delimiter = "****";
Print.A();
Print.A();
Print.B();
Print.B();
}
}
|
cs |
하나의 java 파일 안에 여러 개의 class를 생성하면 각각의 class가 class 파일로서 존재하게 된다.
즉, 하나의 프로그램을 여러 개의 파일로 분산하여 작성이 가능하다.
1) class의 형식
class class명 {
해당 class의 member
}
2. instance
- 하나의 class를 복제해서 서로 다른 데이터의 값과 서로 같은 method를 가진 복제본을 만드는 것.
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 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");
}
}
public class MyOOP {
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, p2라는 새로운 instance들을 생성함으로써 delimiter라는 하나의 변수에 각각 다른 상태의 데이터를 저장 가능.
}
|
cs |
3. static
- 변수나 메소드 앞에 static이라는 키워드가 붙으면 각각 class 변수, class 메소드가 된다. 이들은 해당 필드나 메소드들이 instance가 아닌 class 소속으로 고정되어 있다는 의미이다.
- class를 통해 직접 instance 변수와 instance 메소드에 접근하는 것은 금지되어 있다. instance 변수와 instance 메소드에는 instance를 통해 접근해야 한다.
새로운 instance를 생성한 경우 해당 instance의 원본 class 내에 있는 멤버 각각이
- class 변수, 메소드의 경우
: instance가 해당 변수, 메소드를 가리키기만 할 뿐 독립적인 값을 할당하지 않음
-> 원본 class와 복제된 모든 instance들이 같은 값을 공유함.
- instance 변수, 메소드의 경우
: instance마다 독립된 값이나 상태를 가짐.
-> 복제된 모든 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
37
38
39
40
41
42
43
44
45
|
class Foo {
public static String classVar = "I class var"; // static 선언(class 변수)
public String instanceVar = "I instance var"; // instance 변수
public static void classMethod() {
System.out.println(classVar);
System.out.println(instanceVar); // Error
// class method 안에서 class 변수에는 접근 가능하지만 instance 변수에는 접근할 수 없음.
}
public void instanceMethod() {
System.out.println(classVar);
System.out.println(instanceVar);
} // instance method 안에서는 class 변수와 instance 변수에 모두 접근 가능.
}
public class StaticApp {
public static void main(String\[\] args) {
System.out.println(Foo.classVar);
System.out.println(Foo.instanceVar); // Error
// class명으로 어떤 class 내 변수에 접근할 때 class 변수에는 접근 가능하지만 instance에는 접근할 수 없음.
// 즉, instance는 class명이 아닌 instance를 통해서 접근하여야 함.
Foo.classMethod();
Foo.instanceMenthod(); // Error
// class method는 class명을 통해 접근 가능하지만 instance method는 instance로만 접근할 수 있음.
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
// class 변수는 모든 instance가 같은 값을 공유함.
f1.instanceVar = "changed by f1";
System.out.println(f1.instanceVar); // changed by f1
System.out.println(f2.instanceVar); // I instance var
// instance 변수는 각 instance마다 독립된 값을 가짐.
}
}
|
cs |
4. 생성자(constructor)
instance가 생성되기 위해 반드시 필요한 초기값이 지정되지 않은 경우 오류가 발생할 수 있다.
위 코드에서 FileWriter라는 class는 대상 파일(위 코드에서는 "data.txt")이 지정되지 않은 경우에는 write와 같은 메소드를 실행할 수가 없다.
생성자는 새로운 instance 생성 시에 반드시 초기값을 지정하도록 하여 이러한 오류를 방지한다.
생성자는 class와 똑같은 이름의 메소드로서 정의된다.
java는 새로운 instance를 생성할 때 해당 class와 동일한 이름의 메소드가 있다면 그 메소드를 호출하도록 약속되어 있다.
위와 같이 p1에 새로운 인스턴스가 생성될 경우,
해당 class와 같은 이름을 가진 메소드(=생성자)인 Print가 호출된다.
그리고 인스턴스를 생성할 때 인자로서 주어졌던 "----"은 _delimiter라는 매개변수의 값이 된다. 따라서 Print라는 class 내에 있는 delimiter라는 변수의 초기값이 인스턴스 생성 시에 주어지는 값으로 설정되는 것이다. 이 값이 주어지지 않으면 인스턴스는 생성되지 않는다.
- 생성자는 static이나 return type을 지정하지 않는다.
1) this
this라는 키워드는 해당 인스턴스를 가리킨다.
즉, Print라는 class의 생성자를 위와 같이 this를 사용하여 작성할 수도 있다. 위 코드는 현재 인스턴스 내의 delimiter라는 변수의 값을 주어진 인자 값으로 바꾼다는 뜻이다.
'2021 > java' 카테고리의 다른 글
java - 상속 (0) | 2021.08.12 |
---|---|
백준 2501 - 약수 구하기 (0) | 2021.07.14 |
백준 1000 - A+B (0) | 2021.07.14 |