본문 바로가기

Java

(41)
[Java] LocalDateTime JDK8에서는 기존 java.util.Data, java.util.Calendar 클래스보다 개선된 날짜와 시간 API가 제공된다. JDK의 기본 날짜 클래스의 문제점 1. 불변 객체가 아니다. set으로 변경이 가능하다는 점은 누군가 악의적으로 변경할 수 있기 때문에 get/set 메서드에서 직접 Date클래스를 사용하는 것이 위험하다. 2. 상수 필드 남용 calendar.add(Calendar.SECOND, 2); 3. 헷갈리는 월 지정 1월을 0으로 표현하는 문제 + Calendar.OCTOBER로 월을 지정하지만 실질적인 값은 9(!=10)인 문제 4. 일관성 없는 요일 상수 어디서는 일요일이 0, 어디서는 일요일이 1 5. Date와 Calendar 객체의 역할 분담 다소 치명적인데 년/월/일..
[Java] Optional java.util.Optional 클래스 Optional 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class)이다, 따라서 Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있다. 이러한 Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있다. 즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있다. Optional 객체의 생성 of() 메소드나 ofNullable() 메소드를 사용하여 Optional 객체를 생성할 수 있다. of() 메소드는 null이 아닌 명시된 값을 가지는 Optional 객체를 반환한다. 만약 of..
[Java] 입력 뜯어보기(Scanner, InputStream, BufferdReader) Java 인코딩에 대해 알아야 아래의 내용이 이해된다. Java는 String을 처리할 때 내부(메모리 상에)에서는 UTF-16 BE 인코딩으로 문자열을 저장(인코딩 할때 널 문자가 나타나지 않기 위해서)하고, 송수신에서는 직렬화가 필요한 경우 UTF-8(modified UTF-8)을 사용하며 문자열을 입/출력할 때에만 사용자가 지정한 인코딩 값 또는 운영체제의 기본 인코딩 값으로 문자열을 인코딩 한다. 결과적으로 자바 메모리에 올라갈 때의 과정을 간단히 설명하자면 다음과 같다. 이클립스의 File encoding 이 UTF-8 이라면 입력(UTF-8) -> 송수신(modified UTF-8) -> 자바 메모리 (UTF-16) -> 송수신(modified UTF-8) -> 출력(UTF-8) 즉, 운영체제..
[Java] 스트림(Stream) 자바 8에서 추가된 스트림(Stream)은 람다를 활용할 수 있는 기술 중 하나이다. 자바 8이전에는 배열, 컬렉션 인스턴스를 다루는 방법은 for 또는 foreach 문을 돌면서 요소 하나씩 꺼내서 다루는 방법이였다. 이 방법식으로 작성된 코드는 너무 길고 알아보기 어렵다. 그리고 재사용성도 떨어진다. 이전 방식들의 문제를 해결하기 위해서 너무 길고 알아보기 어렵다. 그리고 재사용성도 떨어진다. 각 컬렉션 클래스에는 같은 기능의 메서드들이 중복되어 정의되어 있다. 스트림 특징 1. 스트림은 외부 반복을 통해 작업하는 컬렉션과는 달리 내부 반복(internal iteration)을 통해 작업을 수행합니다. 2. 스트림은 재사용이 가능한 컬렉션과는 달리 단 한 번만 사용할 수 있습니다. 3. 스트림은 원본..
[Java] 람다식(Lambda expression) 하나의 메서드만 포함하는 익명 클래스의 경우 구문이 다루기 어렵고 불문명해 보이는 문제가 있다. 이 문제를 해결하기 위해서 Lambda Expression을 사용하면 메서드 인수, 코드를 데이터로 처리할 수 있다. Lambda Expression을 사용하면 단일 메서드 클래스의 인스턴스를 보다 간결하게 표현할 수 있다. Lambda Expressions (The Java™ Tutorials > Learning the Java Language > Classes and Objects) The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvem..
[Java] 쓰레드(Thread) - 2/2 (동기화) 동기화(synchronization) 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것이다. 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않게 해주는 개념이 임계 영역(critical section, synchronized 구간), 잠금(락, lock) 이다. 자바의 모든 객체(인스턴스, 클래스)는 락을 가지고 있다. synchronized 블록은 객체 단위로 락을 다룬다. Lock : 공유 자원에 한번에 한 쓰레드만 read, write를 수행 가능하도록 한다. 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것을 '쓰레드의 동기화(synchronization)'이라고 한다. 쓰레드 실행(main) Class public class Th..
[Java] JVM메모리 구조 JVM 응용프로그램이 실행되면, 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 이 메모리를 용도에 따라 여러 영역으로 나누어 관리 Stack 차곡차곡 쌓인다. LIFO(Last In, First Out) JVM의 메모리 구조 메소드 영역(Method Area) 클래스 정보와 클래스 변수가 저장되는 곳 호출 스택(Call Stack) 메소드의 작업공간 메소드가 호출되면 호출 스택에 메모리 할당 종료되면 사용하던 메모리 반환함 힙(Heap) 인스턴스가 생성되는 공간 new연산자에 의해서 생성되는 배열과 객체는 모두 여기에 생성됨 호출 스택의 특징 메소드가 호출되면 수행에 필요한 메모리를 스택에 할당받는다. 메소드가 수행을 마치면 사용했던 메모리를 반환 호출 스택의 제일 위에 있는 메소드가 현재..
[Java] 쓰레드(Thread) - 1/2 (프로세스, 쓰레드, 데몬쓰레드) 프로세스(process) 실행 중인 프로그램 프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)을 할당받아 프로세스가 된다. 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원, 쓰레드로 구성되어 있다. 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스라고 한다. 멀티 쓰레딩의 장단점 장점 CPU의 사용률을 향상시킨다. 자원을 보다 효율적으로 사용할 수 있다. 사용자에 대한 응답성이 향상된다. 작업이 분리되어 코드가 간결해진다. 단점 동기화(synchronization), 교착상태(deadlock)와 같은 문제들이 발생할 수 있다. 구현방법 2가지 Thread 클래스 상속 Runnable 인터페이스 구현 Runnable 인터페이스를 구현하는 방법이 더 좋다. 재사용성(reusabilit..