본문 바로가기

분류 전체보기184

Builder Pattern Builder Pattern 빌더패턴은 복잡한 객체의 구조를 어떻게 더 효율적이게 관리하며, 같은 구조여도 서로 다른 표현으로 객체를 생성 할 수 있을지에 대해서 다룬다. 복잡한 객체의 구조를 분리시켜 같은 구조이지만 서로 다른 표현으로 객체를 생성할 수 있을까? 위 그림과 같이 만약에 new ProductA1(), new ProductB1() 등.. 여러가지 클래스를 특정 Object에서 생성하는 경우 유연함이 떨어진다. 또한, Object도 정의된 생성자로만 객체 생성해야만 한다. Solution 복잡한 object내부를 부분으로 나눠 build object내에서 create할 수 있도록 한다. 그래서 직접 new로 클래스를 생성하기 보다는 build내에서 instantiation하도록 한다. pub.. 2022. 3. 29.
ABSTRACT FACTORY PATTERN ABSTRACT FACTORY PATTERN 의존적이고 연관되어 있는 구조에서 구체적으로 명시되어있는 클래스보다는 인터페이스를 제공하는 것이다. 필수적으로 필요한 객체를 어떻게 독립적으로 생성할까? 연관되고 의존적이지만 객체들의 서로 다른 Family는 어떻게 생성할까? ProductA라는 interface를 상속받아 ProductA1이라는 class를 만들었다. 만약에 client에서 new ProductA1()를 할 경우 어떤 문제가 있을까? interface ProductA가 인스턴스화 되기 전에 ProductA1이 먼저 인스턴스화 된다면 컴파일이나 런타임 중 에러가 날 가능성이 있으므로 직접적으로 ProductA1를 인스턴스하는 것은 회피하는 것이 좋다. Solution 결합도를 낮추기 위해 Cl.. 2022. 3. 27.
Monge array란? 정의 $n \times m$인 matrix가 존재할 때, $A[i, j] + A[k, l] \leqq A[i.l] + A[k,l]$이면 monge array라고 한다. ( $1 \leqq i < k \leqq n and 1 \leqq j 2021. 10. 31.
현대적 C++에 적응하기 현대적 C++에 적응하기 항목 7 : 객체 생성 시 괄호와 중괄호를 구분하라 변수를 선언한 방법은 크게 3가지이다. int x(0); int y = 0; int z{0}; 균일 초기화(uniform initialization) C++11은 위에서 처럼 중괄호({..})로 초기화 할 수 있는 방법이 있다. 멤버의 초기 값을 지정하는 데에도 사용 할 수 있다. class Widget { private : int x{0}; int y = 0; int z(0); // 오류 } 복사 할 수 없는 객체를 초기화 할 수 있다. std::atomic ai1{ 0 }; std::atomic ai2( 0 ); std::atomic ai3 = 0; // 오류 암묵적 좁히기(narrowing conversion) 변환을 방지.. 2021. 10. 17.
Effective modern C++ ( Auto ) Auto 항목 6 : auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라. 컨테이너를 참조하는 operation[]은 보통 &T를 돌려주지만 bool의 경우는 다르다. 왜냐하면 C++에서는 bool처럼 bit에 대한 형식에 대해서 참조하는 것이 금지되어 있다. std::vector features(const Widget& w); Widget w; auto highPriority = features(w)[5]; // 임시객체 vector 파괴된다. processWidget(w, highPriority); 위 코드를 보았을 때 bool일 경우 이야기 해보자! 1. features는 처음에 임시객체 vector을 return한다. 2. 임시객체 vector의 5번 객체를 찾아서 std.. 2021. 10. 16.
Effective modern C++ ( Auto ) Auto 항목 5 : 명시적 형식 선언보다는 auto를 선호하라 Auto를 사용하지 않을 때 불편한 점 1. 초기화 하지 않을 때, 쓰레기 값이 들어갈지 초기 값(0 or "")이 들어갈지 모른다. 2. 긴 형식을 짧게 만들 수 있다. ( ex typename std::iterator_traits::value_type ) 3. closure형식으로 지역변수를 선언 할 때, 타입을 명시하는 것이 어렵다. auto를 사용 할 때 무조건 초기 값을 넣어야 한다. 컴파일러가 auto를 연역하려면 초기값이 필요하므로 초기 값을 넣지 않은 실수를 방지 할 수 있다. int x1; // 문맥에 따라서는 초기화되지 않을 수 있음 auto x2; // 오류! 초기치가 꼭 필요함 auto x3 = 0; // 양호함; x3.. 2021. 10. 16.
Effective modern C++ ( 형식 언어 ) 형식언어 항목 4: 연역된 형식을 파악하는 방법을 알아두라 IDE편집기 마우스 커서를 올려 놓으면 연역을 확인해 준다. 컴파일러 진단 메시지 원하는 형식에 컴파일러 에러 문제가 발생하게 만드는 것이다. template class TD; auto x = theAnswer; auto y = &theAnswer; TD xType; TD yType; error: aggreate 'TD xType' has incomplete type and cannot be defined. error: aggreate 'TD yType' has incomplete type and cannot be defined. 실행시점 출력 2021. 10. 14.
일반화된 자료구조와 함수 다형성 일반적인 타입으로 매개변수 화 할 수 있어 여러 구체화된 정의를 갖을 수 있다. struct Pair { first: T, second: T }위의 코드 예제를 보면 T부분에 int, str 어떤 것이 와도 상관이 없다. 이를 제네릭 함수라고 부른다. let magic_pair: Pair = Pair { first: 7, second: 42 }; let pair_of_magicians: Pair = Pair { first: "Gandalf", second: "Sauron" };일반화 된 만큼 함수의 일반화도 중요하다. fn second(pair: Pair) { pair.second; // 2번째 인수를 꺼내는 함수 } let a = second(magic_pair); // 호출오류처리 스레드가 모.. 2021. 10. 10.
고차원 함수와 매개변수화를 통한 코드 일반화 고차원 함수와 클로저 고차원 함수 : 다른 함수를 매개변수로 받는 함수; 사이에 매개변수로 받을 함수의 타입을 적어야 한다. fn again i32 >(f: F, s: i32) -> i32 { f(f(s)) } // 고차원 함수 fn triples(s: i32) -> i32 { 3 * s } fn main() { let mut strength = 26; println!("My tripled strength equals {}", triples(strength)); // 26 println!("My strength is still {}", strength); // 26 strength = triples(strength); println!("My strength is now {}", strength);.. 2021. 10. 9.
패턴매칭 콘솔에서 입력 받기 입출력 기능 : std::io모듈을 통해 처리된다. 세상에서 가장 안전한 언어 답게 ok() // 정당하게 except() // 함수가 정확하게 작동하지 않았을 때 추가하여 사용해줘야만 한다. use std::io; fn main () { println!("What's your name. noble warrior?"); let mut buf = String::new(); io::stdin().read_line(&mut buf) .ok() .expect("Failed to read ljine"); println!("{}, that's a mighty name indeed!", buf.trim()); let input_num: Result = buf.trim().parse(); print.. 2021. 10. 8.
데이터 구조화 문자열 러스트는 두가지 유형의 문자열로 구성되어 있다. &str : 문자열 슬라이스 타입 ; 불변하며 고정된 크기를 갖는다. let magician1 = "Merlin"; let greeting = "Hello, !"; &'static str: 문자열이 정적으로 할당되었음을 의미 프로그램이 끝날 때까지 존재(정적 수명 - static lifetime - ) let magician2: &'static str = "Gandalf"; 동적 문자열 만드는 방법 &[..] : 리소스를 소모하지 않음 to_string() : 힙 메모리를 할당함 let mut str1 = String::new(); let mut str2 = String::with_capacity(25); let mut str3 = magician1.. 2021. 10. 6.
함수와 제어문 조건문 특별하게 다른건 없다 fn main () { let dead = false; let health = 48; if dead { println!("Game Over!"); return; } if dead { println!("Game Over!"); return; } else { println!("You still have a chance to win!"); } if health >= 50 { println!("Continue to fight!"); } else if health >= 20 { println!("Stop the battle and gain strength"); } else { println!("Hide and try ro recover!"); } }cpp와는 다르게 코드 블록으로 변수.. 2021. 10. 6.
변수 출력 형식 o: 8진수 x: 소문자 16진수 X: 대문자 16진수 p: 포인터 b: 2진수 e: 소문자 지수 표기 E: 대문자 지수 표기 ?: 디버깅 목적으로 사용 u: unsigned integer 타입선언 let n: i32;전역 변수 static MAX_SIZE: i32 = 32; static MAX_NAME: &&#39;static str = "HELLO WORLD"; fn main() { println!("{}", MAX_NAME); }변경 가능한 변수 기본적으로 rust는 변수를 변경 할 수 없다. mut을 선언해주어야 가능하다. let mut fuel = 34; fuel = 60;변수의 scope 기존 C++, JAVA등과 크게 차이가 없어 보인다. 외부 블록의 변수를 내부 블록에서 사용 할.. 2021. 10. 4.
Rust의 장점 및 특징 Rust의 장점 1. 강력한 타입 시스템을 통한 높은 안전성 제공 2. 저수준의 리소스들을 제어할 수 있기 때문에 하드웨어에 가깝게 실행 가능 Rust의 특징 : 안전성, 속도, 동시성 안전성 Rust에서 변수들의 입력은 컴파일이 되어 있기 때문에 정적이며 강력하다. 러스트의 컴파일러는 대부분 타입을 추론할 수 있기 때문에 모든 항목에 대해 타입을 표시하라고 강요하지 않는다. Rust의 컴파일러는 컴파일 동안 메모리 충돌, 누수 등,, 여러가지 문제를 감지 할 수 있다. 네이티브 코드를 컴파일한다. 동시성 동시성을 위한 매커니즘 중 하나로 얼랭에서 잘 알려진 액터 모델을 채택 스레드라고 부르는 경량 프로세스들이 병렬로 수행한다. 힙 메모리를 공유하지 않고 채널을 통해 데이터를 전달 2021. 10. 4.
Value INTRO C++에서 auto, decltype등을 자세히 이해하기 위해서는 value에 대해서 정확히 이해하고 넘어갈 필요가 있다. 다른 언어들은 메모리 관리를 대부분 가비지컬렉터에서 해주지만, 시스템 외에 개발자가 직접 관리 할 수 있다. 장점인지 단점인지는 잘 모르겠다. 하지만, 이 메모리 여부에 따라 Value의 범주가 구분된다. Copy & Move Value에 대해서 설명하기 전에 Copy와 Move에 대해서 알고 지나가야된다. 아래 그림을 참고 하자. Value의 유형 glvalue : 계산에서 개체, 비트 필드 또는 함수의 ID를 결정하는 식입니다. prvalue : 계산에서 개체 또는 비트 필드를 초기화하거나 연산자가 나타나는 컨텍스트에서 지정한 대로 연산자의 연산자 값을 계산하는 식입니.. 2021. 10. 4.
Effective modern C++ ( 형식 언어 ) 항목 3 : decltype의 작동 방식을 숙지하라 auto, decltype은 operator[]에 따라 다른 값을 돌려 줄 수 있다. ( 왜 그런지는 항목 6에서 확인 ) Widget w; auto myWidget1& cw = w; auto myWidget1 = cw; // auto의 형식 연역 : // myWidget1의 형식 Widget decltype(auto) myWidget2 = cw; // decltype 형식 연역 : // const Widget& 그렇다면 이 2개를 어떻게 맞출 수 있을까? C++11 : 후행 반환 형식(trailing return type)을 통해 auto의 타입형식을 decltype과 일치 시킬 수 있다. // 아래 코드는 정련 할 필요가 있다. template au.. 2021. 9. 26.
C++의 람다 식 람다식을 쓰는 이유 : 람다식은 함수의 인라인화 가능하다. 메모리 관리에 용이하다. 람다식은 실행 하고 난 뒤 메모리에서 바로 삭제된다. C++람다식의 형태 []() ->void { cout 2021. 9. 22.
Effective modern C++ ( 형식 언어 ) 형식언어 항목 2 : auto의 형식 연역 규칙을 숙지하라 항목 1과 거의 동일하다. ( auto를 ParamType으로 대체하여 생각하면 된다. ) 형식 지정자가 포인터나 참조형식이지만 보편 참조는 아닌 경우 형식 지정자가 보편 참조인 경우 형식 지정자가 포인터도 아니고 참조도 아닌 경우 auto x = 27; // 경우 3 ( x는 포인터도 아니고 참조도 아님 ) const auto cx = x; // 경우 3 ( cx 역시 둘 다 아님 ) const auto& rx = x; // 경우 1 ( rx는 보편 참조가 아닌 참조 ) auto&& uref1 = x; // x는 int이자 l-value이므로 // uref1의 형식은 int& auto&& uref2 = cx; // cx는 const int이자 .. 2021. 9. 22.
Effective modern C++ ( 형식 언어 ) 형식 연역 항목 1: 템플릿 형식 연역 규칙을 숙지하라 필요성 : 템플릿 형식 연역 규칙들이 auto의 문액에 적용 될 때 덜 직관적임 auto를 잘 활용하려면 템플릿 형식 연역을 이해하고 있어야 한다. T, ParamType서로 다르게 연역된다. template void f(ParamType param) f(expr) *위의 식은 아래에서 parameter를 말하기 위해서 사용한다. 보편 참조(universal reference)가 아닌 경우 ( 포인터 or 참조 형식 ) 만일 expr이 참조 형식이면 참조 부분을 무시 expr의 형식을 ParamType에 대해 패턴 부합(pattern-matching)방식으로 대응시켜 T의형식을 결정 template void f(T& param); int x = 27.. 2021. 9. 21.
C++최적화 (2단원) 2. 컴퓨터 하드웨어의 최적화 - 왜 최적화가 필요한지 알 수 있다. - 프로세서의 구조를 통해서 어떤 방법으로 최적화해야 하는지 유추하는 방법을 알아봄. C++은 컴퓨터의 거짓말을 믿습니다. C++ 프로그램은 '마치' 명령문을 순서대로 실행하는 것처럼 작동하기만 하면 됩니다. C++ 컴파일러와 컴퓨터 자체는 계산의 의미가 변경되지 않은 선에서 실행순서를 변경하여 프로그램 실행을 빠르게 할 수도 있습니다. C++11부터는 단일 실행 주소만 있다고 믿지 않습니다. 이제 C++표준 라이브러리는 스레들 시작 및 중지하고 스레드 간에 메모리 접근을 동기화하는 기능을 제공한다. 특정 메모리 주소는 일반 메모리가 아닌 장치 레지스터가 될 수 있다. 동일한 스레드가 두 번 연속해서 읽는 사이에 변할 수 있으며,이는 .. 2021. 9. 21.
C++최적화 (1단원) 1.1 최적화는 소프트웨어 개발의 일부입니다. : 최적화 역시 코딩에 속한다. 최적화가 이루어지는 단계 전통적인 소프트웨어 개발 프로세스 : 프로젝트 통합 및 테스트 단계 애자일 프로세스 : 프로토타입으로 빠르게 기능 구현 최적화의 목표 속도, 메모리 사용량, 전력 소비 등에 대한 고객의 요구를 충족 성능저하는 버그나 기능 누락처럼 용납할 수 없는 문제일 수 있다. 버그 수정 vs 성능 향상 버그 수정 : ‘있다/없다’로 판단 성능 향상 : 지속해서 이어지는 범위, 느린 곳을 개선하면 그 다음 느린 곳을 개선함. 최적화는 과학적 사고방식을 더 많이 요구하는 과학 실험이다. 관찰 -> 검증 -> 가설 -> 지지 or 반박 -> 측정 실험 1.2 최적화는 효과적입니다. 숙련된 팀이 많은 시간을 들여 작성한 .. 2021. 9. 17.
ADAPTER PATTERN ADAPTER PATTERNS 이 패턴의 의도는 호환되지 않은 인터페이스를 호환되도록 변경해주는 것이다. 인터페이스 요구사항과 맞지 않을 때 어떻게 재 사용 가능할까? 서로 호환되지 않은 클래스끼리 호환시킬 수 있을까? Adapter가 하는 역활은? Adapter의 역할은 8핀 충전기를 C타입으로 바꾸는 포트라고 생각하면 좋다. Solution 위에서 말한 것 처럼 8핀을 가진 아이폰 객체를 C타입의 충전기를 통해서 충전을 해보자. Interface의 정의 interface로 C타입포트와 8핀 포트를 정의한다. package AdapterPattern; public interface CtypePort { void charge(); } package AdapterPattern; public interfac.. 2021. 7. 22.
SINGLETON PATTERN Sinlgeton pattern 싱글톤 패턴은 "유일한 인스턴스를 생성하고 이것을 global하게 접근할 수 있도록 제공하는 것이다." 싱글톤 패턴은 아래의 2가지 문제에 대해 해결책을 제시해 준다. 1.어떻게 단 한개의 인스턴스를 생성 할 수 있을까? 2.이 유일한 인스턴스를 global하게 접근 할 수 있을까? 싱글톤 패턴은 왜 필요할까? 증권사 시스템을 개발한다고 가정해보자! 한꺼번에 다양한 사람들의 주문이 들어오는데 여러객체가 각 각 처리한다면 어떤 현상이 발생할까? 매도 주문을 100개 밖에 없는데 1000개가 처리되는 기이한 현상이 일어날 것이다. 단 한개의 인스턴스가 처리하게 만든다면 매수 주문을 100개 이상 처리 할 수 없도록 만들 수 있다. Background static 접근 제한자는.. 2021. 7. 20.
1965번 상자넣기 문제의 해결법 앞에 상자를 넣기 위해서는 뒤에 상자가 앞의 상자보다 더 커야 한다. 최고로 많이 넣을 수 있는 문제를 푼다고 하면, 최장증가부분수열의 문제와 같다고 볼 수 있다. 예제 1번 박스부터 시작하여 1번 박스보다 큰 모든 박스에게 +1해준다. 6번 박스보다 작은 것들은 1번 박스때의 숫자를 가지고 오고 큰 숫자들은 +1이거나 이전 박스까지 센 숫자 중 큰 것을 넣어준다. 점화식 $$dp[i][j] = \begin{cases} max(dp[i][i]+1, dp[i-1][j]), & \text{if }n\text{ box[i] < box[j]} \\ dp[i-1][j], & \text{if }n\text{ box[i]} \ge \text{box[j]} \end{cases} $$ 소스코드 public.. 2021. 5. 19.
Fixed income Securities Introduction 모든 금융상품의 기본은 채권으로부터 시작된다. 이 채권이 어떻게 pricing되어지는지 확인해보자. Zero-Coupon Bonds Zero-Coupon Bonds는 한국어로 할인채라고도 불리며 이자율(interest rate) 대신에 할인율(discount rate)를 사용한다. 내가 10년뒤 100억의 할인채의 가격을 예상하여 보자. 예를 들어, 1000억 달러, 만기일은 20년 연 할인율이 6%인 채권의 가격은 현재 얼마일까? $$\frac {$1000} {(1.06)^{20}} = $311.80$$ 좀 더 일반화를 시켜 보자면, $$\frac {priciple} {(rate)^{inteval}} = current price $$ 그렇다면, 복리채인 경우는 어떻게 될까? 위에.. 2021. 2. 12.
Returns(수익률) INTRO 수익률을 공부해야 하는 이유는 투자에 있어 프토플리오를 만들거나 관리 또는 배팅 크기 등을 정할 때 기반이 되기 때문이다. Net Returns $t$시점에 수익률은 $P_{t}$를 갖는다. 배당금이 없다고 가정할 때 $t-1$와 $t$사이의 순 이익률(Net Returns)는 아래와 같다. $$R_{t} = \frac {P_{t}} {P_{t-1}} - 1 = \frac {P_{t} - P_{t-1}} {P_{t-1}}$$ 위 공식에서 보다시피 $P_{t} - P_{t-1}$는 일일 수익(revenue)을 나타낸다. $R_{t}$을 통해서 수익을 어떻게 나타낼 수 있을까? $$ revenue = initial investment \ * \ net retrun $$ 이처럼 수익률은 다른 정보를.. 2021. 1. 24.
Time2Vec IDEA 내가 고민했던 부분과 비슷한 목적을 가지고 있어서 읽어봤다. RNN베이스 모델은 squential data를 다루는데 뛰어난 결과를 나타내지만, time-series data를 다루는데 특화되있는 것은 아니라고 말한다.그래서 data를 preprocessing하여 feature를 추출하는데 전문과들이 필요하고 손수(hand-crafting)작업하기 떄문에 시간, 노력과 비용이 많이 필요하다. Time2Vec은 새로운 모델을 제시하는 것이 아니라 Time-series data의 represnetation을 하는 방법을 새로 만든 것이다.(our goal is not to propose a new model for time series analysis, but instead to propose a .. 2020. 10. 3.
Stock Market Prediction on High-Frequency Data Using Generative Adversarial Nets IDEA 이 논문은 새로운 architecuture를 만들기는 보다는 그동안 stock prediction에는 GAN모델을 사용하지 않았는데 사용해 보았더니 기존에 있던 모델들 보다 좋은 성능이 나왔다는 것이다. 모델도 실험을 위한 모델로 GAN을 어떻게 만드는냐에 따라 크게 달라질 것으로 보인다. Generator부분은 LSTM으로 구축하였는데, 사실 squential data에서 성능이 좋아보이는 것은 Transformer모델로 LSTM대신에 Transfomer모델을 썼을 경우 어떻게 되었는가에 대한 실험도 있었으면 좋겠다. GAN이란? GAN은 unsupervised learning을 하는 모델로 Generator, Discriminator 2가지 모듈이 있다. Generator는 uniform d.. 2020. 10. 1.
Predicting and Recommending Food Ingredient Pairings IDEA 이 논문은 Siamese Neural Networks을 사용하여 레시피를 학습하고 새로운 조합을 추천해주는 모델이다. Siamese Neural Networks은 클래스간 여러조합의 Pair를 만들고 같은 Network를 통해 fully conntected netowrk를 만든다. 하지만, 마지막 output에서 2개 결과간의 distance를 구하여 학습하도록 한다. label데이터가 아니라 Pair로 된 데이터가 서로에게 label되어 같은 class인지 아닌지를 확인시켜주기 때문에 기존에 학습되어있지 않은 데이터가 들어오더라도 분류할 수 있고, 데이터 셋에 기존에 Pair로 되어있지 않아도 충분히 같은 class인지 분류할 수 있다고 생각되어진다. [https://kyounju.tistor.. 2020. 9. 30.
Siamese Neural Networks for One-shot Image Recognition IDEA 딥러닝은 data를 generalization을 통해서 예측을 하지만, a)비용이 비싸고(expensive), b)사용 가능한 데이터를 구하거나 조작하기가 어렵다. a)의 이유는 수 많은 데이터뿐 아니라 label데이터의 존재가 있어야 하고, 이것을 연산하기 위한 비용도 많이 크다. b)는 학습시킬 데이터를 구해야 하는 것 뿐만 아니라 image의 경우 여러각도의 사진이 필요하기도 하다. 또, 새로운 class에 대해서는 예측이 불가능하다. 이 논문에서는 Sinamese Neural Networks를 통해서 a single example만을 통해서 학습시켜 비용을 줄이고(One-shot Image), 새로운 class가 들어오더라도 예측 할 수 있게 해준다. DataSet DataSet은 One.. 2020. 9. 27.