final
해당 변수나 객체를 초기화한 이후에는 절대로 바꾸지 못하도록 선언하는 것 초기화가 되고 나면 그 이후에는 절대
값을 바꿀 수 없다. 당연히 클래스에서 상속, 확장 불가이고 메소드는 오버라이딩은 불가, 오버로딩은 가능하다.
메모리에 올라간다.
※ [ 면접을 위한 CS 전공 노트 지식 ]
→ 프로세스의 메모리 구조 중 const(java에서 C언어와 비슷한 의미)는 Data영역에 Bss Segment와 Data Segment로 나누어진다고 한다. 그러나 java의 final은 Data영역으로 메모리가 할당되는 것이 아니라 힙에 할당된다. 책이 틀린 것은 아니고 Java입장에서는 잘못됐다고 할 수 있다.
static
선언을 하게 되면 그 위치에 상관없이 프로그램의 시작부터 끝까지 메모리에 할당돼 있으면서
그 값을 마음대로 바꿀 수 있는 것
======== ======== ======== ======== ======== ======== ======== ======== ======== ======
개인적인 의문점
======== ======== ======== ======== ======== ======== ======== ======== ======== ======
1. static final과 final의 차이
final을 쓰나 static final을 쓰나 둘 다 변할 수 없는 수(상수)인 것은 맞다. 그러나 static같은 경우는
메모리가 Data영역에 존재해 계속해서 유지한다. final은 GC에 의해 쓸모없어지면 해제 된다.
2. static final을 쓰는 경우
자주 쓰고 공통적으로 쓰는 기능을 사용한다. 그 이유는 매번 객체를 생성할 때마다 GC에 의해 메모리가 생성되고
해제되고 하는 것은 비효율적일 수 있다. 자주 쓰거나 공통적으로 쓰는 기능은 아예 메모리에 올려놓고 GC의 일을 줄여
주는 것이다.
3. 그럼 싱글톤 패턴 만들어서 다 공유하면 되는 거 아냐?
전역 상태: 싱글톤은 전역 상태를 유지하므로 다른 부분에서 예상치 못한 영향을 줄 수 있다. 여러 부분에서 같은 인스턴스에 접근하면 상태가 공유되어 의도치 않은 상호작용이 발생할 수 있다.
테스트 어려움: 싱글톤은 다른 클래스와 강하게 결합되어 있어 테스트가 어려울 수 있다. 특히 싱글톤 인스턴스가
다른 클래스에 의존적인 경우, 이를 모의(mock) 객체로 대체하거나 테스트하기가 어려울 수 있다.
생명주기 관리: 싱글톤 인스턴스의 생명주기를 관리해야 한다. 특히 어플리케이션의 초기화와 종료 시점에서 싱글톤이
적절히 초기화되고 제거되어야 할 수 있습니다. 이를 신경쓰지 않으면 메모리 누수(leak)가 발생할 수 있다.
멀티스레드 환경에서의 동기화 문제: 싱글톤이 멀티스레드 환경에서 사용될 경우 동기화 문제가 발생할 수 있다.
특히 lazy initialization 방식을 사용하는 경우에는 여러 스레드가 동시에 인스턴스를 생성하려는 시도를 막기 위해
동기화 메커니즘이 필요하다.
4. AOP vs 싱글턴(요약)
AOP : 관심사를 모듈화해서 반복적으로 발생하는 로직을 한 곳에서 관리하고자 할 때
→ 대표적인 예를 들면 interceptor도 그 중 하나라고 할 수 있다. 즉 Controller를 타기 전과 후의 반복적으로
발생하는 로직을 한 곳에서 관리하기 때문이다.
싱클턴 : 객체의 인스턴스가 오직 하나만 생성되도록 한 후 전역적으로 쓰일 때
'Java > 이론' 카테고리의 다른 글
| Inner Class (0) | 2024.07.06 |
|---|---|
| [ int, double, float, NULL ] (0) | 2024.07.06 |
| [ 직렬화(serialize) ] [ 역직렬화(Deserialize) ] (0) | 2024.07.05 |
| [ Java ] vs [ SQL ] (0) | 2024.07.05 |
| Javax → Jakarta (0) | 2024.06.28 |