목록CS (12)
개발자 블로그

컴퓨터에서 숫자를 기억하는 방식은 2진수 즉, 0과 1로만 모든 것을 표현한다. 이 때문에 오는 오차가 있어 사용 시 주의해야할 상황이 있는데 이는 float 타입을 사용할 때이다. 예를들어, 0.1이라는 숫자를 컴퓨터가 저장하는 방식은 이진수로 나타낸다면, 무한히 반복되는 숫자가 되버린다. 하지만 컴퓨터는 이러한 수를 근삿값으로 저장한다. 떄문에 정확한 값을 저장하지 않는다는 말! 이러한 문제를 해결하기 위해 파이썬에서는 decimal.Decimal, round() 등 여러가지 메소드를 통해 부동소수의 한계를 해결하는 방법 등이 있긴하다. 하지만, 이 또한, 완벽히 문제를 해결하는 방법이 아닐 수도 있으니, 사용할 시 주의하고 상황에 맞는 방법을 활용하도록 하자! 결론, 정확한 소수점 계산을 해야할 때..
get methhod는 조회나 검색에 활용되는 http method이다. 따라서 클라이언트에서 서버로 데이터를 보낼 때, 다른 방식과 다르게 request body에 실어 보내지 않는다. 따라서 get method에서 데이터를 서버에 보내기 위해선 QueryString을 사용하거나 path parameter로 데이터를 보내야 합니다. QueryString: /endpoint?key1=value1&ket2=value2 path parameter: /endpoint// 두 가지 쓰임이 있기에 상황에 따라 두가지를 사용하면 되겠다. 우선 쿼리 스트링의 경우, Id와 같이 정확한 데이터의 정보가 아닌 경우에 쓰이며, 조건에 맞는 쿼리셋을 사용자에게 보여줄 때 사용된다. 반면, 경로 인자는 객체의 id값과 같은..

DFS # 위의 그래프를 예시로 삼아서 인접 리스트 방식으로 표현했습니다! graph = { 1: [2, 5, 9], 2: [1, 3], 3: [2, 4], 4: [3], 5: [1, 6, 8], 6: [5, 7], 7: [6], 8: [5], 9: [1, 10], 10: [9] } visited = [] # 방문한 걸 저장하기 위한 배열 1. 우선 탐색 시작 노드를 1로 잡겠습니다! 2. 현재 방문한 노드인 1을 visited 에 추가합니다. # visited -> [1] 3. 인접한 노드들인 [2, 5, 9] 에서 방문하지 않은 것들은 [2, 5, 9] 입니다. 2 에 방문합니다. 4. 현재 방문한 노드인 2을 visited 에 추가합니다. # visited -> [1, 2] 5. 인접한 노드들인 [..
컴퓨팅에서 키를 값에 매핑할 수 있는 구조인, 연관 배열 추가에 사용되는 자료 구조이다. 해시 테이블은 해시 함수를 사용하여 색인(index)을 버킷(bucket)이나 슬롯(slot)의 배열로 계산한다. 데이터를 다루는 기법 중에 하나로 데이터의 검색과 저장이 아주 빠르게 진행된다. 해쉬 자료구조는 파이썬에서 딕셔너리와 같다. key값으로 빠르게 해당하는 value를 찾고 저장할 수 있는 자료구조이다. key와 매핑된 벨류를 반환하기 때문에 모든 배열을 돌아보지 않고 조회가 가능하므로 상수 시간의 시간 복잡도를 갖고 있다. 알고리즘 문제를 풀다보면 시간 복잡도를 줄이기 위해 index()라는 함수보다 딕셔너리로 값들을 저장하곤 한다. 하지만 딕셔너리도 다소 메모리가 더 잡히는 부분 때문에 이러한 부분도 ..
Array vs LinkedList 상황 Array LinkedList 특정 원소 조회 O(1) O(N) 원소 삽입, 삭제 O(N) O(1) 원소 추가 데이터 추가 시 공간이 찼다면 새로운 메모리를 할당 받아야한다. 모든 공간이 차도 맨뒤에 노드만 동적으로 추가한다. 정리 데이터 조회가 빈번하다면 Array! 삽입과 삭제 또는 데이터 추가가 빈번하다면 LinkedList! *그렇다면 파이썬의 경우 리스트는 링크드 리스트인가? pyhton의 리스트는 array로 구현되어 있다. 하지만 append의 경우 내부적으로 동적 배열이라는 걸 사용해서, 배열의 길이가 늘어나도 O(1)의 시간 복잡도가 걸리도록 설계가 되어있다. 따라서 python의 배열은 링크드 리스트로 쓸 수 있고, 배열로도 쓸 수 있게 만든 효..
프로젝트를 하면서 인증 방식을 어떻게 구현할지는 개발자의 선택이고 때문에 보편적으로 사용되고 있는 몇가지 방식의 장단점을 잘 알고 상황에 맞춰 프로젝트에 적용시킬 수 있어야 한다. 일단 우리는 왜 인증 절차를 취할까? http의 특징을 짚고 넘어가면 http는 무상태성을 유지한다. 무상태성(stateless)는 사용자의 상태를 알고 있지 않다는 것이다. 서비스가 점점 복잡해지면서 서버는 사용자의 상태를 파악하고 이에 맞게 응답을 해줄 필요가 있다. 따라서 http의 무상태성을 보완하기 위해 몇가지 인증 방식이 있다. 가장 보편적으로 사용되고 있는 세션 토큰 방식과 JWT토큰 방식을 위주로 설명해보자! 인증과 인가 인증은 로그인을 하여 유저가 해당 서비스의 사용자라는 절차를 밟는 것이 인증! 인가는 per..
통신을 중계하는 프로그램 : 프록시, 게이트웨이, 터널 HTTP는 클라이언트와 서버 이외에 프록시, 게이트웨이, 터널과 같은 통신을 중계하는 프로그램과 서버와 연계하는 것도 가능하다. 두 서버 사이의 중계 역할을 하고 클라이언트에 리스폰스를 반화하는 역할을 한다. 여기서 의문점이 생긴다. 아니 의사소통도 대변인이 있으면 잘 되지 않고 시간이 오래 걸리는데, 이러한 중계 프로그램을 두는 이유는 무엇일가? 아마 다른 이점이 있을 것이다. 여기서는 이러한 중계 프로그램이 하는 일과 장점을 아주 간단하게 알아보고 정리하는 정도로만 해보자! 1) 프록시는 서버의 대변인? 이전에 프로젝트를 하면서 Nginx에 대해 공부를 한 경험이 있다. 그 때 처음 들어본 단어인데, 종류로는 포워드 프록시와 리버스 프록시가 있다..
시작하기에 앞서 객체지향 프로그래밍과 함수형 프로그래밍은 반대되는 개념이 아닌 상호 보완적 개념이라고 할 수 있다. 둘의 특징과 예시를 통해 무엇이 다른지 알아보며, 어떻게 적용하며 프로그래밍할지가 해당 주제의 핵심일 것 같다. 1. OOP 객체지향의 특성 다형성 : 오버로딩과 오버라이딩을 통해 기능(메소드)를 여러가지의 형태로 상황과 개발자의 선택에 따라 그 동작(형태)이 달라질 수 있음. 추상화 : 다수의 객체의 공통된 부분만을 추려내는 것, 복잡한 문제를 간단한(핵심적인) 형태로 구현해보는 것 캡슐화 : 객체의 메소드와 속성을 하나로 묶어 관리하는 방법이며, 정보 은닉(보호)과 재활용성 등의 목적이기도 하다. 상속성 : 부모 클래스(상위)의 특성을 토대로 자식(하위) 클래스를 생성하며 확장성과 유지..
인덱스라는 말은 실생활에서 책 앞단에서 많이 볼 수 있다. 목차라는 영어이다. 책으로 공부를 하면서 원하는 부분을 다시 보고 싶을 때가 있다. 그럴 때 목차를 통해 원하는 부분을 빠르게 볼 수 있다. 그렇다면, DBMS에서 인덱스는 어떤 기능을 하고 언제 어떻게 사용하면 좋을지 개념 위주로 살펴보자! 책과 DBMS에서 인덱스와의 공통점은 '정렬'이라는 것이다. 알파벳, 글자, 숫자 등 기준이 되는 것에 정렬이 되어 있다는 것이다. 바로 정렬이라는 것이 인덱스의 핵심이고 정렬을 통해 인덱스의 장점과 단점을 파악해볼 수 있다. 그럼 자료구조와 비교해서 설명을 하면 인덱스는 SortedList 자료 구조이고, 데이터 파일은 ArrayList와 빗대어 볼 수 있다. 두 가지 차이는 정렬을 한다. 안한다의 차이이..

0. 패킷 통신 규약 중 가장 보편적으로 쓰이는 TCP/IP 패킷 통신이 무엇인지, 패킷통신의 배경은 해당 링크를 참고! 1. TCP/IP는 프로토콜의 집합이다. 그렇다면, 프로토콜은 뭐지? 프로토콜은 규칙 및 약속이라고 생각하면 된다. 만약 우리가 다른 나라사람과 대화를 해야한다면, 우리는 언어가 다르기 때문에 소통의 어려움이 있을 수 있다. 때문에 어떻게 대화를 시작할지, 어떤 언어로 대화를 할지, 언제 대화를 끝낼지와 같은 약속이 필요하다. 이를 다시 네트워크로 빗대어 보면 다른 OS와 컴퓨터, 네트워크 기기가 서로 어떻게 파일(데이터)을 주고 받을지에 대한 약속이라고 한다. 프로토콜에는 여러가지가 있다. 데이터를 어떻게 보낼지, 데이터를 목적지까지 최적의 경로를 보내는 방법 등 인터넷과 관련된 프..