2022/2/18
싱글턴 Singleton (싱글 인스턴스/ 객체 하나)
/*객체 생성을 한 개만 해서 같이 써라. 객체 생성을 하나만 하고 더 못 만들게 하는 것. 요게 필요하면 하나만 가져다 써라.
프로젝트에서 단 한 개의 객체만 만들도록 제한을 하는 경우가 있다. 프라이빗 접근 제어자를 붙여서 외부에서 생성자를 호출 못하게 막아버림. 객체 생성 못하게 막겠다. 그리고 자신 타입의 스태틱 변수를 싱글턴 클래스 변수 안에 내
클래스 변수만 만들어 놓으면 외부에서 뉴를 못하게 막았으니까 아예 외부에서는 객체 생성을 못함.
내가 내 안에다가 객체 생성하는걸 미리 써놓는 것. 한 번만 하게 스태틱을 붙여 놓는 것. 스태틱 붙여서 미리 만들어 놓은걸 다음부터는 빌려 쓰는 것
한 번만 객체 생성해서 로딩해라 스태틱으로 만드는 대신 이 변수를 나중에 내가 얘는 외부에서 객체 생성을 못하게 막아놨잖아요 내 안에서 객체 생성을 스태틱으로 해줬잖아요 그냥 놔두면 외부에서 이 변수 값의 조정.. 덮어쓰기를 해버렸네? 딴 데서도 써야 하는데 중간에 덮어써버렸어 훼손이 돼버렸잖아요 훼손이 안되게 스태틱 앞에다가 프라이빗을 또 붙임. 같은 클래스 내에선 변경할 수 있지만 외부에선 변경이 안되게. 가져다 쓸 수 있겠음 리턴해주는 퍼블릭 겟 메서드를 만든다. 겟 메서드로 주소를 얻어다가 활용을 하는 방향. 객체를 복사하는 게 아니라 주소만 얻어서 쓰는 것. 매번 비슷한 거 만들어서 쓰느니 하나만 만들어서 갖다 쓰자. 이거임. 힙 메모리에 하나만 만들어서 필요할 때마다 얻어다 써~ 메모리를 더 효율적으로 쓰기 위한 방법.*/ (일단 들리는대로 받아썼다...)
객체 단 하나만 생성된다 하여 싱글턴이라 함.
1. 구성 요소
① 자기 클래스 타입의 private static 변수: 내 클래스 안에서 한번만 객체 생성하여 로딩 되게 미리 만들어 놓고 값 변경도 외부에서 못하게 프라이빗으로 처리. //내 클래스 타입으로 만들어 놓기.
private static 클래스 명 instance(관용적으로 인스턴스라고 붙여줌) = new 클래스 명();
② private 생성자: 외부에서 객체 생성 못하게 막기
private 클래스 명(){}
③ 외부에서 instance를 가져다 쓸 수 있도록 get메서드 public으로 생성. 외부에서 객체 생성이 안되므로, 이 메서드도 static을 붙여줘 클래스 명. 붙여서 호출할 수 있게.
public static 클래스 명 getInstance(){
return instance;
}


싱글티 클래스 참고.
내부 클래스
inner class, 중첩 클래스, nested class
클래스 내부에 또 다른 클래스를 정의한 것
사용 이유: 은닉화 위해 사용, 보안 강화, 코드 간결, 멤버 쉽게 접근
클래스가 특정 클래스와 관계를 맺을 때, 관계된 클래스 내부에 만드는 것도 괜찮다. 그 안에서 잠깐만 서로 작동한다면 외부 말고 안쪽에다 만들자. 클래스 안에 클래스가 있기 때문에 접근이 쉽고 빠르다. 코드의 복잡성도 줄고 보안도 강화된다.
1. [구조]
class 외부 클래스{
외부 클래스 변수;
외부 클래스 메서드;
class 내부 클래스{
내부 변수;
내부 메서드;
}
}
2. 종류: 종류의 기준은 클래스의 정의(선언), 위치에 따라 구분이 된다.
① 멤버 클래스
i. 인스턴스 멤버 클래스
: A 클래스 객체 생성해야만 사용할 수 있는 B 내부 클래스. A 입장에서 B가 인스턴스 멤버인 클래스. A 객체를 생성해야만 B를 사용할 수 있다.
class A {
…
class B {
…
}
}
ii. static 멤버 클래스
: A 클래스를 통해 바로 접근 가능한 B 내부 클래스. A.B 이런 식으로 호출이 가능. (A의 객체가 있는 상태라면)
class A {
……
static class B {
……
}
}
*멤버 클래스도 하나의 클래스이므로 컴파일하면 바이트코드 파일 (. class) 별도로 생성 -> A$B.class 중간에 달러 표시가 낀다.
② 로컬(지역) 클래스 // 로컬 베리어블 == 지역 변수
: 메서드()가 실행될 때만 사용할 수 있는 B 내부 클래스
class A {
void method(){
class B {
…
}
}
}
*A$1B.class
3. 인스턴스 멤버 클래스
: 인스턴스 변수와 메서드만 선언 가능, static 변수와 메서드 선언 불가.
① 정의
class A {
class B {
B(){} // 생성자 가능
int x;
void method();
static in y; //스태틱 사용 불가
static void method2(){} //스태틱 사용 불가
}
}
② 객체 생성
: A 외부에서 B 생성 -> 먼저 A로 객체 생성하고 B 객체 생성.
A a = new A();
A.B b = a.new B();
4. static 멤버 클래스
: static 키워드가 붙은 내부 클래스. 모든 종류의 변수와 메서드 선언 가능. (내부 클래스 자체도 클래스기 때문에)
① 정의
class A {
static class B {
B(){} // 생성자 가능
int x;
void method();
static in y;
static void method2(){}
}
}
② 객체 생성
: A 외부에서 B 생성 -> A 객체 생성 필요 없음
A.B b = new A.B();
b.x =10; //인스턴스 멤버
A.B.y =20;
A.B.method2() // 클래스 멤버 스태틱 이런 식으로 사용 가능.
5. 로컬 (지역) 클래스
: 접근제어자와 static을 붙일 수 없다. 메서드 안에 있어서 메서드가 끝나면 없어짐. 메서드 실행할 때 메서드 내부에서만 사용되므로 제한할 필요가 없다. 인스턴스 변수와 메서드만 선언 가능, static 사용 불가.
① 정의
void methodA(){
class B {
B(){} // 생성자 가능
int x;
void method();
static in y; //스태틱 사용 불가
static void method2(){} //스태틱 사용 불가
}
}
② 객체 생성 메서드 안에서 동등하게 이루어짐
B b = new B(); //하던 대로 객체 생성하여 사용하면 됨.
b.x = 100;
b. method();