본문 바로가기

Language/[Java]

(91)
[Java] Lombok 주의사항 롬복은 어노테이션으로 편하게 getter,setter,생성자 등등을 사용할 수 있는 것이다. 근데, 사용시에 주의해야하는 사항이 있다. AllArgsConstructor, RequiredArgsConstructor 사용금지 생성자 필드에 대한 자동 생성 어노테이션이다. 해당 필드에 대한 값의 순서만 바꾸면 ,생성자에대한 값도 바뀌게 되는데, 이는 오류 발생이 높다. 아무 생각없이 순서만 바꿔도 로직에서 동작을 안하거나,잘못된 값들이 저장 되는 위험이 있다. AllArgs -> 모든 필드를 생성자의 인수로 만들어주는 어노테이션 Required -> 초기화 되지않은 final, @nonnull이 붙은 필드에 대해 생성자를 생성해준다. @EqualsAndHashCode 사용자제 EqualsAndhashCode..
[Java] Static Factory method 팩터리 메서드 : 객체의 클래스 생성을 담당하는 메서드 생성자를 통해서 객체를 생성하지 않고, 생성 메서드를 통해서 객체를 생성하는 것을 정적 팩터리 메서드라고 한다. 그러면 생성자를 대신해서 정적 팩터리 메서드를 사용하면 뭐가좋을까 1. 이름을 가질 수 있다. 2.객체 생성을 캡슐화 가능하다 3. 하위클래스 타입으로 반환이 가능하다. 4.호출할때마다 신규 객체를 생성할 필요가 없다(싱글톤 유지시에)
[java] war파일 jar파일 비교 jar : Java archive Java 어플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 파일 Class, 라이브러리 파일을 포함함 JRE Java Runtime Environment만 있어도 실행 가능함 War servlet/ Jsp 컨테이너에 배치할 수있는 웹 애플리케이션 압축파일 포맷 웹 관련 자원을 포함한다. 사전 정의된 구조를 사용한다. 별도의 웹서버 필요 Jar파일의 일종으로 웹 애플리케이션 전체를 패키징하기 위한 Jar파일이다. 정리 해보자 war는 웹 애플리케이션 배포에 특화가 되어있고,정해진 구성을 지켜야한다. 또한 tomcat과 같은 서버 위에서 동작하기 위해 war배포가 있고, 어떻게 설정할지는 web.xml을 참고한다. war는 jar의 모든 파일+ 서블릿 컨테이너 같은 웹..
[Java] Static이란? 인스턴스를 생성하면, 각 인스턴스들은 서로 독립적이기때문에 서로 다른값을 유지한다. 경우에 따라서는 각 인스턴스들이 공통적으로 같은 값이 유지되어야 하는 경우, static을 붙인다. static 이 붙은 멤버변수는 클래스가 메모리에 올라갈때, 이미 자동적으로 생성이 된다. (인스턴스 생성 시점이 아님) static 이 붙은 메서드에서는 인스턴스 변수를 사용할 수 없다. static이 메서드는 인스턴스 생성없이 호출이 가능한 반면, 인스턴스 변수는 인스턴스를 생성해야만 존재하기 때문에 static이 붙은 메서드를 호출할때 인스턴스가 생성되어있을수도, 그렇지 않을수도 있어서 static이 붙은 메서드에서 인스턴스 변수의 사용을 허용하지 않는다. 반대로, 인스턴스 변수나 인스턴스 메서드에서는 static 붙..
[Java] finalize 메서드 사용 및 메모리 점유 모든 자바 클래스의 최상위 부모 클래스는 Object클래스이고, finalize메소드가 존재한다. Java API에는 이 메소드는 가비지 컬렉터가 레퍼런스를 잃은 클래스의 인스턴스를 가비지 컬렉션할 때 호출한다. 이 메소드는 객체 인스턴스가 가비지 콜렉션에 의해 소멸되는 시점에 특정한 동작을 수행해야할때도 요긴하게 사용할 수 있는 메소드이다. GC발생시에 즉각적으로 Collection되지 않는다. Finalize가 선언되어있으면, Finalization Queue에 들어간 후, Finalizer에 의해 정리가 된다. finalize 메소드를 수행하는데 오래걸리면, 그만큼 객체가 오랫동안 메모리를 점유하게 되고, 이는 OOM이 발생확률이 높아진다. 대부분 종료자의 주요목적은 메모리에서 제거되기 전에 개체에..
[Effective Java] Rules [53. Null 대신 빈 배열이나 컬렉션 사용] Null처리를 해줘야 하는데, 이를 잊은 경우 클라이언트 측에서 오류 발생가능 [3. private 생성자나 열거 타입으로 싱글턴임을 보증하라] 1. public final 을 이용하는 방법 private 생성자는 public static final 필드인 Instance를 초기화 할때 한번만 호출된다. 리플렉션기능을 통해 private 생성자를 호출할수 있다 -> 두번째 객체 생성 부터는 예외 처리 필요 2.정적 팩토리를 이용하는 방법 싱글턴에 대한 이해가 빠르다 API 를 변경하지 않고, 싱글턴 패턴을 포기할 수 있다. (싱글턴에 대한 직렬화는, serializable impl 과 transient와 readResolve를 추가해야 가능하다, 아니면 ..
[Java] 모니터 하나의 객체마다 하나의 모니터를 결합할 수 있다. 모니터가 결합된 객체는 동시에 두개 이상의 스레드에 의해 접근 할 수 없도록 막는 잠금 기능을 제공한다. 객체에 모니터를 결합하면 하나의 스레드가 그 데이터를 사용하는 동안, 다른 스레드 들이 그 데이터를 사용할 수 없다. 자바에서는 동기화 메소드가 선언된 객체와 동기화 블럭에 의해 동기화 되는 모든 객체에 고유한 모니터가 결합이 되어 동기화 작업을 수행한다. 모니터의 구성 -스레드 단위로 모니터락을 획득하거나 반환한다. -동기화 코드를 수행할 때는 동기화 대상 인스턴스와 결합된 모니터락을 획득한 후에 진입이 가능하며, 동기화 코드를 벗어날 때에는 모니터 락을 반환하게 된다. -동기화 대상 인스턴스 별로 이와 결합된 Monitor가 존재하며, 현재 락을 ..
[Java] 문맥 교환 문맥교환 , Context Switching 이란 멀티 프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행할때 운영체제의 스케줄링에 따라 인터럽트 요청이 발생해서 다음 프로세스가 실행 되어야 할 때 각 프로세스 들은 메모리를 공유하지 않기 떄문에 기존 프로세스의 상태를 저장하고 다음 프로세스의 상태를 교체하는 작업을 문맥교환이라고 한다. OS에서 Context는 CPU가 프로세스를 실행하기 위한 프로세스 정보들을 말한다. 이 Context는 프로세스의 PCB에 저장된다. 문맥 교환이 발생하면, CPU는 해당 프로세스의 PCB 정보를 받아와서 이전 작업을 수행한다. PCB에 저장되는 내용들 -process상태 : CPU를 할당해도되는지 여부를 결정하기 위해 필요함 -PC값 : 다음에수행할 명령어의위치를..