반응형

분류 전체보기 277

컴포짓(composite) 패턴

컴포짓 패턴(Composite Pattern) 이란? 그룹 전체와 개별 객체를 동일하게 처리할 수 있는 패턴 클라이언트 입장에서는 "전체" 나 "부분"이나 모두 동일한 컴포넌트로 인식할수 있는 계층 구조를 만든다(Part-Whole Hierarchy) 컴포짓 패턴을 사용하면 클라이언트 측에서 모든 데이터를 모르더라도 복잡한 트리구조를 쉽게 다룰 수 있다. 컴포짓 패턴(Composite Pattern)은 언제 사용하는가? 복합 객체와 단일 객체의 처리 방법이 다르지 않을 경우, 전체-부분 관계로 정의할 수 있다. 새로운 leaf 로써의 클래스를 추가하더라도 클라이언트는 상위 추상화된 인터페이스 만을 바라보기 때문에 OCP 를 준수할 수 있다. 컴포짓 패턴(Composite Pattern) 장점과 단점 장점..

디자인패턴 2022.07.30

의존관계 자동 주입

의존 관계 주입 4가지 1. 생성자 주입 2. 수정자 주입 (setter) 3. 필드 주입 4. 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법 특징 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다. 불변, 필수 의존관계에 사용 생성자가 딱 1개만 있으면 @Autowired를 제외 시킬수 있다. @Component public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberReposit..

Spring 2022.07.24

브릿지(Bridge)패턴

브릿지 패턴 (Bridge Pattern) 이란? 추상적인 것과 구체적인 것을 구분하는 패턴 구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 한다. 기능과 구현에 대해서 두 개의 별도의 클래스로 구현을 한다. 브릿지 패턴의 특징 브리지 패턴은 복합 객체를 다시 재정의하여 추상 계층화된 구조이다. 구성 클래스의 연결 부분을 추상 클래스로 변경한다. 이를 통해 각각의 계층이 독립적으로 확장 및 변경 가능 해진다. 브리지 패턴은 기능을 처리하는 클래스와 구현을 담당하는 추상 클래스로 구별한다. 구현 뿐 아니라 추상화도 독립적 변경이 필요할 때 브릿지 패턴을 사용한다 브릿지는 상속 대신 구현을 통해 분리된 객체를 연결한다. 구현을 통해 객체를 연결하면 객체간 종속 관계를 제거할 수..

디자인패턴 2022.07.20

싱글톤 컨테이너

싱글톤 패턴 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴 이다. 그래서 객체 인스턴스르 2개 이상 생성하지 못하도록 해야한다. pricate 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야한다. public class SingletonService { //1. static 영역에 객체를 딱 1개만 생성 private static final SingletonService instance = new SingletonService(); //2. public 으로 열어서 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한다. public static SingletonService getInstance() { return instance; ..

Spring 2022.07.10

스프링 컨테이너와 스프링 빈

스프링 컨테이너란? 스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 한다. 여기서 말하는 자바 객체를 스프링에서는 빈(Bean)이라고 부른다. 개발자는 new 연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸시킬 수 있는데, 스프링 컨테이너가 이 역할을 대신해 준다. 즉, 제어 흐름을 외부에서 관리하고 객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 만들어 준다. 스프링 컨테이너의 종류 BeanFactory와 ApplicationContext가 있다. BeanFactory는 빈을 등록하고 생성하고 조회하고 돌려주는 등 빈을 관리하는 역할이다. getBean() 메서드를 통해 빈을 인스턴스화 할수 있다. Ap..

Spring 2022.07.10

프로토타입(Prototype) 패턴

프로토타입 패턴 이란? 인스턴스를 사용해 새롭게 생성할 객체의 종류를 명시하여 새로운 객체가 생성될 시점에 인스턴스의 타입이 결정되도록 하는 패턴이다. 적용 가능한 경우 1. 코드가 복사해야 하는 구현 클래스에 의존하지 않아야 하는 경우 프로토타입 패턴을 사용할 수 있다. 이 경우는 코드가 인터페이스를 통해 써드파티 코드와 함꼐 작동할 경우 많이 발생한다. 2. 객체를 초기화 하는 방식만 다를뿐 서브클래스의 수를 줄이려는 경우 프로토타입 패턴을 사용할 수 있다. 장단점 장점 복한 객체를 만드는 과정을 숨길 수 있다 기존 객체를 복제하는 과정이 새 인스턴스를 만드는 것보다 비용(시간 또는 메모리)적인 면에서 효율적일 수도 있다 추상적인 타입을 리턴할 수 있다 단점 복제한 객체를 만드는 과정 자체가 복잡할 ..

디자인패턴 2022.07.08

Optional

Optional 이란? 오직 값 한 개가 들어있을 수도 없을 수도 있는 컨테이너 NullPointerException 개발하면서 가장 많이 괴롭히는 예외 중 하나가 NPE(NullPointerException) 이다. 이를 피하기 위해서는 어떤 방법이 있었을까? Test t = null; System.out.println("t = " + t.v); // NPE 발생 //예외 처리 로직 if( t == null) { System.out.println("Test is NULL"); } else { System.out.println(" t = " + t.v); } NPE를 해결하기 위하여 위와 같이 if...else 문으로 null을 검사하는 예외 처리 로직을 추가해야한다. 하지만 이 방법으로는 null값을 ..

Language/Java 2022.07.02

Java8 Stream

Stream 이란? 컬렉션, 배열등에 대해 저장되어있는 요소들을 하나씩 참조하며 반복적인 처리를 가능하게 하는 기능이다. Stream을 이용한다면 불필요한 for문과 그 안에서 이루어지는 if문 등의 분기 처리를 쓰지 않고도 깔끔하게 직관적인 직관적인 코드로 변형할 수 있다. Stream API 사용법 Stream API는 데이터, Stream생성(), 중개연산()...종료연산(); 구조로 사용된다. Stream 특징 데이터를 담고 있는 저장소 (컬렉션)이 아니다 Funtnional in nature 스트림이 처리하는 데이터 소스를 변경하지 않는다 스트림으로 처리하는 데이터는 오직 한번만 처리한다 무제한일 수도 있다(Short Circuit 메소드를 사용해서 제한할 수 있다 중개 오퍼레이션은 근본적으로 ..

Language/Java 2022.07.02

추상 팩토리 & 팩토리 메서드 패턴 & 팩토리 패턴 정의

팩토리 패턴이란? 클래스의 인스턴스를 만드는 것을 서브클래스에서 결정하도록 한다는 것이다. 즉, new 키워드를 사용하는 부분을 서브클래스에 위임함으로서 객체 생성을 캡슐화하고 구상 클래스에 대한 의존성이 줄어든다는 이점을 얻을 수 있다. 팩토리 패턴에는 2가지 종류가 있다. 팩토리 메서드 패턴 추상 팩토리 패턴 팩토리 메서드 패턴 객체를 생성하는 인터페이스는 미리 정의하되, 객체 생성은 서브클래스(팩토리)로 위임하는 패턴 객체를 생성해서 반환하는 것을 말한다. 즉, 결과값이 객체인 것이다 팩토리는 인터페이스로 추상화되어 구체 팩토리의 변경을 유연하게 한다. 클라이언트는 결과적으로 어떤 객체가 생성될 것인지 알 필요가 없는 것이 특징이다. 추상 팩토리 패턴 서로 연관되거나 의존적인 객체들의 조합을 만드는..

디자인패턴 2022.06.19

인터페이스 기본 메소드와 스태틱 메소드

기본 메서드 (Default Methods) 인터페이스에 메소드 선언이 아니라 구현체를 제공하는 방법 해당 인터페이스를 구현한 클래스를 깨트리지 않고 새 기능을 추가할 수 있다. 기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있다 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있다. 반드시 문서화 할 것. (@implSpec 태그 사용) /** * @IimplSpec * getName()으로 가져온 문자열을 대문자로 바꿔 출력 */ public interface Foo { void printName(); default void printNameUpperCase(){ System.out.println (getName().toUpperCase()); } String getNa..

Language/Java 2022.06.19
반응형