재귀와 고차함수 재귀와 고차함수를 사용함으로써 코드의 의도를 더 명확하게 표현하고 유지 관리가 쉬워지며 오류 가능성이 줄어든다. 즉 더 효율적이고 강력한 프로그래밍이 가능하다. 여기서 고차함수란 함수를 인자로 받거나 함수를 반환하는 함수를 의미한다. 예를 들어 map, filter, reduce와 같은 고차 함수들은 리스트나 배열을 처리할 때 반복되는 패턴의 코드를 간결하게 만들어 주고 재사용성과 모듈성을 향상시킨다. 재귀적 문제 해결 전략은 세 단계로 구분된다. 1. 분해 : 주어진 문제를 더 작고 동일한 구조를 가진 여러 부분 문제로 나눈다. 2. 해결 : 분해된 각 부분 문제를 재귀적으로 해결한다. 3. 통합 : 각 부분 문제의 해결 결과를 통합하여 전체 문제의 해결책을 도출한다. 아래는 예시들이다..
학교강의필기장
OCaml? OCaml은 함수형 프로그래밍 언어로, 이름대로 ML 프로그래밍 언어 계열에 속한다. 정적 타입 시스템으로 프로그램의 타입 안정성을 보장하며, 컴파일 시간에 변수의 타입을 추론한다. 함수형 프로그래밍 언어이므로 변수는 기본적으로 불변성을 가진다. 함수가 일급 객체로 취급되어, 함수는 다음의 특징을 가진다. - 함수 할당: 함수를 변수에 할당할 수 있다. - 함수 인자: 함수를 다른 함수의 인자로 전달할 수 있다. - 함수 반환: 함수에서 다른 함수를 반환할 수 있다. 하지만, 상태를 변경하는 명령형 프로그래밍도 가능하며 객체 지향 프로그래밍도 가능하다. 하지만 이는 이 카테고리에서 다루지 않겠다. 정적 타입 언어 (Statically Typed Language) OCaml은 정적 타입 언어이..
Natural Numbers 자연수 집합 N = {0,1,2,3...}를 귀납적으로 정의하면 /0, n/n+1 이다. 이 규칙은 다음과 같이 문법적으로 표현될 수 있다: n → 0 | n + 1 Strings 알파벳 집합 {a ... z}을 사용하여 문자열 집합을 정의해보자. 빈 문자열 ε이 있을 때, / ε , α / aα, α / bα ... α / zα 로 귀납적 정의할 수 있다. 문법적으로는, α → ε | xα (x ∈ {a,...,z})으로 나타낼 수 있다. Boolean Values 불린값 B = {true, false}는 유한한 값이다. 이는 그저 공리에 의해서 정의될 수 있다. /true, /false 문법적으로는, b → true | false 이다. Lists 리스트의 끝을 nil로 ..
귀납적 정의? 귀납적 정의는 프로그래밍 언어의 문법과 의미론, 데이터 구조 등을 이해하고 정의하는데 사용된다. 귀납적 정의는 자기 참조적 정의, 유한한 방법으로 무한 집합 정의의 특징을 가진다. 자기 참조적 정의란 집합이나 구조를 그 자체의 용어로 정의한다. 정의할 대상이 그 정의 내에서 자기 자신을 참조한다. 유한한 방법으로 무한 집합 정의란 유한한 설명으로 무한한 요소를 포함하는 집합을 정의할 수 있다. 복잡하고 무한한 패턴과 구조를 간단하고 명확한 규칙으로 표현할 수 있다. 예를 들어, 연결 리스트는 빈 리스트는 연결 리스트이고, 단일 노드 뒤에 연결 리스트가 오면 그것도 연결리스트이다. 이진 트리는 빈 트리는 이진 트리이고 두 개의 자식을 가진 노드가 모두 이진 트리일 경우 그 노드도 이진 트리이..
Diffie-Hellman Key Exchange 공개값 q = 큰 소수 α = 원시근 비대칭키 생성 Xa = random value (1 < Xa < q-1) Ya = α^Xa mod q 대칭키 생성 K = Yb^Xa mod q ElGamal Cryptography 공개값 q = 큰 소수 α = 원시근 비대칭키 생성 Xa = random value (1 < Xa < q-1) Ya = α^Xa mod q 암호화 k = random value (1 < k < q-1) K = Ya^k mod q C1 = α^k mod q C2 = KM mod q (C1, C2)가 암호문 복호화 K = C1^Xa mod q M = C2*K^-1 mod q RSAES-OAEP 메시지 암호화 DataBlock = Hash(L) ..
UP Process? 소프트웨어를 반복/점진적 개발 단계는 도입 - 고심 - 구현 - 전이가 반복된다. 이 단계들에 요구/분석/설계/구현/테스트/배포 작업을 병렬적으로 진행한다. 시간이 지나며 집중해야하는 작업은 바뀌게 되는데, Inception: 비즈니스 모델링, 프로젝트 관리 Elaboration: 요구사항, 디자인, 환경설정 Construction: 구현, 구성 변경 관리 Transition: 구현, 테스트, 배포, 구성 변경 관리 따위로 나눌 수 있다.
GRASP Pattern? General Responsibility Assignment Software Pattern, OO 디자인의 핵심은 각 객체에 책임을 부여하는 것으로, 책임을 부여하는 원칙을 말하는 패턴이다. 총 9가지의 원칙을 가지고 있다. Information Expert 책임을 수행할 수 있는 데이터를 가지고 있는 객체에 책임을 부여한다. 정보 은닉을 통해 자신의 데이터를 감추고 오직 메소드로만 데이터를 처리하고 외부에는 그 기능(책임)만 제공한다. Creator B 객체가 A 객체를 포함 B 객체가 A 객체의 정보를 기록 B 객체가 A 객체를 긴밀히 사용 B 객체가 A 객체의 생성에 필요한 정보 가짐 위 관계 중 하나라도 포함되면 A의 생성을 B의 책임으로 부여한다. Controller ..
State Machine Diagram? 모든 객체들은 생성부터 삭제되기까지 유한 개의 상태를 지니는데, 그러한 객체의 상태를 표현하기 위해서 사용된다. State(객체의 상태) Transition(객체의 상태를 바꾸는 이벤트) 위 그림에서 다이어그램은 점, initial state에서 이어진 created State부터 시작한다. created 상태일 때, start 트리거가 발생하면 master.ready() 라는 메소드가 호출되고 ready 상태가 된다. ready 상태에서 poll 트리거가 발생하면 master.ack() 메소드가 호출되고 상태는 바뀌지 않는다. ready 상태에서 stop 트리거가 발생하면 final state로 Sequence가 종료된다. 두개 이상의 계층으로 나누어서 표현할 ..