Singleton에 대해 자세히 설명하는 것은 다른 게시물에서 하도록 하고,
간단하게 구현하는 것에 이 글의 목적을 둔다.
코드에서 주석처리한 부분은 singleton을 사용하지 않았을 때, getter와 setter로 값을 넘겨받아야 하는 것을 나타낸 것이다.
각 클래스는 number, name이라는 필드(data member 또는 멤버변수)를 가지고 있다.
1. MyClass.java, YouClass.java, Singleton.java안에서 number와 name의 값을 서로 넘겨받는다.
2. MainClass.java가 존재한다. 여기서 값들을 확인해보자.
3. 모두 확인해보고 HeClass.java를 만들어 Singleton에 접근해보자.
즉,
변수 number는
MyClass -> Singleton -> YouClass의 과정으로 접근하게 되고,
변수 name은
YouClass -> Singleton -> MyClass의 과정으로 접근하게 된다.
이후에 생성된 HeClass는 Singleton으로부터 변수 name과 number에 접근한다.
먼저, MyClass.java는 다음과 같다.
특징은 number에 대한 값은 가지고 있으나, name에 대한 값은 가지고 있지 않다는 것이다.
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
|
package cls;
import single.Singleton;
public class MyClass {
private int number;
private String name;
public MyClass() {
number = 256;
}
/*
public int getNumber() {
return number;
}
*/
public void mySetNumberMethod() {
Singleton si = Singleton.getInstance();
si.number = number; // MyClass의 number의 값을 si.number에 저장
}
public void myGetNameMethod() {
Singleton si = Singleton.getInstance();
name = si.name;
}
@Override
public String toString() {
return "MyClass [number=" + number + ", name=" + name + "]";
}
}
|
cs |
YouClass.java는 다음과 같다.
특징은 number에 대한 값은 가지고 있지 않고, name에 대한 값은 가지고 있다는 것이다.
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
|
package cls;
import single.Singleton;
public class YouClass {
private String name = "홍길동";
private int number;
/*
public void setNumber(int number) {
this.number = number;
}
*/
public void youGetNumberMethod() {
Singleton si = Singleton.getInstance();
number = si.number;
}
public void youSetNameMethod() {
Singleton si = Singleton.getInstance();
si.name = name; // YouClass의 name의 값을 si.name에 저장
}
@Override
public String toString() {
return "YouClass [name=" + name + ", number=" + number + "]";
}
}
|
cs |
Singleton.java는 다음과 같다.
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
|
package single;
public class Singleton {
private static Singleton single = null;
public int number;
public String name;
private Singleton() {} // 싱글톤 생성자에 접근 불가능
// 아래 코드 덕분에 싱클톤의 객체를 생성하고, 그 객체의 주소를 담은 여러 변수가 있을 때, 모두 하나의 객체의 주소를 저장하게 된다.
public static Singleton getInstance() {
if(single == null) {
single = new Singleton();
}
return single;
}
}
// 싱글톤 클래스를 만드는 방법
// 1. 생성자를 private으로 만든다.
// 2. 이 싱글톤 클래스를 반환유형으로 한 정적 메서드를 작성한다.
// 3. 일반 클래스의 경우 클래스를 정의할 때 생성자를 사용하는 반면, 싱글톤 클래스의 경우 getInstance() 메서드를 사용한다.
// 일반 클래스의 경우 class a = new class(); 이런식으로 객체를 생성하는것과 달리 싱글톤 클래스의 경우 getInstance() 메소드를 호출하여 객체를 생성
// 싱클톤의 객체를 생성하고, 그 객체의 주소를 담은 여러 변수가 있을 때, 모두 하나의 객체의 주소를 저장하게 된다.
|
cs |
HeClass.java는 다음과 같다.
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
|
package cls;
import single.Singleton;
public class HeClass {
private int number;
private String name;
public HeClass() {
}
public void func() {
Singleton si = Singleton.getInstance();
number = si.number;
name = si.name;
}
@Override
public String toString() {
return "HeClass [number=" + number + ", name=" + name + "]";
}
}
|
cs |
MainClass.java에서
결과를 확인해보면,
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
|
package main;
import cls.HeClass;
import cls.MyClass;
import cls.YouClass;
import single.Singleton;
public class MainClass {
public static void main(String[] args) {
MyClass mycls = new MyClass();
YouClass youcls = new YouClass();
// int number = mycls.getNumber();
// youcls.setNumber(number);
// System.out.println(youcls.toString());
// singleton을 사용한 경우
// number
mycls.mySetNumberMethod(); // mycls의 값을 singleton이 받고,
youcls.youGetNumberMethod(); // singleton에서 youcls로 넘겨준다.
System.out.println(youcls.toString());
// name
youcls.youSetNameMethod(); // youcls의 값을 singleton이 받고,
mycls.myGetNameMethod(); // singleton에서 mycls로 넘겨준다.
System.out.println(mycls.toString());
// 새로운 클래스를 생성했을 때 접근
HeClass hc = new HeClass();
hc.func();
System.out.println(hc.toString());
}
}
|
cs |
'Java' 카테고리의 다른 글
JDBC - insert, select, update, delete문 작성하기(java) (0) | 2023.02.10 |
---|---|
HashMap 간단한 사용법 (0) | 2023.02.08 |
BufferedReader vs Scanner, BufferedWriter vs System.out.println() (백준 15552번: 빠른 A+B) (0) | 2023.01.18 |
String - Java (0) | 2023.01.15 |
참조변수 super, 생성자 super() (0) | 2022.12.31 |