본문 바로가기

ETC/개발 지식14

빅오(Big-O) 표기법 빅오(Big-O) 표기법 알고리즘 공부와 시간 복잡도를 판단할 때에 흔히 쓰는 단위?는 빅오 표기법입니다.. 따라서 빅오 표기법에 대해 정리하려 합니다. 빅오 표기법 빅오 표기법은 알고리즘의 효율성(시간복잡도)를 표기해주는 표기법입니다. 데이터의 개수가 n개라 할 때, 해당 알고리즘의 시간 복잡도의 최댓값을 표기합니다. 예를 들어 n^2 + 2n + 3의 연산을 하는 알고리즘의 시간 복잡도를 빅오 표기법으로 따진다면 O(n^2)으로 상수와 영향력이 적은 항을 제외하고 나타낼 수 있습니다. 빅오표기법 시간복잡도 순서 빅오 표기법의 시간복잡도는 다음과 같은 순서로 나열할 수 있습니다. O(2^n) > O(n^2) > O(n log n) > O(n) > O(log n) > O(1) 대표적인 빅오 표기법에 따른.. 2022. 9. 4.
[CleanCode] 8장 경계 8장 경계 외부 코드 사용하기 public class Sensors { private Map sensors = new HashMap(); public Sensor getById(String id) { return (Sensor) sensors.get(id); } } Map을 예시로 Map은 clear(), containsKey(), containsValue() 등 많은 기능을 제공한다. 때문에 Map 사용자라면 누구나 clear()메서드를 이용해 Map 내용을 지울 수 있다. 즉, 사용자에게 필요하지 않은 기능까지 제공한다. 또한 Map이 반환하는 Object를 올바른 유형으로 변환할 책임은 Map을 사용하는 클라이언트에 있다. 제네릭스를 사용하면 코드 가독성이 높아지지만, 아직 사용자에게 필요하지 않은.. 2022. 7. 4.
[CleanCode] 7장 오류 처리 7장 오류 처리 오류 처리는 프로그램에 반드시 필요한 요소다. 뭔가 잘못될 가능성은 늘 존재한다. 오류 코드보다 예외를 사용하라. 오류를 확인한느 방법을 if문 등으로 처리한다면 호출자 코드가 복잡해진다. 함수를 호출한 즉시 오류를 확인해야 하기 떄문이다. 오류가 발생하면 예외를 던지는 편이 낫다. 호출자 코드가 더 깔끔해지기 때문에 논리가 오류 처리 코드와 뒤섞이지 않기 때문에 Try-Catch-Finally 문부터 작성하라 try 블록에서 무슨 일이 생기든지 catch 블록은 프로그램 상태를 일관성 있게 유지해야 한다. 그러므로 예외가 발생할 코드를 짤 떄는 try-catch-finally 문으로 시작하는 편이 낫다. 예외에 의미를 제공하라 예외를 던질 떄는 전후 상황을 충분히 덧붙인다. 오류가 발생.. 2022. 7. 2.
[CleanCode] 6장 객체와 자료구조 6장 객체와 자료구조 자료 추상화 // 구체적인 클래스 public class Point { public double x; public double y; } // 추상적인 클래스 public interface Point { double getX(); double getY(); void setCartesian(double x, double y); double getR(); double getTheta(); void setPolar(double r, double theta); } 변수 사이에 함수라는 계층을 넣는다고 구현이 저절로 감춰지지는 않는다. 구현을 감추려면 추상화가 필요하다. 자료를 세세하게 공개하기 보다는 추상적인 개념으로 표현하는 편이 좋다. 아무 생각 없이 조회/설정 함수를 추가하는 방법이 가.. 2022. 7. 2.
[CleanCode] 5장 형식 맞추기 5장 형식 맞추기 형식을 맞추는 목적 코드 형식은 중요하다. 코드 형식은 의사소통의 일환이다. 의사소통은 전문 개발자의 일차적인 의무다. 적절한 행 길이를 유지하라 일반적으로 행 길이가 큰 파일보다 작은 파일이 이해하기 쉽다. 신문 기사처럼 작성하라 소스 파일은 신문 기사와 비슷하게 작성한다. 이름은 간단하면서도 설명이 가능하게 짓는다. 이름만 보고도 올바른 모듈을 살펴보고 있는지 아닌지를 판단할 저옫로 신경써서 짓는다. 소스 파일 첫 부분은 고차원 개념과 알고리즘을 설명한다. 아래로 내려갈수록 의도를 세세하게 묘사한다. 마지막에는 가장 저차원 함수와 세부 내역이 나온다. 개념은 빈 행으로 분리하라 거의 모든 코드는 왼쪽에서 오른쪽으로 그리고 위에서 아래로 읽힌다. 각 행은 수식이나 절을 나타내고, 일련.. 2022. 6. 30.
[CleanCode] 4장 주석 주석 잘 달린 주석을 그 어떤 정보보다 유용하다. 주석을 나쁜 코드를 보완하지 못한다 코드에 주석을 추가하는 일반적인 이유는 코드 품질이 나쁘기 때문이다. 표현력이 풍부하고 깔끔하며 주석이 거의 없는 코드가, 복잡하고 어수선하며 주석이 많이 달린 코드보다 훨씬 좋다. 코드로 의도를 표현하라 나쁜 예 //직원에게 복지 혜택을 받을 자격이 있는지 검사한다. if ((employee.flags & HOURLY_FLAG) && (employee.agae > 65)) 좋은 예 if (employee.isEligibleForFullBenefits()) 몇 초만 더 생각하면 코드로 대다수 의도를 표현할 수 있다. 좋은 주석 정말로 좋은 주석을, 주석을 달지 않을 방법을 찾아낸 주석이다. 법적인 주석 회사가 정립한 구.. 2022. 6. 28.
[CleanCode] 3장 함수 - 2 함수 - 2 부수효과를 일으키지 마라 함수에서 한 가지를 하겠다고 약속하고선 남몰래 다른 것도 하면 안된다. 예상치 못하게 클래스 변수를 수정하고나, 함수로 넘어온 인수나 시스ㅔㅁ 전역 변수를 수정하면 안된다. 출력 인수 // 나쁜 예 appendFooter(stringBuffer); // 좋은 예 report.appendFooter() 일반적으로 우리는 인수를 함수 입력으로 해석한다. 출력 인수는 피해야 한다. 함수에서 상태를 변경해야 한다면 함수가 속한 객체 상태를 변경하는 방식을 택한다. 명령과 조회를 분리하라 함수는 뭔가 수행하거나 뭔가에 답하거나 둘 중 하나만 해야 한다. 객체 상태를 변경하거나 객체 정보를 반환하거나 둘 중 하나다. 오류코드보다 예외를 사용하라 명령 함수에서 오류 코드를 반환하.. 2022. 6. 26.
[CleanCode] 3장 함수 - 1 함수 - 1 작게 만들어라 함수를 만드는 첫째 규칙은 작게이다. 둘째 규칙은 더 작게이다. 블록과 들여쓰기 if문, else문, while문 등에 들어가는 블록은 한줄이어야 한다. 이 한줄에서 대개 함수를 호출한다. 블록 안에서 호출하는 함수 이름을 적절하게 짓는다면, 코드를 이해하기도 쉬워진다. 즉, 중첩 구조가 생길만큼 함수가 커져서는 안된다. 함수에서 들여쓰기 수준은 1단이나 2단을 넘어가면 안된다. 한 가지만 해라 함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다. 지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 하는 것이다. 함수를 만드는 이유: 큰 개념을 다음 추상화 수준에서 여러 단계로 나눠 수행하기 위해서 단.. 2022. 6. 26.
[CleanCode] 2장 의미있는 이름 의미있는 이름 의도를 분명히 밝혀라 // 좋지 않은 예 int d; // 좋은 예 int daysSinceCreation; 변수나 함수 그리고 클래스 이름은 해당 변수와 클래스의 존재 이유, 수행 기능, 사용 방법에 대한 질문에 모두 답하여야 한다. // 좋지 않은 예 public List getThem() { List list1 = new ArrayList(); for (int[] x : theList) if(x[] == 4) list1.add(x) return list1; } // 좋은 예 public List getFlaggedCells() { List flaggedCells = new ArrayList(); for (Cell cell : gameBoard) if(cell.isFlagged()) f.. 2022. 6. 25.