일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- springboot
- 우분투
- docker
- 배열최소값최대값
- 유니캐스트
- javax.management.instancenotfoundexception: org.springframework.boot:type=admin
- 도커권한설정
- 오름차순
- 도커
- 브로드캐스트
- 포트포워딩
- name=springapplication
- dbeaver
- SpringApplication
- 배열복사
- 백준1946
- 페이로드
- wan
- ubuntu
- jmx
- 배열빈도수
- 네트워크모델
- 디비버
- 리눅스계열
- 모래시계출력
- 백준
- 포트포워딩 안될때
- instancenotfoundexception
- Decapsulation
- 리눅스환경
- Today
- Total
다잘하고싶어
싱글톤 이해하기 (with 인터페이스 사용 예제) 본문
싱글톤 코드 구현 순서
(1) 기본생성자를 막아서 외부에서 만들 수 없게 한다
private StudentManager(){}
(2) 외부에서는 생성 못하니까 나라도 만들어서 내가 가지고 있어야 한다.
private StudentManager instance = new StudentManager();
(3) private 하게 만들었으니 외부에서 접근하려면 public 한 메서드가 하나 필요하겠다.
public StudentManager getInstance(){
return instance;
}
(4) but! 외부에서 사용할 때 인스턴스가 없어서 아직 사용할 수 없는 상황이므로 static을 붙여서 미리 메모리에 올려둬야겠다!
private StudentManager(){}
private StudentManager instance = new StudentManager();
public static StudentManager getInstance(){
return instance;
}
(5) 그러나 이러면 instance 에 빨간줄 뜬다. 왜? instance 가 안만들어졌는데 관련된 메서드를 만들 수 없으므로! 그래서 기본생성자에도 static 붙여서 같이 올려둬야겠다.
private static StudentManager(){}
private StudentManager instance = new StudentManager();
public static StudentManager getInstance(){
return instance;
}
⇒ 외부에서 한번만 호출할 수 있다. 한번 호출하면 여러번 호출해서 사용할 수는 없음!
(5-2) 아래와 같이 표현할 수도 있다. (5 또는 5-2 중 택 1)
private static StudentManager(){}
private StudentManager instance;
public static StudentManager getInstance(){
if(instance == null){
instance = new StudentManager();
}
return instance;
}
static 을 왜 써야 할까?
- 외부에서 불러서 쓸때의 문제점?
- 인스턴스가 안만들어 졌는데 불러서 사용해야하는 상황이 된다!
- 외부에서 getInstance() 사용하는데, 아직 안만들어진 상황이 된다. ⇒ static 붙여서 미리 메모리 상에 올려둬야 한다.
인터페이스 사용 예제
설명 :
(1) 영화( Movie ) 클래스를 관리하는 (2) 매니저인터페이스( IMovieManager ) , 매니저인터페이스를 구현하는 (3) 클래스( MovieManagerImpl ) 가 존재함.
public class MovieManagerImpl implements IMovieManager{
private static IMovieManager instance = new MovieManagerImpl();
private MovieManagerImpl() {};
public static IMovieManager getInstance() {
return instance;
}
....
//아래는 영화를 관리하는 메서드들이 있음
....
}
▶ private static IMovieManager instance = new MovieManagerImpl();
인터페이스는 객체를 생성할 수 없으므로, 그것을 구현한 클래스로 객체를 생성해준다
위에서 생성한 getInstance 를 사용해서 객체를 호출하고, MovieManagerImpl 클래스 안의 메소드들을 사용하려면?
IMovieManager → 매니저 클래스에서 리턴자료형을 IMovieManager 으로 설정해두었으므로 여기선 이렇게 사용했으나 , MovieManagerImpl 로 해도 상관없다! (어차피 인터페이스 이므로, 구현클래스로 알아서 찾아가서 사용함)
MovieManagerImpl.getInstance( ) → 이미 싱글톤을 static 으로 선언해서 작성했으므로, 이미 getInstance 메소드는 메모리상에 클래스영역에 올라가있다.
따라서 클래스이름으로 메소드를 불러와서 사용이 가능하다.
'이론학습 > JAVA' 카테고리의 다른 글
자바 추상클래스 (0) | 2023.02.06 |
---|---|
반복문 _ 다양한 형태로 별, 숫자 출력하기 (0) | 2023.02.06 |
자바 : 상속과 다형성 (0) | 2023.01.25 |
클래스 다이어그램 아이콘 (0) | 2023.01.21 |
자바 : JVM 메모리 구조 이해하기 (0) | 2023.01.19 |