본문 바로가기

전체 글154

[디자인패턴] 템플릿 메소드 패턴 (Tempalate Method Pattern) 목적 알고리즘의 뼈대를 정의하고, 일부를 서브 클래스로 위임. 알고리즘의 구조를 변경하지 않고 알고리즘의 일부 내용을 서브 클래스에서 재정의 할 수 있도록 함 요소 문제 : 알고리즘들을 캡슐화시키면서 중복되는 코드가 여러 클래스에 존재함 해결 : 알고리즘의 중복되는 부분을 부모 클래스에 캡슐화, 달라지는 부분만 서브 클래스에 구현 결과 : 중복되는 코드를 줄임 정의 추상 클래스에서 고정된 알고리즘 즉, 알고리즘 뼈대를 구현 - templateMethod. 구현체마다 다를 수 있는 primitivOperation은 추상 메소드로 구현 상속받은 Concrete 클래스는 primitiveOperation 메소드를 구현하여 전체 알고리즘을 완성한다. 음료 레시피 구현 "물을 끓인다 (boilWater)"와 "컵.. 2021. 12. 11.
[디자인패턴] 상태 패턴 (State Pattern) 목적 객체의 내부 상태가 바뀔 때 객체의 동작을 변경할 수 있도록 함. 객체는 자신의 클래스를 바꾸는 것 처럼 보임. 요소 문제 : 상태가 여러개 있고, 이를 if 문으로 통제함 해결 : 상태를 한 곳에서 관리 결과 : 변경 최소화 정의 A상태의 handle과 B상태의 handle의 동작이 다르다. -> 상태가 다르면 객체의 동작이 다름 뽑기 기계 구현 뽑기 기계는 4 가지의 상태(매진, 동전없음, 동전있음, 판매)가 있고, 다음의 4 가지 메소드(동전 투입, 반환, 손잡이 돌림, 알맹이 내보냄)가 있다. 상태 패턴을 사용하지 않고 이를 구현하려면 메소드마다 state에 대한 조건문을 구현해야 한다. (4*4 = 16가지를 구현) 만약 state가 추가된다면 조건문을 모든 메소드에 추가해야 된다 -> 문.. 2021. 12. 11.
[코틀린] 함수형 프로그래밍 - 고차 함수, 람다식 함수형 프로그래밍이란 함수형 프로그래밍(FP) 순수 함수를 작성하여 프로그램의 부작용을 줄이는 기법 정의와 특징 순수 함수를 사용해야 한다. 람다식을 사용할 수 있다. 고차함수를 사용할 수 있다. 순수 함수 같은 인자에 대하여 항상 같은 값을 반환한다 (부작용이 없는 함수) 함수 외부의 어떤 상태도 바꾸지 않는다 람다식 수학에서 람다 대수는 이름이 없는 함수로 2 개 이상의 입력을 1개의 출력으로 단순화한다는 개념 FP에서는 다음을 의미 다른 함수의 인자로 넘기는 함수 함수의 결괏값을 반환하는 함수 변수에 저장하는 함수 일급 객체에 이름이 없는 경우, 이를 '람다식' 함수 또는 '람다식'이라 부름 일급 객체 FP에서는 함수를 일급 객체로 생각한다 일급 객체의 특징 일급 객체는 함수의 인자로 전달할 수 있.. 2021. 12. 10.
[코틀린] 코틀린 함수 코틀린 함수의 기본 구조 fun 함수명([변수명: 타입], ...): [반환 타입]{ ... } fun sum(a: Int, b: Int): Int { var sum = a + b return sum } fun sum(a: Int, b: Int): Int = a + b fun sum(a: Int, b: Int) = a + b 함수 반환값 생략 fun printSum(a: Int, b: Int): Unit{ println("sum of $a and $b is ${a+b}") } fun printSum(a: Int, b: Int) { println("sum of $a and $b is ${a+b}") } 반환값이 없을 경우 코틀린의 특수한 자료형인 Unit을 반환값으로 사용. 반환값의 타입이 없을 경우 코틀.. 2021. 12. 10.
[스프링] 스프링 핵심원리 - 빈 생명주기 콜백 스프링 빈의 시작이나 끝에 함수를 호출하여 작업을 해야될 수도 있다. 빈 생명주기 콜백으로 이를 수행할 수 있다. 스프링 빈의 이벤트 라이프 사이클 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료 빈 생명주기 콜백의 방법 1. 인터페이스 (InitializingBean, DisposableBean) 2. 설정정보에 초기화 메서드, 종료 메서드 지정 @Bean(initMethod="", destroyMethod="") 3. @PostConstruct, @PreDestroy 어노테이션 3번 방법을 기본으로 사용하고, 코드를 고칠 수 없는 외부 라이브러리를 초기화, 종료해야 하면 2번 방법을 사용한다. 인터페이스 (Initializ.. 2021. 12. 10.
[코틀린] 변수와 자료형, Null 처리 코틀린에서 메인 함수는 자바와 달리 클래스 안에 생성하지 않는다. fun main(){ // 실행 내용 } 변수와 자료형 val과 var val : 초기화 후 더이상 변경할 수 없음 var : 초기화 후에도 값을 바꿀 수 있음 var/val 변수명: 타입 = 값 val number = 10 // number는 Int로 추론 var language = "Korean" // language는 String으로 추론 val secondNumber: Int = 20 // sercondNumber는 자료형을 Int로 명시적으로 지정 var name: String // 초기화하지 앙않으면 타입을 명시해야함 language = "English" // var 선언이므로 변수의 값을 재할당 할 수 있다. 타입은 기본적으로.. 2021. 12. 8.
[스프링] 스프링 핵심원리 - 의존관계 자동주입 의존관계 주입 방법 4 가지 생성자 주입 수정자 주입 (setter 주입) 필드 주입 일반 메서드 주입 기본적으로 생성자 주입을 사용하고, 가끔 옵션이 필요하면 수정자 주입을 선택한다. 생성자 주입 생성자에 @Autowired를 붙여 사용 생성자가 딱 1개 있을 경우 @Autowired를 생략해도 됨 생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다. 불변, 필수 의존관계에 사용 (필수는 null 값이 들어가면 안되는 걸 의미) 생성자 주입을 사용하면 필드에 final 키워드를 사용할 수 있다. -> 값이 설정되지 않으면 오류를 컴파일 시점에서 막아줌 롬복 @RequiredArgsConstructor를 사용하여 간단하게 생성자 주입을 설정할 수 있음 수정자 주입 (setter 주입) setter에 @.. 2021. 12. 6.
[스프링] 스프링 핵심원리 - 싱글톤 컨테이너 싱글톤 패턴 웹 애플리케이션은 여러 사용자가 요청을 하기 때문에, 이 요청 시 마다 새로운 객체를 생성해서 주게 되면 메모리 낭비가 심하다. 일반적인 DI 컨테이너를 사용하면 항상 새로운 객체를 주게 된다. 이를 싱글톤 패턴을 통해 하나의 동일한 객체를 주게끔 보장할 수 있다. 하지만, 이 싱글톤 패턴을 사용하면 문제점이 있다. 싱글톤 패턴을 구현하는 코드 자체가 많이 들어감 클라이언트가 구체 클래스에 의존하게 됨 → DIP를 위반하고, OCP를 위반할 가능성 높음 내부 속성을 변경하거나 초기화하기 어렵다 private 생성자로 자식 클래스를 만들기 어렵다 싱글톤 컨테이너 싱글톤 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤으로 관리한다. 스프링 컨테이너가 바로 싱글톤 컨테이너 역.. 2021. 12. 6.
[디자인패턴] 커멘드 패턴 (Command Pattern) 목적 요구사항(요청, 명령)을 객체로 캡슐화시킨다. 이를 통해 요구사항을 큐에 넣거나 로그를 남길 수 있으며 작업 취소 기능을 지원할 수도 있다. 사용하려₩는 객체가 많고, API가 서로 다른 경우에 사용한다. 요소 문제 : 사용 객체의 API가 서로 다름 해결 : 실행과 요청을 분리 결과 : 작은 클래스가 많아지지만, 객체 사용에 필요한 복잡성을 제거하고 감춤 (함수 이름이 동일해짐) 정의 커멘드 패턴 클래스를 가정집 리모컨 사용으로 비유 Client : 리모컨 버튼의 기능을 인지하고 버튼을 누름 Command : 버튼에 실제 사용 객체를 연결해 놓음 Invoker : 리모컨 버튼을 누르면 기능을 실행함 Receiver : TV, 전등 같은 실제 객체 Command Receiver를 알고 있고, Rec.. 2021. 12. 6.
[디자인패턴] 퍼사드 패턴 (Facade Pattern) 목적 서브 시스템을 쉽게 사용할 수 있도록 해주는 고급 수준의 인터페이스를 정의 요소 문제 : 서브시스템이 너무 많고 사용하기가 복잡함 해결 : 단순한 인터페이스를 제공하는 객체를 중간에 넣음 결과 : 최소 지식 원칙에 입각해 의존성 최소화 정의 다음과 같은 watchMovie 메소드를 갖는 Facade 클래스를 만들어서 사용한다. Facade 클래스는 여러 인터페이스를 가져다 씀. 영화를 보기위해 여러 인터페이스를 조작해야하지만, Facade 클래스로 watchMovie 메소드만 실행하여 단순화 할 수 있음. public void watchMovie(String movie) { System.out.println("Get ready to watch a movie..."); popper.on(); popp.. 2021. 12. 5.