일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 클린코드
- 클린 코드
- SQLD 이론
- MFC
- 오픽 초보
- BFS
- sqld
- DP
- SW개발자를 위한 성능좋은 SQL
- Python
- sqld요약
- 서버최적화
- 알고리즘
- clean code
- beautifulsoup
- 서버아키텍처
- 오픽
- 폴링vs이벤트
- 백준
- Javascript
- 자청
- N-Queen
- 역행자
- c++
- SQLD이론
- 게임서버개발
- 파이썬
- 주석
- git
- Backtracking
- Today
- Total
가취공부하자

책에 기억하고 싶은 내용을 정리한 것 변수 사이에 함수라는 계층을 넣는다고 구현이 저절로 감춰지지는 않는다. 구현을 감추려면 추상화가 필요하다! 그저 조회함수와 설정함수로 변수를 다룬다고 클래스가 되지 않는다. 그보다는 추상 인터페이스를 제공해 사용자가 구현을 모른채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스다. 즉 자료를 세세하게 공개하기 보다는 추상적인 개념으로 표현하는 편이 좋다. 아무 생각없이 get/set함수를 추가하는 방법이 가장 나쁘다. 객체와 자료구조는 근본적으로 양분된다. 객체 : 비공개 변수와 공개 함수만 포함. 자료구조 : 함수 없이 공개 변수만 포함 으로 이해해라 객체지향 코드에서는 자료 타입의 추가는 쉽다. 그러나 새로운 함수 추가는 어렵다. 모든 클래스에 함수를 추가해..

책에 있는 내용 중 기억하고 싶은 내용 정리한 것. 프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야 한다. 형식을 맞추는 이유는 오늘 구현한 기능이 다음 버전에서 바뀔 확률은 아주 높다. 오늘 구현한 코드의 가독성은 앞으로 바뀔 코드의 품질에 지대한 영향을 미친다. 적절한 코드 형식 적절한 행 길이를 유지하라 200~500줄 사이로도 시스템 구축할 수 있다. 이 규칙은 엄격한 규칙은 아니지만 바람직한 규칙으로 삼으면 좋겠다. 일반적으로 작은 파일이 큰 파일보다 이해하기 쉽다. 신문기사처럼 작성하라 이름은 간단하면서 설명이 가능하게 소스파일의 첫부분은 고차원 개념과 알고리즘 설명 내려갈수록 의도를 세세하게 묘사 개념은 빈행으로 분리하라 일련의 행 묶음은 완결된 생각 하나를 표현한다. 생각 사이에는 빈행을 ..

책에 있는 내용 중 기억할 만한 내용 정리한 것. 우리는 코드로 의도를 표현하지 못해, 그러니까 실패를 만회하기 위해 주석을 사용한다. 우리가 코드로 의도를 표현할 때 마다 스스로를 칭찬해주자,, 반대로 주석을 달 때마다 자신에게 표현력이 없다는 사실에 푸념해야 마땅하다고 한다.. 부정확한 주석은 아예 없는 주석보다 훨씬 나쁘다. 주석은 나쁜 코드를 보완하지 못한다.. -> 주석으로 달려는 설명을 함수로 만들어 표현해라 좋은 주석도 있다. (필요하거나 유익하다) 법적이 주석 정보를 제공하는 주석 의도를 설명하는 주석 의미를 명료하게 밝히는 주석,,(신중히 달아야 해!!) 결과 경고하는 주석 TODO 주석 (앞으로 할일을 남겨두는 주석) 중요성을 강조하는 주석 나쁜 주석 (대부분의 주석이 여기에 속한다.)..

책에 있는 내용 중 기억할 만한 내용 정리한 것. 함수를 만드는 첫 번째 규칙은 '작게!'다 둘째 규칙은 '더 작게!'다. 저자의 경험을 바탕으로 오랜 시행착오를 바탕으로 저자는 함수가 좋다고 확신한다. 함수는 짧아야 한다! 블록과 들여쓰기 If문/else 문/ while 문 등에 들어가는 블록은 한 줄이여야 한다. 함수에서 들여쓰기 수준은 1단이나 2단을 넘어서면 안된다. 함수는 한 가지 기능만 수행해야 한다. 함수당 추상화 수준은 하나로! 함수가 확실히 '한가지' 작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야한다. - getHtml() : 추상화 수준이 아주 높다. - String pagePathName = PathParser.render(pagepath); 추상화 수준 중간 - .app..

책에 있는 내용 중 기억할 만한 내용 정리한 것. 이름을 잘 짓는 규칙 중 중요하다고 생각하는 것 몇 개 정리해보겠다. 의도를 분명히 밝혀라 변수, 함수, 클래스 이름은 다음과 같은 질문에 모두 답해야한다답해야 한다. 1) 변수의 존재 이유는? 2) 수행 기능은? 3) 사용방법은? 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말이다. 의미 있게 구분해라 동일한 범위 안에서 다른 두개념에 같은 이름을 사용하지 못한다. 그래서 연속된 숫자를 덧붙이거나 불용어를 추가하는 방식을 사용하는데 이는 적절하지 못하다. 읽는 사람이 차이를 알 수 있도록 이름을 지어라 검색하기 쉬운 이름을 사용해라 긴 이름은 짧은 이름보다 좋다. 이름의 길이는 사용 범위 크기에 비례해야 한다. => 변수나 상수를 코드 여러곳..

코드는 요구사항을 상세히 표현하는 언어다! 즉, 기계가 실행할 정도로 상세하게 요구사항을 명시하는 작업이 프로그래밍이다. 일정에 급급해 나쁜 코드를 만들어내는 건 프로그래머 책임이다. 일정도 중요하지만 나쁜 코드의 위험성을 이해하지 못하는 관리자의 말을 그대로 따르는 행동은 전문가 답지 못하다. 나쁜 코드를양산하면 오히려 엉망진창인 상태로 속도가 늦어져 결국 기한을 놓친다. 기한을 맞추는 유일한 방법 (빨리 가는 유일한 방법)은 언제나 코드를 깨끗하게 유지하는 습관이다 유명한 프로그래머가 말하는 깨끗한 코드란? 깨끗한 코드 : 보기에 즐거운 코드 + 세세한 사항까지 오류 처리(메모리 누수 상태, race condition 나쁜 코드 : 깨진 창문 같이 더 깨지거나 더러워져도 상관하지 않아 쇠퇴하게 된다...

BFS란? BFS (Breadth-First Search) : 너비 우선 탐색 출처 https://developer-mac.tistory.com/64 출발노드에서 시작해서 인접한 노드를 먼저 탐색하는 방법이며 멀리 떨어져 있는 노드를 나중에 방문하는 순회 방법으로 큐로 구현됨. 다시 말하면 인접한 노드를 반복적으로 큐에 넣도록 알고리즘을 작성하여, 먼저 들어온 노드가 먼저 나가게 되어 가까운 노드 부터 탐색하게 됨. - 동작 과정 1) 시작 노드를 큐에 삽입하고 방문 처리 2) 큐에서 노드를 꺼내 해당 노드의 인접 노드중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문처리 3) 2번의과정을 더이상 수행할 수 없을 때까지 반복 주로 두 노드의 최단 경로를 찾고 싶을 때 사용된다. 구현 코드 from co..

deque란 무엇인가? deque는 파이썬의 List와 같이 요소들을 담아두는 배열이다. FIFO (First In First Out) 방식인 queue와 비슷하다. deque는 선입선출(FIFO), 선입후출(FILO) 모두 지원한다. deque VS list - Deque는 위에서 설명한 것 같이 양끝 요소 삭제/추가 기능을 지원하기 때문에 해당 기능을 실행할 때 시간 복잡도가 O(1)이다. - 파이썬의 List는 고정된 사이즈의 메모리를 갖는 array형태이다. 1 2 3 4 5 마지막 원소를 삭제하면 O(1)이지만, 1 2 3 4 첫 번째 원소를 삭제할 경우 각 원소를 앞으로 이동시키기 때문에 시간 복잡도는 O(n)이다. 1 2 3 4 5 2 3 4 5 따라서 마지막 원소 삽입/삭제에는 리스트와 덱..

설치경로/MongoDB/Server/6.0/bin에 mongod.exe 실행해도 연결이 안돼서 찾아봤더니 mongodb 서버 시작을 안 해줘서 connect ECONNREFUSED 127.0.0.1:27017 이 에러가 뜬다고 한다. 해결 방법 (MONGO DB 서버 시작) 검색창에 서비스 > mongodb.exe 검색 후 시작 클릭 서비스 : 제어판 > 시스템 및 보안 > 관리도구 > 서비스 (이 과정으로도 접속 할 수 있습니다.) 참고 : https://stackoverflow.com/questions/46523321/mongoerror-connect-econnrefused-127-0-0-127017

input 예시 5 123 456 789 1011 1213 sys.stdin.readline()을 사용한 경우 for문을 통해 입력값을 받는다. => sys.stdin.readline은 한 줄씩 입력받는다. import sys n = int(input()) data = [int(sys.stdin.readline()) for i in range(n)] print(data) #결과 [123, 456, 789, 1011, 1213] sys.stdin.read()를 사용한 경우는 한 번에 입력 값을 받는다. (ctrl+z로 종료시킬 때까지) import sys n = int(input()) data =list(map(int,sys.stdin.read().split())) print(data) #결과 [123, ..