Java

백엔드/Java

[Java] 병렬 스트림 (parallel stream)

병렬 스트림이란? 병렬 스트림이란 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림이다. 따라서 병렬 스트림을 이용하면 모든 멀티코어 프로세서가 각각의 청크를 처리하도록 할당할 수 있다. 예를 들어, 숫자 n을 인수로 받아서 1부터 n까지의 모든 숫자의 합계를 반환하는 메서드를 구현한다했을 때, public long sequentialSum(long n) { return Stream.iterate(1L, i -> i + 1) // 무한 자연수 스티림 생성 .limit(n) // n개 이하로 제한 .reduce(0L, Long::sum); // 모든 숫자를 더하는 스트림 리듀싱 연산 } 위와 같은 코드에 n이 커진다면 이 연산을 병렬로 처리하는 것이 좋을 것이다. 병렬 스트림을 ..

백엔드/Java

[Java] 리플렉션(Reflection)

리플렉션(Reflection)이란? 리플렉션(Reflection)은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API이다. 컴파일 시간이 아닌 실행시간에 동적으로 클래스의 정보를 추출할 수 있는 프로그래밍 기법이다. 리플렉션은 동적으로 클래스를 사용해야 할 때 필요하다. 즉, 작성 시점에는 어떠한 클래스를 사용해야 할지 모르지만 런타임 시점에서 클래스를 가져와서 실행해야 하는 경우 필요하다. 클래스 파일의 위치나 이름만 있다면 해당 클래스의 정보를 얻어내고, 객체를 생성하는 것 또한 가능하게 해주어 유연한 프로그래밍을 가능케 해 준다. 리플렉션은 애플리케이션 개발에서보다는 프레임워크, 라이브러리에서 많이 사용된다.왜냐하면 프레임워크, 라이브..

백엔드/Java

[Java] JVM의 Class Loader

클래스 로더란? 자바는 컴파일 타임이 아니라 런타임에 클래스 로드하고 링크하는 동적 로드를 하는 특징이 있다. 이 동적 로드를 담당하는 부분이 JVM의 클래스 로더이다. 클래스 로더는 로딩(Loading), 링킹(Linking), 초기화(Initializing) 단계를 거쳐 JVM에서 사용할 수 있게 된다. 로딩(Loading) 자바 바이트 코드(.class)를 메소드 영역에 저장한다. 각 자바 바이트 코드(.class)는 JVM에 의해 메소드 영역에 다음 정보들을 저장한다. 로드된 클래스를 비롯한 그의 부모 클래스의 정보 클래스 파일과 Class, Interface, Enum의 관련 여부 변수나 메소드 등의 정보 링킹(Linking) 검증 : 읽어 들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된..

백엔드/Java

[Java] 상속(Inheritance)과 합성(Composition)

상속과 합성의 개념 상속(Inheritance) 부모 클래스와 자식 클래스 사이의 의존성은 컴파일 타임에 해결 is-a 관계 부모클래스의 구현에 의존 결합도가 높음. 클래스 사이의 정적인 관계 부모 클래스 안에 구현된 코드 자체를 물려받아 재사용 합성(Composition) 두 객체 사이의 의존성은 런타임에 해결 has-a 관계 구현에 의존하지 않음. 내부에 포함되는 객체의 구현이 아닌 인터페이스에 의존. 객체 사이의 동적인 관계 포함되는 객체의 퍼블릭 인터페이스를 재사용 상속(Inheritance)이란 클래스 상속을 통해 자식 클래스는 부모 클래스의 자원을 물려받게 되며, 부모 클래스와 다른 부분만 추가하거나 재정의함으로써 기존 코드를 쉽게 확장할 수 있다. 그래서 상속 관계를 is-a 관계라고 표현하..

백엔드/Java

[Java] 스트림(Stream)

스트림(Stream)이란? 스트림(Stream)은 자바8 API에 새로 추가된 기능이다. 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. 또한 스트림을 이용하면 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다. 스트림은 소프트웨어 공학적으로 다음의 다양한 이득을 준다. 선언형으로 코드를 구현할 수 있다. 루프와 if 조건문 등의 제어 블록을 사용해서 어떻게 동작을 구현할지 지정할 필요 없이 '저칼로리의 요리만 선택하라' 같은 동작의 수행을 지정할 수 있다. filter, sorted, map, collect 같은 여러 빌딩 블록 연산을 연결해서 복잡한 데이터 처리 파이프라인을 만들 수 있다. 여러 연산을 파이프라인으로 연결해도 여전히 가독성과 명확성이 유지된다. ..

백엔드/Java

[Java] 런타임 데이터 영역 (Runtime Data Area)

Runtime Data Area 런타임 데이터 영역(Runtime Data Area)은 실제 클래스 파일이 적재되는 곳으로 JVM이 OS로 부터 자바 프로그램 실행을 위한 데이터와 명령어를 저장하기 위해 할당받는 메모리 공간이다. 메소드 영역 가장 먼저 데이터가 저장됨 클래스 로더에 의해 로드된 클래스, 메소드 정보와 클래스 변수 정보 저장 클래스 변수 남발 시 메모리 공간 부족할 수 있음 Java 7의 경우 부족할 수 있었으나 Java 8부터는 개선됨 프로그램 시작부터 종료될 때까지 메모리에 적재 명시적 null 선언 시 GC가 청소 모든 스레드가 공유함 힙 영역 런타임 시 결정되는 참조 자료형이 저장됨 런타임 시 결정됨에 따라 동작 중의 문제(범위 초과 참조 등)가 발생할 코드임에도 문법의 문제는 아..

백엔드/Spring

[Spring] POJO(Plain Old Java Object)

POJO(Plain Old Java Object)란? Plain Old Java Object, 간단히 POJO는 말 그대로 해석을 하면 오래된 방식의 간단한 자바 오브젝트라는 말로써 Java EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용하게 된 용어이다. 2000년 9월에 마틴 파울러, 레베카 파슨, 조쉬 맥킨지 등이 사용하기 시작한 용어로써 마틴 파울러는 다음과 같이 그 기원을 밝히고 있다. 특정 '기술'과 환경에 종속되어 의존하게 된 자바 코드는 가독성이 떨어져 유지보수가 어렵고 확장성이 매우 떨어지는 단점이 있었습니다. 이는 객체지향 언어인 자바가 객체지향의 장점들을 잃어버리게 되는 것입니다. 그래서 POJO라는 개념이 등장했..

백엔드/Java

[Java] 생성자에 매개변수가 많다면 빌더를 고려하라

점층적 생성자 패턴 정적 팩터리와 생성자에는 똑같은 제약이 하나 있다. 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 점이다. 프로그래머들은 이럴 때 점층적 생성자 패턴을 즐겨 사용했다. 필수 매개변수만 받는 생성자, 필수 매개변수와 선택 매개변수 1개를 받는 생성자, 선택 매개변수를 2개까지 받는 생성자,.. 선택 매개변수를 전부 다 받는 생성자까지 늘려가는 방식이다. public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int ca..

밝은별 개발자
'Java' 태그의 글 목록