Java/Effective

    [Java Effective] 스레드(Thread)

    [Java Effective] 스레드(Thread)

    프로세스(Process)와 스레드(Thread) 프로세스는 데이터, 컴퓨터 자원, 그리고 스레드로 구성되는데, 스레드는 데이터와 애플리케이션이 확보한 자원을 활용하여 소스 코드를 실행한다. 메인 스레드(Main thread) 자바 애플리케이션을 실행하면 가장 먼저 실행되는 메서드는 main 메서드이며, 메인 스레드가 main 메서드를 실행시켜준다. 메인 스레드는 main 메서드의 코드를 처음부터 끝까지 순차적으로 실행시키며, 코드의 끝이나 return문을 만나면 실행을 종료한다. 만약 자바 소스 코드가 싱글 스레드로 작성되었다면, 오로지 메인 스레드만 가지는 싱글 스레드 프로세스가 된다. 멀티 스레드(Multi-Thread) 하나의 애플리케이션 내에서 여러 작업을 동시에 수행하는 멀티 태스킹을 구현하는 ..

    [Java Effective] 스트림(Stream)

    [Java Effective] 스트림(Stream)

    스트림이란? 스트림은 데이터의 흐름이다. 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공할 수 있다. 여러 작업을 동시에 진행하는 병렬처리가 가능하다. 즉, 쓰레드를 이용해 많은 요소들을 빠르게 처리할 수 있다. 대부분의 요소 처리 메서드는 함수형 인터페이스 매개타입을 가지기 때문에 람다식 또는 메서드 참조를 이용해서 요소 처리 내용을 매개값으로 전달할 수 있다. 컬렉션은 자료구조에 대한 구현체 즉, 데이터 소스에 해당하는 것이고 스트림은 자료구조를 다루는 방법을 제공하는 것으로 이해하면 쉽다. 스트림은 내부 반복자를 사용하므로 병렬 처리가 쉽다. 외부반복자란? 개발자가 코드로 직접 컬렉션의 요소를 반복해서 가져오는 코드 패턴 (index를 사용하는 for문, Iter..

    [Java Effective] 람다식(Lambda Expression)

    람다식이란? 메서드를 하나의 ‘식(expression)’으로 표현한 것으로 input, output만 신경쓰면 된다. 함수형 인터페이스의 인스턴스를 생성하여 함수를 변수처럼 선언하는 람다식에서는 메소드의 이름이 불필요하다. 일반 메서드와는 다르게 익명 함수이기때문에 별도의 선언이 필요 없다. 불필요한 코드를 줄이고, 가독성을 높이며, 동일 함수에 대한 재사용성이 좋아진다. 람다식 사용법 // 기존의 sum 메서드 int sum(int num1, int num2) { return num1 + num2; } // 람다식으로 변환 (int num1, int num2) -> { // 반환타입과 메서드명 제거 + 화살표 추가 return num1 + num2; } // return문과 문장뒤에 세미콜론 생략 가능..

    [Java Effective] 애너테이션(Annotation)

    애너테이션(Annotation) 애너테이션이란? 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것 애너테이션을 기능을 가지고 있는 것이라고 생각할 수 있으나 마크, 표시를 해놓는 주석일 뿐이다. 애너테이션에는 컴파일 시점에 알 수 있는 값만 들어갈 수 있다. 즉 런타임 중에 알아내야 하는 값은 사용할 수 없다. 애너테이션의 역할 컴파일러에게 문법 에러를 체크하도록 정보를 제공 프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보를 제공 런타임에 특정 기능을 실행하도록 정보를 제공 애너테이션의 종류 표준 애너테이션 자바에서 기본적으로 제공하는 애너테이션 @Override 컴파일러에게 메서드를 오버라이딩하는 것이라고 알림 @Deprecated 앞으로 사용하지 않을..

    [Java Effective] 열거체(enumeration type)

    열거체(enumeration type) 열거형 사용 배경 // 다른 범주에 속하는 상수를 정의할 때, 상수명이 중복되는 경우가 발생할 수 있다. public static final int SPRING = 1; public static final int SUMMER = 2; public static final int DJANGO = 1; public static final int SPRING = 2; // 계절의 SPRING과 중복 // 인터페이스를 사용하여 상수를 구분할 수 있지만, interface Seasons { int SPRING = 1, SUMMER = 2; } interface Frameworks { int DJANGO = 1, SPRING = 2; } // 의미적으로 서로 비교할 수 없는 개..