고전적으로 객체를 생성하는 방법에는 Public 생성자를 사용하는 방법이 있다. 하지만 이러한 방법 외에도 정적 팩토리 메서드를 제공하는 방법이 있다. 정적 팩터리 메서드란 해당 클래스의 객체를 반환해주는 단순한 메서드를 말한다. 여기서 이야기하려는 정적 팩토리 메서드는 디자인패턴에서 소개되는 팩토리 패턴과 다르다. 이러한 정적 팩터리 메서드의 장점에 대해서 살펴보자. 장점 1. 생성하는 메서드에 이름을 부여할 수 있다. 즉, Item(1, 2)와 같이 객체를 생성하는 것보다 Item.createWeapon(1, 2)와 같이 만드는게 객체 생성코드만으로 무엇을 하고자하는지 표현할 수 있다는 장점이 있다. 한 클래스에 동일한 시그니처를 가지는 생성자를 여러개 추가하는 것보다 정적 팩토리 메서드를 사용해 각..
JWT JWT는 Json Web Token의 약자로 토큰에서 사용되는 컨텐츠를 Json으로 구성해 토큰화하는 시스템을 말한다. 즉, Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Web Token 이라고 설명할 수 있다. JWT가 다른 토큰과 다른점은 토큰 자체가 데이터를 가지고 있다는 점이다. JWT를 사용하면 토큰 자체가 데이터를 가지고 있기 때문에 서버가 stateless할 수 있다. 또한 인증을 위해 데이터베이스를 조회해야 하는 오버헤드를 줄일 수 있다는 장점이 있다. JWT를 사용하지 않을 때는 발급한 토큰을 서버측 DB에 저장한 후 올바른 토큰인지 검증했다. 따라서 여러 개의 서비스를 사용할 경우 저장된 토큰을 공유해야하는데 문제가 발생하고 위에서 언급한 데이터베이스 조회시 필요한 오..
MSA란? Micro Service Architecture의 약자로 하나의 서비스을 여러 개의 작은 서비스로 분리하여 제공하는 아키텍쳐를 말한다. 즉, 하나의 커다란 서비스를 제공하는데 여러 개의 마이크로 서비스가 상호작용하며 동작하는 것이다. 기존 Monolithic 아키텍처와 다르게 최소한의 중앙집중식 프로그램을 구성하기 때문에 여러가지 장점을 가져온다. 이러한 MSA를 채택해 설계한 기업으로는 대표적으로 Netflix가 있다. MSA 특징 2002년에 Amazon이 MSA 도입시 작성된 메일의 내용을 보며 특징을 설명한다. 모든 팀은 Service Interface를 통해 함수나 데이터를 공개해야 한다. 즉, 외부에서 내부 데이터에 직접접근할 수 없으며 반드시 외부에 공개된 API를 통해 접근해야 ..
이번 포스팅에서는 코딩테스트에 자주 출제되는 그래프, 트리를 탐색하는 방법인 DFS(Depth-First Search)와 BFS(Breadth-First Search)에 대해서 소개하려고 한다. DFS (Depth-First Search) DFS는 하나의 노드에서 갈 수 있는 노드가 여러개 있다고 했을 때, 하나의 노드에 대해서 완벽하게 탐색하고난 후 다음 노드에 대해서 탐색하는 방법을 말한다. 좀 더 교과서적으로 정리해보자면 다음 분기(Branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법을 DFS라고 한다. 하나의 길로 쭈우우욱 가보고 막히면 돌아와서 다음 길로 가는 형태를 말한다. 보통 모든 노드를 방문해야 할 경우 DFS를 선택한다. DFS 알고리즘을 프로그래밍할 때는 일반적으로 재귀함..
1. 무한루프를 통해 테스트 케이스를 실행하는 경우 특정 조건이 일치하는 것을 찾는 문제에서, 테스트 케이스의 수가 정해지는 것이 아니라 무한루프를 통해서 확인한다면 Boolean 배열에 저장해 활용함으로써 시간 단축이 가능하다. 2. 소수 빠르게 구하기 소수인지 확인은 2 ~ (i ** 0.5) + 1 의 범위만 확인해도 된다. 3. 파이썬에서의 전역변수 처리 함수 외부에 있는 전역변수(입력 값)을 함수에서 사용하려면 global 키워드를 사용하면 된다. 4. 빠른 입출력함수 input(), print() 대신 sys.stdin.readline(), sys.stdout.write() 함수를 사용하는 것이 빠르다. 5. 다양한 기본 라이브러리 사용 collections(deque, Counter, .....
동적 계획법(Dynamic Programming) 이란? 동적 계획법이란 어떠한 문제에 대한 최적해를 얻고자할때 해당 문제에 대해 부분적으로 분할하여 작은 문제를 먼저 해결한 뒤, 각 부분에 대해 최적의 해답을 차례로 구해가는 알고리즘이다. 솔직히 이런 이론적인 어려운 말보다 내가 이해한 것을 말하자면 "분할 정복을 통해서 문제를 해결하는데 동일한 문제는 한번만 풀자" 이다. 단순 분할 정복은 동일한 문제를 반복적으로 계산해 시간을 낭비한다는 단점이 있다. 동적 계획법은 이러한 비효율적인 부분을 해결할 수 있다는 장점이 있다. 따라서 동적 계획법을 통해 문제를 해결하게 된다면 단일항 시간복잡도를 통해 문제를 해결할 수 있다. 위 사진은 피보나치 수열의 값을 재귀함수를 통해 구할 때 거치게되는 노드 트리이..