백엔드/Java

백엔드/Java

[Java] Collection API 개선

컬렉션 팩토리 Java 9에서는 작은 컬렉션 객체를 쉽게 만들 수 있는 몇 가지 방법을 제공한다. List friends = new ArrayList(); friends.add("Raphael"); friends.add("Olivia"); friends.add("Thibaut"); 세 문자열을 저장하는데도 많은 코드가 필요하다 Arrays.asList() 메서드를 이용하면 코드를 간단하게 줄일 수 있다. List friends = Arrays.asList("Rapheal", "Olivia", "Thibaut"); 고정 크기의 리스트를 만들었으므로 요소를 갱신할 순 있지만 새 요소를 추가하거나 요소를 삭제할 순 없다. List friends = Arrays.asList("Raphael", "Olivia")..

백엔드/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] 프록시 패턴(Proxy Pattern)

프록시 패턴(Proxy Pattern) 프록시 패턴(Proxy Pattern)은 대상 원본 객체를 대리하여 대신 처리하게 함으로써 로직의 흐름을 제어하는 행동 패턴이다. 프록시(Proxy)의 사전적인 의미는 '대리인'이라는 뜻이다. 즉, 클라이언트가 대상 객체(Subject)를 직접 사용하는 것이 아니라 대상 객체에 접근하기 전에 프록시 (Proxy) 객체의 메서드를 접근한 후 추가적인 로직을 처리한 뒤 접근하게 된다. 중계 대리자를 사용하는 이유는 여러가지가 있을 수 있는데, 대리자를 사용함으로써 대상 클래스가 부가 기능에 대한 책임을 분리할 수 있고(SRP) 부가 기능의 대한 로직이 바뀌었을 때 원본 객체를 수정할 수 없는 상황일 때를 극복(OCP) 하기 위해서다. 대체적으로 다음과 같은 효과를 누릴..

백엔드/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] 옵저버 패턴(Observer Pattern)

Observer Pattern이란? 옵저버 패턴(Observer Pattern)은 옵저버(관찰자)들이 관찰하고 있는 대상자의 상태가 변화가 있을 때마다 대상자는 직접 목록의 각 관찰자들에게 통지하고, 관찰자들은 알림을 받아 조치를 취하는 행동 패턴이다. 옵저버 패턴은 여타 다른 디자인 패턴들과 다르게 일대다(one-to-many) 의존성을 가지는데, 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. Pub/Sub(발행/구독) 모델로도 알려져 있기도 하다. 이 패턴을 이해하는 데 있어 유튜브로 비유해 보면 쉽다. 유튜브 채널은 발행자(Subject)가 되고 구독자들은 관찰자(Observer)가 되는 구조로 보면 된다. 유튜버가 영상을 올리면 구독자들은 영상이 올라왔다는 변화를 감지하여 알림이 오게 ..

백엔드/Java

[Java] 전략 패턴(Strategy Pattern)

전략 패턴(Strategy Pattern) 전략 패턴은 실행(런타임) 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 행위 디자인 패턴이다. 여기서 '전략'이란 일종의 알고리즘이 될 수도 있으며, 기능이나 동작이 될 수도 있는 특정한 목표를 수행하기 위한 행동 계획을 말한다. 즉, 어떤 일을 수행하는 알고리즘이 여러 가지 일 때, 동작들을 미리 전략으로 정의함으로써 손쉽게 전략을 교체할 수 있는, 알고리즘 변형이 빈번하게 필요한 경우에 적합한 패턴이다. 전략 패턴 구조 전략 알고리즘 객체들 : 알고리즘, 행위, 동작을 객체로 정의한 구현체 전략 인터페이스 : 모든 전략 구현체에 대한 공용 인터페이스 컨텍스트(Context) : 알고리즘을 실행해야 할 때마다 해당 알고리즘과..

밝은별 개발자
'백엔드/Java' 카테고리의 글 목록