Topological Sort

위상정렬 (Topological sort) 는 cycle이 없는 방향 그래프(Directed Acyclic Graph,DAG) 에서 정점들을 선형순서(간선의 방향을 거스리지 않도록)로 나열하는 것을 의미하며, 주어진 그래프내에서 여러 개의 위상 정렬 결과가 나올수도 있다.

대표적으로 위상정렬을 이용하는 예로 대학교 선수과목 수강 순서를 정할떄 이용할 수 있다.

위상 정렬 알고리즘의 수행과정은 다음과 같다.

  1. 그래프에서 진입 차수가 0 인 정점 v 를 출력하고, v와 연결된 간선을 제거한다.
  2. 다시 1번 과정을 거치며, 진입 차수가 0인 정점을 찾는다.
Read more

B Tree

B Tree는 다수의 키를 가진 Node로 구성되어 다방향 탐색이 가능한 균형 트리이다.

B Tree는 이진트리와 다르게, 하나의 노드에 다수개의 키를 저장할 수 있어, Tree의 높이를 낮추어 대용량 데이터 처리에 효율적임으로, 관계형 데이터베이스의 기본 자료구조로서 활용된다.

( 균형 트리란 ? 왼쪽,오른쪽 subtree의 높이 차이를 줄여, O(logN)의 시간복잡도를 가지고, 탐색,삼입,삭제 연산을 수행할수 있다. )

대표적으로 AVL Tree, RB Tree, B tree…등이 있다.

차수가 M인 B트리는 다음과 같은 정의를 갖는다.
(= 트리 노드의 최대 자식 노드의 개수가 M이며, 이떄 M은 2이상의 정수여야한다.)

  1. 모든 leef node는 동일한 깊이를 갖는다.
  2. 각 internal node의 자식수는 M/2 이상 , M 이하이다.
  3. Root Node의 자식수는 2 이상이다.
  4. Node의 key값들은 정렬된 상태를 유지한다.
Read more

Execution Context ( ⊃ Hoisting 개념 )

Execution Context(실행 컨텍스트)코드를 실행할떄 필요한 환경 정보들을 담은 객체이다.

  • 동일한 환경에 있는 코드들을 실행할떄, 필요한 환경 정보들을 모아 context를 구성하고, 이를 call stack에 올렸다가, 가장 위에 쌓여있는 context와 관련있는 코드들을 실행하는 식으로 전체 코드의 환경과 순서를 보장한다.
    (stack 자료구조에서 LIFO 을 생각하면 이해가 간편한다.)

  • execution context 는 함수를 실행할떄 구성된다.

+) ES6 부터는 let,const block scope가 추가되었다.

Read more

Decorator pattern

Decorator Pattern은 객체에서 추가적인 요건을 동적으로 추가할 수 있다.

1
2
Target target = new concreteTarget();
target = new Condition(target); //마치 wrapper class처럼 감싸서 사용한다.
  • Decorator 의 super class는 장식할 객체의 super class와 같다.
  • Decorator 구현체는 Decorator 추상 class를 상속하여 기능을 추가할 수 있다.
  • 한 객체를 여러 개의 Decorator 구현체로 감싸서 기능을 추가할 수 있다.
  • Decorator는 장식할 객체에 어떤 행동을 위임하는 것외에도 추가적인 작업을 수행할 수 있다.
Read more

Quick Sort

Quick sort는 기준 데이터인 pivot 을 설정하고, pivot보다 작은 값과 pivot보다 큰 값의 위치를 교환하고, 두 개의 포인터가 어긋나는 시점에 왼쪽에 위치한 포인터를 pivot과 교환해줌으로서, pivot의 왼쪽에는 pivot보다 작은 값들만 , pivot의 오른쪽에는 pivot보다 큰 값들만 위치하도록 한다.
pivot의 왼쪽, 오른쪽 부분의 배열에 대해서 다시 재귀적으로 정렬을 수행하는 정렬 알고리즘이다.

Read more

javascript 메모리 할당 방식 (primitive vs reference)

javascript에서 primitive type 과 reference type의 memory 할당 방식 차이

1
var a;

다음과 같이 primitive type 변수를 선언하면 메모리 공간이 미리 할당되고, 변수에 값을 저장하면

1
a = "abcdefg";

다른 메모리 공간에 abcdefg string값이 저장이 되고, 그 메모리 주소가 a가 참조하는 메모리 공간에 저장된다.

ex) 메모리주소 100번지에 abcdefg 값이 우선 저장이 되고, a가 참조하는 메모리 공간 200번지에 100번지 주소가 저장된다.

반면 reference type의 경우 primitve type과 메모리 할당방식이 조금 다르다.

Read more

플루이드의 토끼와 거북이 알고리즘

플루이드의 토끼와 거북이 알고리즘은 Linked List에서 cycle 존재 유무와 cycle의 길이 및 , 시작점 을 확인할 수 있는 알고리즘으로 2개의 다른 속도로 움직이는 포인터를 사용한다. , (알고리즘 이름이 왜 토끼와 거북이인지 알 것 같다)

알고리즘은 크게 2 phase로 나뉜다.

Phase 1. 다른 속도로 움직이는 두 pointer의 교차점을 찾고,
Phase 2. cycle의 진입로를 찾는다.

먼저 phase 1을 세부적으로 살펴보면,

Read more

Spring Configuration - Xml

spring은 java annotaion 기반으로 DI 의존관계 설정 class를 만드는 것 이외에도 ,

xml을 활용하여 DI 의존관계 설정 class를 만드는 것을 지원한다.

xml의 이용할 경우 별도의 compile이 필요하지 않다는 장점을 가지고 있다.

annotaion의 @Configuration 이 <beans> tag, @Bean 이 <bean> tag와 대응된다.

@Bean에서 bean이름이 될 method name은 xml에서 <bean> tag 의 id attribute,
@Bean에서 bean Class type은 xml에서 <bean> tag의 class attribute 가 된다.

예를 들어

1
2
3
4
@Bean 
public ConnectionMaker connectionMaker(){
return new DconnectionMaker();
}

위 자바 코드는 아래의 xml 기반의 설정파일과 동일한 의미이다.

1
2
3
<beans>
<bean id="connectionMaker" class="com.springstudy...DconnectionMaker">
<beans>

다른 Bean 과의 관계설정은 xml에서 tag를 통해 이루어질 수 있다. property tag의 name attribute는 property 이름 , ref attribute는 setter method를 통해 주입해줄 bean 객체의 이름이다.

예를 들어

1
2
3
4
5
6
7
8
public class UserDao{

private ConnectionMaker connectionMaker;

public void setConnectionMaker(ConnectionMaker connectionMaker){
this.connectionMaker=connectionMaker;
}
}

위 자바 코드는 아래의 xml 기반의 설정파일과 동일한 의미이다.

1
2
3
4
5
6
<beans>
<bean id="userDao" class="com.springstudy...UserDao">
<!-- name : property 명 , ref : bean 객체 이름 -->
<property name="connectionMaker" ref="connectionMaker" />
</bean>
<beans>

application context 를 xml 설정파일로 만드는 방법은 간단하다 다른 구체 class를 사용하면 된다.

1
GenericXmlApplicationContext("applicationContext.xml");

최종적으로 현재 userDao 를 xml설정파일로 bean으로 등록하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- applicationContext.xml  -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="connectionMaker" class="com.springstudy.ioc.DconnectionMaker"></bean>
<bean id="userDao" class="com.springstudy.ioc.UserDao">
<property name="connectionMaker" ref="connectionMaker"></property>
</bean>

</beans>
1
2
3
4
5
6
public static void main(String[] args) {
ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
UserDao userDao = context.getBean("userDao", UserDao.class);
System.out.println("userDao = " + userDao);

}

Express Middleware concept

middleware 는 request, response 의 중간에 위치하며, requst,response에 필요한 작업을 수행한다. router,error handler 모두 middleware의 일종이다.

  • syntax

middleware 는 app.use(middleware) 형태로 실행된다.

middleware 의 parameter는 req,res,next이다.

express는 middleware를 위에서 아래로 순차적으로 실행하면서, 요청 url에 맞는 middleware를 실행하고 ,

next() 호출시 다음 middleware로 요청이 넘어간다.
만약 next() 호출되지 않으면 다음 middleware로 요청이 넘어가지 않는다.

Read more