코딩의 패턴 : 디자인 패턴 (객체지향) == 알고리즘(절차지향)
싱글턴 패턴 : 강제로 오직 하나의 객체만 가지고 쓸 수 있도록 한다.
접근제한자는 생각보다 중요한 부분이다.
생성자에 private을 붙인다는 것은 객체 생성을 거부하는 것
package com.bit.day08.am;
class Lec03 {
int su = 1234;
static int su2=2222;
//생성자에 private을 붙인다는 건 이 클래스의 객체 생성을 거부하는 것이다.
private Lec03() {
}
}
public class Ex03 {
public static void main(String[] args) {
Lec03 lec = new Lec03(); //오류
System.out.println(Lec03.su2);
}
}
package com.bit.day08.am;
class Lec03 {
static Lec03 me = new Lec03(); //non-static이라서 객체를 또 찍어야 접근가능 하기에 static을 붙임
private Lec03() {
}
void func(){
System.out.println();
}
}
public class Ex03 {
public static void main(String[] args) {
for(int i=0; i<4; i++){
//Lec03의 객체는 찍어내지 못하니까 Lec03 타입의 변수를 만들고, 거기에 me라는 객체의 주소를 넣은 것이다
Lec03 lec = Lec03.me; //하나의 객체만 쓰고도 기능을 4번 수행할 수 있어짐.
lec.func();
}
}
}
but 필드에 직접 접근하여 값을 바꿀 수 있다는 문제점이 있다.
package com.bit.day08.am;
class Lec03 {
private static Lec03 me = new Lec03(); //직접 접근을 막기 위해 private
private Lec03() {
}
void func(){
System.out.println();
}
}
public class Ex03 {
public static void main(String[] args) {
for(int i=0; i<4; i++){
Lec03 lec = Lec03.me;
Lec03.me = null; //그러나 필드 값을 바꿔치기 할 수 있는 문제점-->직접 접근을 막아야 함
lec.func();
}
}
}
하지만 private을 쓰면 또 접근이 안돼 갖다 쓸 수 없어짐
그래서 해결
package com.bit.day08.am;
class Lec03 {
private static Lec03 me = new Lec03(); //직접 접근을 막기 위해 private
private Lec03() {
System.out.println("객체의 생성...");
}
static Lec03 getInstance(){ //자신을 주는 기능을 만들어내었다.
return me;
}
void func(){
System.out.println("Lec03 클래스의 기능");
}
}
public class Ex03 {
public static void main(String[] args) {
for(int i=0; i<4; i++){
//내가 필드 값을 바꾸진 못하지만 받아서 쓸 수는 있다.
//몇번을 호출하던지 상관없이 하나의 객체를 받아서 쓰는 것이다.
Lec03 lec=Lec03.getInstance();
lec.func();
}
}
}
이런식으로도 가능하다
package com.bit.day08.am;
class Lec03 {
private static Lec03 me;
private Lec03() {
System.out.println("객체의 생성...");
}
static Lec03 getInstance(){
me = new Lec03(); //매번 새로운 객체를 주는 것
//if(me==null){me = new Lec03();} --> 조건을 걸어주면 null이 아닐때만 객체를 생성할 것이다.
return me;
}
void func(){
System.out.println("Lec03 클래스의 기능");
}
}
public class Ex03 {
public static void main(String[] args) {
for(int i=0; i<4; i++){
Lec03 lec=Lec03.getInstance();
lec.func();
}
}
}
자바의 장점 캡슐화 : 정보의 은닉. 정보 =필드 --> 접근제한자를 통해 정보를 은닉할 수 있고, 필요에 따라서 제어도 할 수 있다.