본문 바로가기

728x90
반응형

공부 정리

(141)
Java 8에 등장한 Optional이란? 개요 Java 8에 Optional이 새로 등장했습니다. 어떤 문법인지 어떤 경우에 사용하는지 정리합니다. 코드 가독성을 높이고 널 포인트 예외를 방어해보자 널(Null)은 값이 없음을 가리키며 널 참조는 많은 문제의 원인이 됩니다. 따라서 Java 8에서는 이런 문제점을 일부 해결하기 위해서 java.util.Optional을 만들었습니다. 다음과 같은 코드가 있다고 가정해보겠습니다. String version = computer.getSoundcard().getUSB().getVersion(); 코드에는 문제가 없지만 많은 컴퓨터는 사운드 카드를 가지고 있지 않습니다. 그렇다면 getSoundcard()는 어떻게 될까요? 대게의 경우 null을 리턴해서 사운드 카드가 없다는 것을 가리켰습니다. 불행히..
자바 8에 추가된 Date Time API 개요 자바 8의 변화 중 Date와 Time이 새롭게 추가되었습니다. 기존에 어떤 방식을 사용하였고, 어떻게 개선되었는지 확인해보겠습니다. 기존의 Date API와 새로운 API 기존의 Date API는 java.util에 속해 있습니다. java.util.Date - 날짜와 시간, 기본 시간대를 사용하여 출력 java.util.Calendar - 날짜와 시간, 날짜를 조작하는데 더 많은 메소드 제공 java.text.SimpleDateFormat - 날짜와 달력을위한 형식 (날짜 -> 텍스트), 변환 (텍스트 -> 날짜) 자바 8에서는 JSR310(Joda-time을 참고)이 새로 만들어졌으며 java.time 패키지에 담겨 있습니다. java.time.LocalDate - 날짜(시간 포함하지 않음),..
JVM의 구조 개요 자바는 JVM에서 작동하는 프로그램으로, JVM의 내부 구조를 알아보겠습니다. JVM 설계도 JVM은 크게 클래스 로더 시스템(Class Loader SubSystem), 런타임 데이터 공간(Runtime Data Areas), 실행 엔진(Execution Engines) 3가지로 분류 할 수 있습니다. 클래스 파일을 읽는 것부터, 분석과 실행의 과정을 확인해보겠습니다. 아래 사진은 JVM의 설계도입니다. 1. 클래스 로더 시스템(Class Loader SubSystem) 클래스 로더 시스템은 자바 클래스를 JVM의 Runtime Data Area에 동적으로 로드합니다. 컴파일 시점이 아닌 런타임 시점에 참조하고 있는 클래스를 로딩, 링킹, 초기화를 통해 로드합니다. 클래스 로더 덕분에 런타임에 파..
Java 8에서 개선된 가비지 컬렉터는? 개요 Java 8은 2014년 3월에 출시되었으며, Java 7과 다른 가비지 컬렉터 구조를 가집니다. 대표적으로 Java 7의 PermGen이 Java 8에서 Metaspace로 대체되었습니다. 어떤 차이가 있는지 알아보겠습니다. PermGen PermGen(Permanent Generation)은 클래스와 메서드 메타 데이터, static 내용들이 저장되는 힙에서 분리된 별도의 힙 공간입니다. 또한 바이트코드, 이름, JIT 정보를 저장합니다. 기본 최대 메모리 크기는 32bit에서 64MB, 64bit에서 82MB입니다. JVM의 메모리 크기를 다음 명령어로 설정할 수 있습니다. -XX:PermSize=[size] is the initial or minimum size of the PermGen s..
가비지 컬렉터(Garbage Collector) - 2 개요 앞서 가비지 컬렉터의 과정 및 사용 방법을 알아보았습니다. 이번 시간에는 Old 영역에서 가비지 컬렉터 알고리즘을 알아보겠습니다. 버전은 Java 7 기준입니다. 목차 Serial Collector Parallel Collector Parallel Old Collector CMS Collector G1 Garbage Collector 1. Serial Collector(-XX:+UseSerialGC) Serial collector는 단 하나만의 쓰레드를 사용하며 다른 쓰레드들과 통신할 일이 없기 때문에 효율적인 방법입니다. 하나의 단일 프로세서에 사용하기에 적합하며 대신에 멀티 프로세서의 이점은 이용할 수 없습니다. (약 100MB의 작은 데이터 부분의 어플리케이션의 멀티 프로세서에서는 가능합니다...
가비지 컬렉터(Garbage Collector) - 1 개요 C, C++ 등의 언어는 메모리 관리를 위해 프로그래머가 객체의 생성뿐 아니라 삭제도 해야 합니다. 하지만, 가끔 삭제를 제대로 하지 않으면 새로운 객체가 생성될 메모리가 적어지고 OutOfMemoryErrors 오류가 납니다. 자바에서는 자동적으로 객체의 메모리 점유를 초기화(free)해주는 Garbage Collector가 존재합니다. 개발자가 직접 할당된 객체의 메모리를 제거하지 않기 때문에 좀 더 코드 구현에 집중할 수 있습니다. 삭제 알고리즘은 다양하며, 객체에 다양한 reference 수준을 설정하여 좀 더 최적화된 GC를 사용할 수 있습니다. 이번 글에서 GC가 어떻게 동작하여 객체를 삭제하는지 알아보겠습니다. 목차 가비지 컬렉터란? Reference Counting Algorithm ..
Array vs ArrayList 개요 Array와 ArrayList의 차이점을 알아보겠습니다. ArrayList는 내부적으로 Array로 구현합니다. 1. Array는 길이가 고정된 자료구조인 반면, ArrayList는 가변 컬렉션 클래스입니다. Array는 한번 만들어지면 길이를 변경할 수 없지만, ArrayList는 용량이 다 차면 스스로 사이즈를 늘립니다. (엄밀히 말해서 Array는 length이고, ArrayList는 size입니다.) ArrayList에서 사이즈를 늘리는 것은 성능이 다소 저하됩니다. ArrayList의 내부가 Array로 구현되어 있는데, 새로운 Array를 만들고 이전 값들을 모두 새로운 Array로 복사하기 때문입니다 2. Array에서 Generics를 사용 할 수 없습니다. 타입이 정해져 있으며, 변..
HashSet은 내부가 어떻게 구현이 되어 있는가? 개요 HashSet의 내부 구조를 알아보겠습니다. HashSet은 구현 시, HashMap을 이용합니다. HashSet 특징 HashSet 클래스는 Set 인터페이스를 구현하고, 내부적으로 hash table을 사용합니다(실제로는 HashMap입니다.) set의 저장 순서가 보장되지 않습니다. null 요소를 허용합니다 해쉬 함수가 버킷에 요소를 적절하게 분배한다면, add, remove, contains, size 등에 시간 성능이 좋습니다. HashSet 순회는 요소의 개수와 버킷의 용량을 합친 만큼 시간이 듭니다. 따라서, 순회 성능이 중요하다면, 초기에 너무 높은 용랑을 설정하지 않도록 합니다. HashSet은 동기화가 되지 않습니다. 멀티 쓰레드 환경에서 동시에 접근하고, 최소한 1개의 쓰레드가..

728x90
반응형