CS Study 24

디자인 패턴 - 구조 패턴

구조패턴 클래스나 객체를 조합하여 더 큰 구조를 만드는 패턴이다. 독립적으로 개발된 객체를 하나의 객체인 것처럼 사용이 가능하게 한다. 1. 어댑터 패턴 (Adapter) - 호환성이 없는 인터페이스를 함께 사용할 수 있도록 한다. - 인터페이스를 교체하는 경우 코드의 재사용성이 높다. 2. 브리지 패턴 (Bridge) - 추상적 개념과 구체적 구현을 서로 다른 두 개의 인터페이스로 구현하는 디자인 패턴 - 구현부와 추상층을 독립적으로 확장할 수 있다. 3. 합성 패턴 (Composite) - 객체들의 관계를 트리 구조로 구성하여 전체-부분 관계를 표현하는 패턴이다. - 클라이언트는 전체와 부분을 구분하지 않고 동일한 인터페이스를 사용할 수 있다. 4. 데코레이터 패턴 (Decorator) - 객체의 결..

CS Study 2022.05.17

디자인 패턴 - 생성 패턴

생성패턴 객체의 생성과 관련된 패턴이다. 객체의 생성이나 변경에 의해 프로그램이 영향을 받는 문제를 해결하기 위해 객체를 캡슐화하는 패턴이다. 1. 팩토리(Factory Method) 객체를 생성하는 부분을 직접하지 않고 팩토리 클래스에 위임하는 것이다. 2. 추상 팩토리(Abstract Factory) 관련된 객체를 묶어 팩토리 클래스로 만들고, 이 팩토리 클래스를 생성하는 또 다른 팩토리 클래스를 만들어 사용하는 패턴이다. 3. 빌더(Builder) 객체를 생성하는 클래스와 표현하는 클래스를 분리하여 표현을 다양하게 변경할 수 있다. 4. 프로토타입(Prototype) 객체를 생성하는 비용이 큰 경우, 한 번 생성한 객체를 새로운 객체에 복사하여 사용하는 것이다. 객체를 복사할 때는 얕은 복사와 깊은..

CS Study 2022.05.16

함수형 프로그래밍

함수형 프로그래밍 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임이다. 함수형 프로그래밍의 특징 순수함수 같은 입력 값에 대해 항상 같은 결과 값을 반환하는 함수 함수의 실행이 프로그램의 실행에 영향을 미치지 않는다. 비상태성, 불변성 데이터를 변경할 때는 복사본을 만들어 변경한다. 선언형 함수 명령형 함수는 무엇을 어떻게 할 것인지가에 주목한다. 선언형 함수는 무엇을 할 것인지가에 주목한다. 명령형 함수에서 for문을 사용했다면, 선언형 함수에서는 map을 이용한다. 1급 객체 변수나 데이터 구조 안에 담을 수 있다. 파라미터 값으로 전달할 수 있다. 반환값으로 사용할 수 있다. 고차함수 함수를 인자로 전달할 수 있다. 함수의 반환값으로 또다른 함수를 사용..

CS Study 2022.05.09

데이터베이스 정규화

이상 테이블에서 일부 속성들의 종속으로 인해 데이터 중복이 발생하고, 이 중복으로 인해 테이블 조작 시 문제가 발생하는 현상이다. 삽입 이상 테이블에 데이터를 삽입할 때, 삽입하려고 하는 데이터 외에 다른 데이터가 없어 삽입할 수 없게 되는 현상 삭제 이상 테이블에서 한 튜플을 삭제할 때, 의도하지 않은 값들도 삭제되는 현상 갱신 이상 테이블에서 튜플에 있는 속성 값을 갱신할 때 일부 튜플의 정보만 갱신되어 정보에 불일치성이 생기는 현상 함수적 종속 X와 Y를 각각 테이블 R의 속성 집합의 부분 집합이라고 하자. 속성 X의 값 각각에 대해 항상 속성 Y의 값이 오직 하나만 연관되어 있을 때 Y는 X에 함수적 종속 또는 X가 Y를 함수적으로 결정한다고 하고, X -> Y로 표기한다. 이 때, X를 결정자라..

멀티 프로세스와 멀티 스레드

멀티 프로세스란? - 여러 개의 프로세서(CPU)가 하나의 작업을 동시에 처리하는 것이다. - 프로세스 간 메모리 구분이 필요하거나 독립적인 주소공간이 필요할 때 사용한다. - 독립된 공간을 사용하기 때문에 하나의 프로세스가 문제가 생겨도 다른 프로세스에 영향을 주지 않으므로 안전성이 높다. - 독립된 공간을 사용하기 때문에 문맥교환(Context Switching) 이 많이 일어날 수 있고, 이로 인해 오버헤드가 발생하면 성능 저하로 이어질 수 있다. 멀티 스레드란? - 하나의 프로세스를 여러 스레드로 나누어 자원을 공유하며 작업을 처리하는 것이다. - 스택을 제외한 나머지 메모리 영역을 공유한다. - 자원을 공유하고 스레드 간 데이터 공유가 가능하기 때문에 자원의 효율성이 좋다. - 문맥교환(Cont..

웹 동작 방식

웹 동작 방식 사용자가 웹페이지 URL 주소를 입력한다. 웹 브라우저는 해당 URL의 도메인 네임을 DNS 서버에서 검색한다. DNS 서버는 도메인 네임에 해당하는 IP주소를 전달한다. HTTP를 통해 요청메시지를 생성하고, TCP를 통해 해당 IP주소의 컴퓨터로 전송한다. 도착한 요청메시지는 HTTP를 통해 웹페이지 URL 정보로 변환된다. 웹 서버는 URL 정보에 해당하는 웹페이지 데이터를 검색한다. 웹페이지 데이터는 HTTP를 통해 응답메시지를 생성한다. 응답메시지는 TCP를 통해 사용자 컴퓨터로 전송한다. 도착한 응답메시지는 HTTP를 통해 웹페이지 데이터로 변환된다. 웹 브라우저는 웹페이지 데이터를 출력하여 사용자에게 보여준다.

쿠키, 세션, 캐시

HTTP의 특성 무상태성 (Stateless) -> 상태정보를 가지지 않기 때문에 통신을 주고 받은 후, 이전 데이터를 유지하지 않는다. 비연결성 (Connectionless) -> 서버는 클라이언트의 요청에 응답을 보낸 후 연결을 끊는다. 그러나 로그인, 데이터 등 상태를 유지할 필요가 있다. 이를 해결하기 위해 서버와 주고받은 통신 데이터를 저장해두는 방법으로 쿠키, 캐시, 세션이 있다. 1. 쿠키 사용자의 브라우저에 저장되는 텍스트 파일 서버와 통신 시, HTTP 헤더에 포함된다. 이름, 값, 만료기간, 경로 정보가 들어 있고, 키와 값으로 구성되어 있다. 쿠키는 오랜시간 유지될 수 있고, 자바스크립트를 통해 쿠키에 접근할 수 있으므로 민감한 정보를 담지 않는다. 통신과정 클라이언트가 서버에 요청 ..

동적 계획법 (Dynamic Programming)

동적 계획법 (Dynamic Programming) 한 번 계산한 문제는 다시 계산하지 않게 하는 방식으로, 같은 계산을 여러 번 하는 상황을 개선하여 효율을 높이는 알고리즘이다. 이 때, 한 번 계산한 문제의 답을 저장해두는 메모이제이션(Memoization) 기법이 사용된다. Top-Down 방식은 재귀, Bottom-Up방식은 반복문을 사용한다. 동적 계획법 사용 조건 동일한 작은 문제들이 반복하여 나타나야 한다. 동일한 문제는 항상 답이 동일해야 한다. 동적계획법을 이용하는 백준 문제 (피보나치 함수) 1003번: 피보나치 함수 각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다. www.acmicpc.net import java.io.BufferedRead..

동기와 비동기

동기 (Synchronous) 작업들이 순차적으로 진행되는 방식이다. 작업이 진행되고 있을 때 다른 작업이 동시에 진행될 수 없다. 비동기(Asynchronous) 응답에 관계없이 다음 작업이 시작된다. 작업이 들어온 순서대로 진행되지 않을 수 있다. '동기 실행'에 비해 더 빠른 시간 안에 작업들을 처리할 수 있다. 자바로 동기 비동기 구현해보기 아래와 같은 메소드가 있다고 할 때, public class SyncAsync { public static void main(String[] args) { ... } public static void dough(String dish) { System.out.println(dish + " >> Dough"); } public static void sauce(St..

힙이란?

힙 우선순위 큐를 구현하는 가장 효율적인 자료구조이다. 완전 이진 트리의 일종이며, 여러 개의 값들 중 최댓값이나 최솟값을 빠르게 찾아내도록 만들어진 자료구조이다. 반정렬 상태 (느슨한 정렬 상태)를 유지한다. 힙 트리에서는 이진 탐색 트리와 달리 중복된 값을 허용한다. 배열을 이용하여 구현한다. 0번 인덱스는 사용되지 않으며, 특정 위치의 노드번호는 변하지 않는다. 힙의 종류 최대 힙: 부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진 트리 최소 힙: 부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진 트리 힙의 삽입 마지막 노드 다음 노드에 새로운 요소를 삽입한다. 삽입한 노드가 부모 노드보다 크면 자리를 바꾼다. 부모 노드가 삽입한 노드보다 클 때까지 반복한다. 힙..