본문 바로가기

Java

(13)
[작성중] Java ThreadLocal ThreadLocal은 각 thread마다 별도의 저장공간을 갖는다고 생각하면 쉽다. ThreadLocal을 사용하는 기본적인 패턴 1. ThreadLocal 객체 생성 ThreadLocal은 제네릭 클래스로 정의되어 있어 특정 데이터 타입에 대한 지역 스레드 변수를 만들 수 있다. 예를 들면, 다음과 같이 사용할 수 있다. private static ThreadLocal threadLocalVariable = new ThreadLocal(); 2. 값 설정 (Set) set 메소드를 사용하여 현재 스레드의 지역 변수에 값을 설정한다. threadLocalVariable.set("This is a thread-local value"); 3. 값 얻기 (Get) get 메소드를 사용하여 현재 스레드의 지역..
Java Runtime Data Area Java Runtime Data Area란? JVM은 Java 컴파일러가 컴파일한 바이트코드를 Class Loader를 이용하여 메모리(Runtime Data Area)에 실행 가능한 상태로 적재한다. Runtime Data Area는 JVM이 프로그램을 수행하기 위해서 운영체제(OS)에서 별도로 할당받은 메모리 영역이다. JVM의 메모리 구조 1. 프로그램 실행시, JVM은 OS로부터 메모리를 할당한다. 2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일한다. 3. Class Loader를 통해 JVM Runtime Data Area로 로딩한다. 4. 로더에 의하여 로딩 된 .class들은 Execution Engine을 통해 Interpret(번역) ..
[작성중] JVM(Java Virtual Machine) 컴파일러 컴파일러는 고급 언어로 작성된 프로그램 전체를 목적 프로그램으로 번역한 후, 링킹 작업을 통해 컴퓨터에서 실행 가능한 실행 프로그램을 생성한다. 번역 실행 과정을 거쳐야 하기 때문에 번역 과정이 번거롭고 번역 시간이 오래 걸리지만, 한번 번역한 후에는 다시 번역하지 않으므로 실행 속도가 빠르다. 인터프리터 인터프리터는 고급 언어로 작성된 프로그램을 한 줄 단위로 받아들여 번역하고, 번역과 동시에 프로그램을 한 줄 단위로 즉시 실행시키는 프로그램이다. 줄 단위로 번역, 실행되기 때문에 시분할 시스템에 유용하며 원시 프로그램의 변화에 대한 반응이 빠르다. 번역 속도는 빠르지만 프로그램 실행 시 매번 번역해야 하므로 실행 속도는 느리다. CPU의 사용시간의 낭비가 크다. Write once, run ..
Ch 18.10 객체 스트림 객체를 입출력할 수 있는 보조 스트림 ObjectOutputStream: 바이트 출력 스트림과 연결되어 객체를 직렬화한다. 직렬화(serialization): 객체를 출력하기 위해 필드값을 일렬로 늘어선 바이트로 변경하는 것 ObjectInputStream: 바이트 입력 스트림과 연결되어 객체를 복원하는 역직렬화를 한다. 역직렬화(deserialization): 직렬화된 바이트를 객체의 필드값으로 복원하는 것 ObjectInputStream ObjectInputStream의 readObject() 메소드: 읽은 바이트를 역질렬화해서 객체를 생성한다. readObject() 메소드의 리턴 타입은 Object이기 때문에 구체적인 타입으로 아래와 같이 강제 타입 변환해야 한다. 객체타입 변수 = (객체타입) ..
Ch 18.1 입출력 스트림 ~ 18.3 바이트 입력 스트림 이것이 자바다를 읽고 정리한 글 입니다. 18.1 입출력 스트림 자바에서는 입력 스트림과 출력 스트림을 통해서 데이터를 입출력한다. 스트림(Stream)은 단방향으로 데이터가 흐르는 것을 말한다. 입력 스트림: 프로그램을 기준으로 데이터가 들어오는 것 출력 스트림: 프로그램을 기준으로 데이터가 나가는 것 프로그램이 다른 프로그램과 데이터를 교환하려면 양쪽 모두 입력 스트림과 출력 스트림이 필요하다. 어떤 데이터를 입출력하는지에 따른 스트림의 종류 바이트 스트림: 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 입출력할 때 사용 문자 스트림: 문자만 입출력할 때 사용 자바에서는 데이터 입출력과 관련된 라이브러리를 java.io 패키지에서 제공하는데, java.io 패키지는 바이트 스트림과 문자 스트림을 ..
2.2 정수 타입의 2진수 표현 변수는 선언될 때 저장할 수 있는 값의 종류와 저장되는 값의 허용 범위가 달라진다. 자바에서는 정수, 실수, 논리값을 저장할 수 있는 기본타입을 제공한다. 정수 타입은 총 5개로, 메모리 할당 크기와 저장되는 값의 범위를 가지고 있다.(byte, short, char, int, long) 정수 타입의 메모리 사용 크기순으로 나열하면 아래와 같다. 종류 byte short int long 메모리 사용 크기(단위 bit) 8 bit(1byte) 16 bit(2byte) 32 bit(4byte) 64 bit(8byte) 메모리의 크기를 n이라고 할 때, 아래의 그림과 같이 정수 타입은 2진수로 저장된다. 최상위 bit가 1인 음수의 경우, 나머지 7개의 bit를 모두 1의 보수(1은 0, 0은 1)로 바꾸고 ..
[작성중] HashSet의 내부구조 HashSet과 HashMap HashSet은 내부에 HashMap을 가지고 있다. HashMap이란 Hash를 활용한 Map을 의미한다. HashMap은 key만 있다면 해싱함수를 통해 바로 해당 인덱스의 위치로 이동할 수 있다. key를 통해서 인덱스를 산출한 후, 데이터에 접근하면 시간복잡도가 O(1)이다. 따라서 HashMap의 데이터 접근 성능은 정말 뛰어나다고 할 수 있다. Map Key, Value 쌍으로 이루어진 자료형으로서, 순서를 보장하지 않으며, 키는 중복이 허용되지 않고, value는 중복이 허용된다. Hash 해시 함수를 사용하여 임의의 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑한 값 HashMap 내부에서 한 hashcode index에 모인 객체들을 보관할 때, J..
Ch17.11 요소 커스텀 집계 ~ 17.13 요소 병렬 처리 이것이 자바다를 읽고 정리한 글 입니다. 17.11 요소 커스텀 집계 스트림에서는 다양한 집계 결과물을 만들 수 있도록 reduce() 메소드를 제공한다. 매개값인 BinaryOperator는 함수형 인터페이스이다. BinaryOperator는 2개의 매개값을 받아 하나의 값을 리턴하는 apply() 메소드를 가지고 있기 때문에 아래와 같이 람다식을 작성할 수 있다. BinaryOperator에 대한 자세한 설명은 BinaryOperator 글에 정리해두었다. (a, b) -> {...return 값;} 또는 (a, b) -> 값 // return문만 있을 경우 중괄호와 return 키워드 생략 가능 reduce()는 스트림에 요소가 없을 경우 예외가 발생하지만, identity 매개값이 주어지면 이 값..
Ch17.8 요소를 하나씩 처리(루핑) ~ 17.10 요소 기본 집계 이것이 자바다를 읽고 정리한 글 입니다. 루핑(looping)이란 스트림에서 요소를 하나씩 반복해서 가져와 처리하는 것을 말한다. 루핑 메소드에는 peek()과 forEach()가 있다. 리턴 타입 메소드(매개변수) 설명 Stream InsStream DoubleStream peek(Consumer
Ch17.5 요소 걸러내기(필터링) ~ 17.7 요소 정렬 이것이 자바다를 읽고 정리한 글 입니다. 17.5 요소 걸러내기(필터링) 필터링: 요소를 걸러내는 중간 처리 기능 1) distinct() - 요소의 중복을 제거한다. - 객체 스트림(Stream)일 경우, equals() 메소드의 리턴값이 true이면 동일한 요소로 판단한다. - IntStream, LongStream, DoubleStram은 같은 값일 경우 중복을 제거한다. 2) filter() - 매개값으로 주어진 Predicate가 true를 리턴하는 요소만 필터링한다. Predicate 모든 Precidate는 매개값을 조사한 후, boolean을 리턴하는 test() 메소드를 가지고 있다. Predicate를 람다식으로 표현하기 T -> {...return true} 람다식에서는 return만..