Lang
전략 패턴 (Strategy Pattern)
전략 패턴 (Strategy Pattern) 객체들이 할 수 있는 행위에 대해 전략 클래스를 생성하고, 유사한 클래스를 캡슐화하는 인터페이스를 정의한다.객체의 행위를 동적으로 수정하고 싶은 경우, 직접 행위를 수정하지 않고 전략을 바뀌주기만 함으로써 행동을 유연하게 확장할 수 있다. 즉, 일련의 알고리즘을 정의하고 각각을 캡슐화하고, 상호 교환 가능하게 만든다. 패턴을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있게 된다. 샘플 오리 프로그램Duck을 상속받는 RedheadDuck과 MallardDuck이 존재한다.이들은 Duck에 속하는 객체로서 공통된 quack, swim 메서드를 수행하고, display 메서드는 오버라이딩해서 각자에 맞게 사용한다. 요구사항 추가오..
[Java] Lambda 특징과 활용
람다란? (lambda)익명메서드에 이름이 없다. 람다는 메서드에 이름이 필요없기 때문에 익명 함수로 분류되며, 익명 함수는 모두 일급 객체로 취급된다.함수특정 클래스에 종속되지 않기 때문에 함수라고 부를 수 있다.하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함한다.전달람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다.이는 일급 객체의 특징과도 같다.일급 객체로 취급되기 때문에 Stream API의 매개변수로 전달이 가능하다.간결성익명 클래스처럼 판에 박힌 코드를 구현할 필요가 없다.따라서 불필요한 코드를 줄이고 가독성을 높일 수 있다. 람다의 장점과 단점장점코드의 간결성람다를 사용하면 불필요한 반복문의 삭제가 가능하며 복잡한 식을 단순하게 표현할 수 있다...
함수형 프로그래밍과 Java #1
함수형 프로그래밍 왜 Java8부터 함수형 프로그래밍을 지원하게 되었을까? 왜 Spring5 부터 WebFlux를 필두로 리액티브 프로그래밍을 지원하는 것일까? Java 8 이후로 나타난 '람다', 'Stream API' 등을 깊게 이해하기 위해서는 이들이 왜 생겨났는지를 알면 매우 좋을 것이라고 생각했다. 객체지향의 정수라고 할 수 있는 Java가 람다를 도입하고 함수형 프로그래밍을 지원한다는건 다른 언어들도 점차 함수형으로 바뀔 것을 의미한다고 생각한다. 나중에 개발 전반적으로 함수형 패러다임이 도입되었을 때 잘 사용하려면 미리 배워놓는게 중요하다. 함수형 패러다임의 중요한 포인트는 언어가 점점 발달하고 하드웨어의 스펙이 받쳐주면서 자바의 가비지 컬렉션처럼 메모리 관리를 추상화해주는 언어가 발달하게..
[디자인 패턴] 싱글톤 패턴 (Creational)
싱글톤(Singleton)전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 하고, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. 주의사항객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다.-> private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 한다.다중 스레드에서 경합 조건(Race Condition)이 발생해 인스턴스가 2개 이상 생성되는 경우를 막아야 한다. 아래 코드는 위 주의사항을 잘 지킨 예시이다.public class SingletonService { private static final SingletonService instance = new Singleto..
[Java] Runnable과 Thread의 차이
자바에서 쓰레드를 구현할 때 2가지 방법이 있다고 한다. 1. Runnable 2. Thread1. RunnableRunnable은 이름부터 인터페이스의 느낌이 강하다.implements Runnable 을 통해서 Runnable 인터페이스를 구현할 수 있다. Runnable 인터페이스를 구현하게되면재사용성이 높고, 코드의 일관성을 유지할 수 있어서 Thread보다 더 효율적인 방법이라 할 수 있다.Runnable 인터페이스는 위와 같이 생겼다.추상 메서드 run을 반드시 구현해야 한다. Thread도 run을 구현해야 한다는 점은 같지만 추상 메서드가 아니라 단순 메서드 오버라이딩으로 구현한다.Runnable 인터페이스를 구현해 스레드 구현public class Main { public stati..
[Python] Decorator (데코레이터)
데코레이터에 대해 알기전에 아래 두 포스팅을 보고 오면 이해가 빠릅니다. [Python] First-Class Function (일급 함수) 프로그래밍 언어가 함수를 일급 객체로 취급하는 경우 일급 함수를 지원한다고 한다. Python 은 일급 함수를 지원한다. (Java의 함수는 1급 객체가 아니다. Kotlin의 함수는 1급 객체라고 한다.) 일급 hyeo-noo.tistory.com [Python] Closure (클로저) 클로저를 이해하기 위해서는 일급 함수, 일급 객체에 대한 이해가 필요하다. 만약 일급함수, 일급객체를 모른다면 아래 포스팅이 도움이 될 수 있다. [Python] First-Class Function (일급 함수) 프로그래 hyeo-noo.tistory.com 데코레이터는 크게 ..
[Python] Closure (클로저)
클로저를 이해하기 위해서는 일급 함수, 일급 객체에 대한 이해가 필요하다. 만약 일급함수, 일급객체를 모른다면 아래 포스팅이 도움이 될 수 있다. [Python] First-Class Function (일급 함수) 프로그래밍 언어가 함수를 일급 객체로 취급하는 경우 일급 함수를 지원한다고 한다. Python 은 일급 함수를 지원한다. (Java의 함수는 1급 객체가 아니다. Kotlin의 함수는 1급 객체라고 한다.) 일급 hyeo-noo.tistory.com 클로저란? 클로저는 외부 함수에 접근할 수 있는 내부 함수 혹은 이러한 원리를 칭하는 용어이다. 외부 함수는 외부 함수 자신의 지역변수를 사용하는 내부함수가 소멸될때까지 소멸되지 않는다. 예를 들어 임의의 A함수 내부에 다른 B함수가 있다면 B함수..
[Python] First-Class Function (일급 함수)
프로그래밍 언어가 함수를 일급 객체로 취급하는 경우 일급 함수를 지원한다고 한다. Python 은 일급 함수를 지원한다. (Java의 함수는 1급 객체가 아니다. Kotlin의 함수는 1급 객체라고 한다.) 일급 객체(First-Class Citizen)란? 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 1. 변수나 데이터 구조에 할당할 수 있다. 2. 객체의 인자로 넘길 수 있다. 3. 객체의 리턴 값으로 리턴이 가능해야 한다. 위 3가지 조건을 만족하면 1급객체라고 할 수 있다. 일급 함수의 속성 함수는 Object 유형의 인스턴스이다. 함수를 변수에 저장할 수 있다. 함수를 다른 함수에 매개변수로 전달할 수 있다. 함수에서 함수를 반환할 수 있다. List, HashT..
[Java] 추상 클래스와 인터페이스 (abstract class & interface)
Java 추상 클래스와 인터페이스는 기능적으로 아주 유사하다.Java를 공부하면서 이 둘이 왜 나눠졌는지 이해하는건 자바 언어의 철학을 이해하는데 한 걸음 다가간다고 생각했다. 따라서 둘의 공통점 및 구분되는 특징을 조사해보고 인터페이스, 추상 클래스를 사용하는 클래스 다이어그램을 설계하고 코드로 실습을 해 보았다.인터페이스의 특징 - 동일한 기능을 가지는 객체들에 대한 기능적인 '틀'을 제공한다. A(자식) Has a B(부모) - 다중 상속이 가능하다. - 하나의 규칙으로 적용된다. - 자식 요소들과 Has a (~할 수 있는) 관계를 가진다. (자식들이 공통된 기능을 가진다.) - 즉, 상속 받는 객체들이 할 수 있는 '기능'에 대해 미리 정의한다. - 주로 '~able'로 끝나도록 명명한다. e..
[Java] Call by Reference? Call by Value!
Java에서 Call by value와 Call by reference를 구분하는 방법은 매서드의 매개변수의 자료형에 달려있다. Java에서는 개발자가 포인터를 사용할 수 없도록 되어있다. 그래서 바꾸길 원하는 값의 주솟값을 넘길 수 없다. 아래 코드를 보자class Number{ public void increase(int count){ count++; }}public class Main { int count = 0; public static void main(String[] args){ Main mainNumber = new Main(); Number newNumber = new Number(); newNumber.increas..