가장 기본적인 다익스트라 알고리즘 문제이다. 다익스트라 알고리즘을 처음 접한다면 아래 글을 한번 읽어보는 것을 추천한다. 2023.06.26 - [자료구조_알고리즘/Algorithm] - [Algorithm] 다익스트라(dijkstra) 알고리즘 (최단거리, 가중치 그래프) 우선 Edge 클래스를 하나 만들어서 해당 edge가 가리키는 노드, 가중치를 저장한다. 출발 노드는 ArrayList의 index로 관리할 것이기 때문에 필요 없다. 그래프 정보를 저장할 ArrayList[ ] 배열과 최단거리 배열 int[ ] distance를 만들고, 초기화 한다. 각 Edge의 가중치가 작은 것 부터 poll() 할수 있는 우선순위 큐를 만들고 시작점을 먼저 넣는다. 이후 우선순위 큐에서 Edge를 하나씩 꺼내..
이 문제는 최소 한의 강의실을 사용해서 주어진 강의를 모두 가능하게 만드는 방법을 찾는 문제이다. 첫째 줄에 1 - 3 강의를 위해 강의실 1이 필요하고, 둘째 줄에 2 - 4 강의를 위해 강의실 2가 필요하고, 셋째 줄에 3 - 5 강의를 시작 할 시점에는 강의실 1에서 강의가 끝난 시점 이므로 강의실 1을 이용할 수 있다. 그래서 총 강의실 2개가 필요하다는 결과가 나온다. 예제 입력은 단 3개 뿐이라 쉽지만, 입력이 많아지면 어떻게 해야 할까? 일단 시작시간이 빠른 순으로 정렬해야 한다. 어차피 빠른 시각에 시작하는 강의를 먼저 처리해야 하기때문이다. 그런데 추가로 종료시간도 빠른 순으로 정렬해야지 편할 것이다. 따라서 시작시간이 같을 경우 종료시간이 빠른 순으로, 이외에는 시작시간이 빠른 순으로 ..
우아하게 예외 처리하기 클린코드를 다루는 책에서 오류처리를 왜 논하는가? 오류처리는 프로그램에 반드시 필요한 요소 중 하나일 뿐이다. 클린코드와 오류처리는 확실히 연관성이 있다. 7장에서는 깨끗하고 튼튼한 코드에 한걸음 더 다가가는 단계로 우아하고 고상하게 오류를 처리하는 방법을 다룬다. 예외 처리 오류 코드보다 예외(Exception)를 사용하라 요즘은 예외를 던지는 것이 당연한 시대이지만, 과거에는 오류코드를 만들어서 던지는 방법을 사용했었다. 예외를 던지는 방법이 훨씬 명확하고, 처리 흐름이 깔끔해진다 예외를 던지고, 처리하는 방식 public class DeviceController { public void sendShutDown(){ try{ tryToShutDown(); }catch(Devic..
자료구조와 객체 자료구조(Data Structure) 데이터 그 자체를 말함 자료를 공개 변수 사이에 Getter, Setter로 변수를 다룬다고 자료구조가 객체가 되는게 아니다. 객체(Object) 비즈니스 로직과 관련이 있다. 자료를 숨기고, 추상화한다. 자료를 다룰 수 있는 함수만 제공한다. 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있다. 구체적인 것과 추상적인 것? 추상화라는것은 최소한의 정보를 제공하는 것이다. 우리는 100 x (가솔린 양) / (연료탱크 용량)은 몰라도 된다. 몰라야만 할 수도 있다. 우리가 가솔린이 몇 퍼센트 차있는지, 그 퍼센트가 필요하다. 따라서 두번째, 추상적인 클래스가 더 낫다. 구체적인 Vehicle 클래스 public interf..
클린코드 요즈음 클린코드 책을 읽고 있어서인지는 몰라도 나는 유지보수가 쉽고 가독성 좋은 코드를 짜는 것에 관심이 많은 것 같다. 이러한 고민은 처음으로 작은 프로젝트(엄청 작은(계산기만들기같은..))를 만들어볼 때부터 있었던 것 같다. (진짜 왕왕초보 때) 이렇게 코드를 짜니까 뭐가 뭔지 하나도 모르겠다. 이게 맞나? ㅋㅋㅋ 이 부분은 메서드로 빼는 게 나은가? 이 부분은 클래스를 만들어서 쓰는 게 나은가? 메서드이름을 어떻게 지어야 할까? if( isTrue == false )가 나은가 if(! isTrue)가 나은가? ... 이런 고민들을 하고, 내가 스스로 생각해서 이게 낫겠다 싶은 방법으로 하기도 하고, chat GPT에 물어보기도 하다가 결국 클린코드 책을 사서 읽는 중이다. 리팩터링 나름 초..
이번 장의 내용은 이 책을 보지 않았어도 여러분이 이미 대충은 알고 있었을 것이고, 이미 잘 지키고 있는 분들도 많을 것이다. 코드를 짤때 일정한 형식을 맞추는 것에대한 내용이다. 코드 글자를 구성하는 세세한 부분부터, 필드, 메서드의 배치까지 더 나은 방법을 제시한다. 형식(포맷팅)을 맞추는 목적 한가지를 분명히 짚고 넘어가자. 코드 형식은 중요하다! 너무 중요해서 무시하기 어렵다. 처음으로 코드를 짜고, 오랜 시간이 지나 원래 코드의 흔적을 더이상 찾아보기 어려울 정도로 코드가 바뀌어도 맨 처음 잡아놓은 구현 스타일과 가독성 수준은 유지보수의 용이성과, 확장성에 계속 영향을 미치게 된다. 즉, 오늘 처음구현한 코드의 가독성은 앞으로 바뀔 코드의 퀄리티에 지대한 영향을 미친다. 쉬운 예제를 하나 가져왔..
주석을 최대한 쓰지 말자 잘 달린 주석은 그 어떤 정보보다 유용하다. 그러나 경솔하고 근거 없는 주석은 코드를 이해하기 더 어렵게 만든다. 프로그래밍 언어 자체가 표현력이 풍부하다면, 우리에게 프로그래밍 언어를 치밀하게 사용해 의도를 표현할 능력이 있다면, 우리에겐 주석이 필요 없을 것이다. 즉, 코드에 주석이 달려있다면 코드 품질이 나쁘기 때문일 확률이 높다. (물론 아닌 경우도 있다. [주석은 이럴때만 쓰자] 에서 알아보자.) 주석은 나쁜 코드를 보완하지 못한다. //직원에게 복지 혜택을 받을 자격이 있는지 검사한다. if( employee.flags && HOURLY_FLAG && employee.age > 65 ){} employee.flags , HOURLY_FLAG , employee.age>..
객체지향 5대 원칙 SOLID SRP : 단일 책임 원칙 OCP : 개방-폐쇄 원칙 LSP : 리스코프 치환 원칙 ISP : 인터페이스 분리 원칙 DIP : 의존성 역전 원칙 이 책을 읽다 보면 위의 객체지향 5대 원칙이 많이 등장한다. 3장 함수를 포함하여 객체지향 프로그래밍을 할 때 위의 원칙을 항상 상기하며 개발을 한다면 클린코드에 한걸음 가까워지게 될 것이다. SOLID의 자세한 내용은 아래 링크를 확인해 주세요. 2023.04.20 - [JAVA/JAVA 이론] - [JAVA] 객체지향 4대 특성(캡슐화, 상속, 다형성, 추상화), 5 원칙(SOLID) [JAVA] 객체지향 4대 특성(캡슐화, 상속, 다형성, 추상화), 5 원칙(SOLID) 객체지향의 4대 특성 : 캡슐화, 상속, 다형성, 추상..