static 키워드란?
메모리에 한번 할당되어 프로그램이 종료될 때까지 해제되는 것을 의미
static 변수
특징
static 변수는 클래스 변수이다
객체를 생성하지 않고도 static 지원에 접근이 가능하다.
초기화시점
JVM에 의해서 클래스가 메모리 공간에 올라가는 순간
static 메서드
특징
객체 생성없이 호출 가능
static 메서드로 접근하기 위해선 static 변수로 선언되어야 함
스태틱 변수와 스태틱 메서드는 스태틱 메모리 영역에 존재함으로 객체가 생성되기 이전 이미 할당되어있는 상태 → 객체의 생성없이 바로 접근하여 사용할 수 있다
클래스 변수(static 변수)
클래스 전체와 연결된 필드
static 클래스 변수
클래스 메서드(static method)
인스턴스 메서드와 달리 인스턴스를 생성하지 않아도 클래스 메서드를 호출할 수 있다
static 변수는 언제 생성되는가?
참고사이트
설명 :
singleton pattern
싱글톤 패턴이란?
싱글톤 패턴 종류
이른 초기화(Eager Initialization)
public class Singleton {
// Eager Initialization
private static Singleton uniqueInstance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return uniqueInstance;
}
}
늦은 초기화 동기화 불럭(Lazy Initialization with synchronized)
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
// Lazy Initailization
public static synchronzied Singleton getInstance() {
if(uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
DCL(Lazy Initialization. Double Checking Locking)
public class Singleton {
private volatile static Singleton uniqueInstance;
private Sigleton() {}
// Lazy Initialization. DCL
public Singleton getInstance() {
if(uniqueInstance == null) {
synchronized(Singleton.class) {
if(uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
위의 방법 개선, 인스턴스가 생성되지 않은 경우만 동기화 불럭 실행
volatile이란?
main memory에 값을 저장하고 읽어오기 때문에 읽고 쓰기시 변수값 불일치가 생기지 않음(캐시에 쓰지 않음)
열거 상수 클래스(Lazy Initailization. Enum)
public enum Singleton {
INSTANCE;
}
게으른 홀더(Lazy Initialization. LazyHolder)
public class Singleton {
private Singleton() {}
/**
* static member class
* 내부클래스에서 static변수를 선언해야하는 경우 static 내부 클래스를 선언해야만 한다.
* static 멤버, 특히 static 메서드에서 사용될 목적으로 선언
*/
private static class InnerInstanceClazz() {
// 클래스 로딩 시점에서 생성
private static final Singleton uniqueInstance = new Singleton();
}
public static Singleton getInstance() {
return InnerInstanceClazz.instance;
}
}
객체의 유일성
참고 사이트
설명
private static CardCompany company = new CardCompany();
private static으로 자기자신의 클래스를 인스턴스로 갖고 있게함
고전적인 싱글톤 패턴 구현
컨텍스트 스위칭 : cpu가 어떤 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선순위의 프로세스가 실행되야할때 기존 프로세스 상태나 값(레지스트)를 저장하고 다음 프로세스 수행하기 위해 새로운 프로세스 상태나 값으로 교체하는 작업
[[JAVA 디자인패턴] Singleton 패턴의 모든 것 (멀티스레드 고려)](https://javaplant.tistory.com/21)
synchronized를 통한 싱글톤 패턴
쓰레드 동기화 : 여러개의 쓰레드가 한개의 자원사용시 해당 쓰레드만 제외하고 나머지 접근을 막는 것을 말함
DCL(Double-Checked-Locking) Singleton 패턴
synchronized의 경우 인스턴스 할당 시점만 처리되면 해결될 문제를 전체 getInstance() 에 synchronized 처리해서 성능문제발생 이를 해결하는 패턴
getInstance()내부에서 instance를 생성하는 경우만 부분적으로 synchronized 처리
→ 인스턴스가 생성되어있는지 확인하고 없는 경우 lock 시킨후 인스턴스 생성
c. 단점 → 멀티스레드 작업시 메인메모리가 아닌 cpu cache에 변수값을 저장함.
그런데 멀티 스레드환경에서 스레드가 변수값 읽어올때 cpu 캐쉬에서 저장된 값이 다르기 때문에 변수값 불일치로 문제가 발생할 수 있음
d. 그래서 volatile 키워드를 사용, volatile 은 cpu캐시가 아닌 메인 메모리에서 변수를 참조 함 따라서 불일치 문제가 생기지 않음
스태틱 메소드 안의 동기화 블록
다음 예제는 스태틱 메소드에 대한 것이다. 두 메소드는 각 메소드를 가지고 있는 클래스 객체를 동기화 기준으로 잡는다.
같은 시점에 오직 한 쓰레드만 이 두 메소드 중 어느 쪽이든 실행 가능하다. 두 번째 동기화 블록의 괄호에 MyClass.class 가 아닌 다른 객체를 전달한다면, 쓰레드는 동시에 각 메소드를 실행할 수 있다.
LazyHolder Singleton 패턴
https://coding-factory.tistory.com/525
LazyHolder 방식은 가장 많이 사용되는 싱글턴 구현 방식입니다.
volatile 이나 synchronized 키워드 없이도 동시성 문제를 해결하기 때문에 성능이 뛰어납니다.
싱글턴 클래스에는 InnerInstanceClazz 클래스의 변수가 없기 때문에, static 멤버 클래스더라도, 클래스 로더가 초기화 과정을 진행할때 InnerInstanceClazz 메서드를 초기화 하지 않고, getInstance() 메서드를 호출할때 초기화 됩니다. 즉, 동적바인딩(Dynamic Binding) (런타임시에 성격이 결정) 의 특징을 이용하여 Thread-safe 하면서 성능이 뛰어납니다.
InnerInstanceClazz 내부 인스턴스는 static 이기 때문에 클래스 로딩 시점에 한번만 호출된다는 점을 이용한것이며, final을 써서 다시 값이 할당되지 않도록 합니다.
설명
객체의 배열 사용하기
얕은복사
깊은복사
출처
자바(java) 배열의 깊은 복사(deep copy)와 얕은 복사 완벽정리(1차원 배열, 2차원 배열, 객체 배열 복사)
ArrayList클래스 메서드
List 인터페이스를 상속받은 클래스
가변적으로 변하는 선형리스트
저장용량이 늘어나면 가변적으로 증가
ArrayLIst list = new ArrayList();
javaDoc
enhanced for문
for 문으로 배열의 요소의 처음부터 끝까지 모든 요소 참조
for(변수 : 배열){
}
출처
[자바 ] ArrayList에 여러 값 담기](https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=rbdi3222&logNo=220699749409)