용어 정의
객체 안에 클래스와 인스턴스가 존재
클래스 - 설계도
인스턴스 - 부품 하나하나
싱글톤 패턴을 한마디로 하자면
하나의 인스턴스만 생성하도록 구현하는 것!
싱글톤 패턴이 푸는 문제
예) 시스템 스피커에 접근할 수 있는 클래스 만들어야 함.
이때 스피커에 접근할 수 있는 클래스가 하나 이상이면 스피커를 조절할 때마다 모든 클래스들을 수정해야 한다.
개발 복잡도 올라가고 리소스 낭비
//유튜브 싱글톤 영상에서 나온 것.
//1개만 , 외부접근 안됨
static private SystemSpeaker instance;
private SystemSpeaker(){
}
public static SystemSpeaker getInstance(){
if(instance == null){
//시스템 스피커
instance = new SystemSpeaker();
}
return instance;
}
//모강의에서 본 방법
private static final MemberRepository instance = new MemberRepository();
public static MemberRepository getInstance(){
return instance;
}
private MemberRepository(){
}
위에꺼 코드는 이해가 간다.
근데 밑에 꺼는 어떻게 넣어지고 있거지?
멤버리파지 생성코드가 밑에 위치하는데
코드는 밑에서 위로 실행된다고 알고 있다.
사실 별 의문 없었는데 누가 강의 밑에 이런 질문 남겨놔서 나도 헷갈리게 됨.
우선 혼자 생각해보니 static의 개념도 확실히 잡힌 거 같지 않아서 복습에 돌입했다.
static
메서드나 변수에 static을 선언하면 일반 인스턴스 필드같이 객체의 소속이 되는 게 아니라 클래스의 소속이 된다.
클래스 타입의 객체를 생성하면 해당 클래스에 있는 인스턴스들을 복제해오는 반면(원본 클래스에있는 인스턴스들과 무관하게 됨), 생성된 객체가 원본 클래스에 있는 static요소를 호출하게 되면 원본에 있는 static 요소를 가리키는 꼴이 되어 복제가 아닌 원본을 사용하게 된다. 그래서 객체 쪽에서 값을 바꾸면 원본에 있는 값도 바뀐다.
static요소들은 클래스의 소속이기 때문에 클래스가 로드되면 바로 사용 가능하다.
그럼 클래스는 언제 로드되는 거지?
갑분 JVM
크게 3가지 과정이 있음
클래스 로드 - 런타임 데이터 액세스 - 실행 엔진
실행하면 제일 처음 자바 컴파일러가 클래스 파일을 만든다( 바이트 코드).
이때 자바 컴파일러가 각 클래스에 클래스들의 기본 생성자들을 다 넣어 준다! interesting
다 되면 클래스 로더가 런타임에 넣어주면 static들이 메모리에 로드가 된다. 그리고 메인이라는 이름을 가진 메서드를 찾는다.
클래스 로드
클래스 로드를 통해 자바 컴파일러를 통해 바이트코드 컴파일된 자바 파일들이 런타임 영역으로 가게 됨.
클래스 로드 3가지 과정
로딩 - 링킹 - 초기화
1. 로딩
부트스트랩 클래스 로더 - 기본 라이브러리들 (system) 탑재
익스텐션 클래스로더 - 외부 라이브러리들
애플리케이션 로더 - 우리가 만든 자바 소스들
2. 링킹
검증
3. 초기화
! 이 과정에서 static 파일들의 값들을 초기화
그리고 데이타 엑세스 부분에서 method area에서 진짜 값들을 가져오는듯?!~
오오... 이제 좀 이해가 된다.
수업에서 JVM에서 배우긴 했지만 이렇게 세세하게 배우지는 않았었다.
근데 아직까지도 완전히 이해가 되진 않는다..^^;;
계속 공부해나가야겠다.
참고 자료:
[자바 디자인 패턴 이해] 5강 싱글톤 패턴(Singleton Pattern)
[내 멋대로 자바 - 3] JVM 메모리 구조 (static, heap, stack)
생활코딩
책: 이것이 자바다. 신용권의 JAVA프로그래밍 정복
'study > JAVA' 카테고리의 다른 글
date 날짜 더하기 (0) | 2022.08.28 |
---|---|
[JAVA] int array Integer List로 변환하기 (0) | 2022.06.08 |
JLabel에 사진넣기 (0) | 2022.05.01 |
자바 로그인 로직 짜보기 (0) | 2022.04.30 |
Scanner 대신 BufferedReader 사용하기 (0) | 2022.04.15 |
댓글