본문 바로가기

전체 글

(142)
[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..
[Java] 애너테이션(Annotation) 자바를 개발한 사람들은 소스코드에 대한 문서를 따로 만들기보다 소스코드과 문서를 하나의 파일로 관리하는 것이 낫다고 생각했다. 그래서 소스코드의 주석'/** ~ */'에 정보를 저장하고, 주석으로부터 HTML문서를 생성해내는 프로그램(javadoc.exe)을 만들어서 사용했다. (메타 데이터) 소스코드에서 비즈니스 로직에는 영향을 주지는 않지만 해당 타겟의 연결 방법이나 소스코드의 구조를 변경할 수 있다. 용도 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보 제공 SW 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공 런타임시 특정 기능을 실행하도록 정보를 제공
[Java] 지네릭스(Generics) 컴파일 시간에 더 많은 버그를 감지할 수 있도록 하여 코드에 안정성을 추가한다. 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크(compile-time type check)를 해주는 기능이다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다. 장점 컴파일에서 더 강력한 유형 검사 케스트 제거 프로그래머가 일반 알고리즘을 구현할 수 있도록 지원 제한 제네릭 형식의 변수는 참조 타입(Reference Types)만 인스턴스를 생성할 수 있다. 기본 타입(Primitive Types) 생성 불가 참조 : Object는 사용 가능한 가장 일반적인 유형이고 기본 유형으로 확장되지 않기 때문에 제네릭이 참조 유형에 대해서만 작동할 수 ..