목록자바 (28)
생각해보기
Java는 처음 부터 다중 스레드 환경을 지원하도록 설계되었습니다. 자바에서 가장 처음 동시성을 제어하기 위해 사용된 구조는 가본적인 ‘synchronized’ 키워드와 wait-notify 메커니즘입니다. 추후에 복잡한 동시성을 제어하기 위해 더 많은 기능들이 생겨났습니다. 주요한 동시성 요소를 가볍게 살펴보고, synchronized의 lock 범위를 중점적으로 설명하겠습니다. (이후의 내용은 추후에 다루겠습니다) java 주요 동시성 요소 스레드 등장 : java 1.0 java의 기본적은 동시성 단위입니다. 쓰레드는 프로세스 내에서 실행되는 독립적인 실행 경로입니다. 각 스레드는 자신만의 스택을 가지지만, 힙 메모리는 공유됩니다. 스레드는 java.lang.Thread 클래스나 java.lang...

예전에 JVM에 동작방식에 대해 공부를 했지만. 잘 기억이 나질 않았습니다. 이번에 다시 공부하면서, 관련된 내용을 요약 및 정리를 했습니다. JVM의 동작 방식, 메모리 구조 부터, 변경 사항을 정리한 글입니다. JVM 동작 방식 자바 컴파일러(javac)가 자바 소스코드(.java)를 바이트코드(.class)로 컴파일 합니다. 클래스 로드를 통해서 다음과 같은 과정을 거칩니다 로딩 : 클래스를 읽어오는 과정 .class 파일을 가져와서 jvm의 메서드 영역에 배치합니다. 이 영역에는 코드, 메타 데이터, static 변수등이 포함되어 있습니다. 링크 : 레퍼런스를 읽는 과정 검증, 준비, 해석의 세부 단계로 나뉩니다 검증 : 바이트 코드가 안전한지 확인합니다 준비: 클래스 또는 인터페이스에 필요한 메..
직렬화 객체 직렬화란 자바가 객체를 바이트스트림으로 인코딩하고 그 바이트스트림으로 다시 객체를 재구성하는 매커니즘이다. 더보기 직렬화 쓰는 이유 : 기존의 정보를 그대로 영속화 할때 사용한다. 직렬화된 객체는 네트워크로 전달 할 수 도 있으며 역직렬화하여 객체를 바로 사용할 수 있다. 서블릿 세션들은 대부분 세션의 Java 직렬화를 지원하고 있습니다. 단순히 세션을 서블릿 메모리 위에서 운용한다면 직렬화가 필요없지만, 파일로 저장하거나 세션 클러스터링, DB를 저장하는 옵션등을 선택하게 되면 세션 자체가 직렬화되어 저장되어 전달됩니다. 캐시에서도 직렬화는 사용됩니다. 주로 DB를 조회한 후 가져온 데이터 객체 같은 경우 실시간 형태로 요구하는 데이터가 아니라면 메모리, 외부 저장소, 파일 등을 저장소를 ..
예외 예외를 효과적으로 활용하는 지침 예외는 진짜 예외 상황에서만 사용하라 예외는 오직 예외 상황에서만 써야한다. 절대로 일상적인 제어 흐름용으로 쓰여서는 안된다. 표준적이고 쉽게 이해되는 관용구를 사용하라. 예외는 예외 상황에 쓸 용도로 설계되었으므로 최적화에 별로 신경 쓰지 않았을 가능성이 크다. 또한 코드를 try-catch 블록 안에 넣으면 JVM이 적용할 수 있는 최적화가 제한 된다. 잘 설계된 API라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없게 해야 한다. 특정 상태에서만 호출할 수 있는 '상태 의존적' 메서드를 제공하는 클래스는 '상태 검사' 메서드도 함께 제공해야 한다. 예를 들어 Iterator 인터페이스의 next와 hasNext가 각각 상태 의존적 메서드와 상태 검..
일반적인 프로그래밍 원칙 자바 언어의 핵심 요소를 다룬다 지역변수의 범위를 최소화하라 자바에서는 문장을 선언할 수 있는 곳이면 어디서는 변수를 선언 할 수 있다. 따라서 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성은 높아지고 오류 가능성은 낮아진다. 지역변수 범위 최소화 방법 지역변수의 범위를 줄이는 가장 강력한 기법은 '가장 처음 쓰일 때 선언하기'이다. 거의 모든 지역변수는 선언과 동시에 초기화해야 한다. 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다. try-catch문은 이 규칙에서 예외이다. 메서드를 작게 유지하고 한 가지 기능에 집중하는 것이다. 메서드를 기능별로 작게 쪼개자. * 추가 tip 반복문은 변수 범위를 최소화해준다, 따라서 반복 변수의..
메서드 메서드를 설계할 때 주의 할점 매개변수가 유효한지 검사하라 오류는 가능한 빨리(발생한 곳에서) 잡아야 한다. 오류를 즉시 잡지 못하면 해당 오류를 감지하기 어려워지고, 감지하더라도 오류의 발생 지점을 찾기 어려워 진다. 메서드 몸체가 실행되기 전에 매개변수를 확인한다면 잘못된 값이 넘어왔을 때 즉각적으로 예외를 던질 수 있다. 매서드가 직접 사용하지는 않으나 나중에 쓰기 위해 저장하는 매개 변수는 특히 더 신경 써서 검사해야 한다 정리 매서드나 생성자를 작성할 때면 그 매개변수들에 어떤 제약이 있을 지 생각해야 한다. 그 제약들을 문서화하고 메서드 시작 부분에서 명시적으로 검사해야 한다. 적시에 방어적 복사본을 만들라 클라이언트가 우리의 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프..