jnk1m
Foliage IT
jnk1m
전체 방문자
오늘
어제
  • 분류 전체보기 (209)
    • Today I Learned (34)
    • Java (47)
    • Database (15)
    • [NHN Academy] (27)
    • Spring (47)
    • HTML + CSS + JavaScript (11)
    • JSP (3)
    • Node.js (10)
    • React Native (2)
    • 기타 (8)
    • 스크랩 (5)

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
jnk1m

Foliage IT

JAVA 웹 개발 Day10 (Note1): 싱글턴, 내부 클래스
Java

JAVA 웹 개발 Day10 (Note1): 싱글턴, 내부 클래스

2022. 2. 18. 23:17

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();

 

    'Java' 카테고리의 다른 글
    • JAVA 웹 개발 Day10 (Code1) 싱글턴, 내부 클래스, 익명 클래스
    • JAVA 웹 개발 Day10 (Note2): 익명 클래스, 예외 처리, 기본 정리
    • JAVA 자바 웹 개발 Day09 (Code)
    • JAVA 자바 웹 개발 Day09 (Note): 다형성, 추상 클래스, 인터페이스

    티스토리툴바