목록공부 (77)
빠에야는 개발중
이진 탐색은 분할 정복의 기본이라고 할 수 있다. 개념은 알고 있었는데 직접 코드로 짜본 적이 있었나 싶어서 짚고 넘어간다. 원리 간단하게 말하면 "반으로 쪼개기"이다. head에서 tail까지 범위의 배열의 가운데 인덱스인 mid를 정해서 그 수와 찾고자 하는 수를 비교한다. 그래서 "찾는수 가운데 수"이면 탐색 범위를 [mid+1 ~ tail]로 쪼개서 탐색하는 것이다. 이 방식은 O(logn)의 시간 복잡도를 가져 선형 탐색보다 빠르다. 바로 구현에 들어가보자.123456789101112131415161718192021222324252627public class BinarySearch { public st..
Baekjoon Online Judge 10992번 "별찍기 - 17"https://www.acmicpc.net/problem/10992 새롭게 시작한 알고리즘 강의에서 추천해준 연습용 별찍기 문제를 풀던 중, 속이 비어있는 삼각형을 출력하는 문제를 만났다.처음에는 뭔가 간단히 끝낼 수 있을것 같은 느낌이 들어서 이것저것 시도해봤는데, 코드가 조잡해지기만 하고 별다른 진전이 없었다. 그래서 구글링을 해봤는데 이런 풀이를 발견했다.#include int n; int main() { scanf("%d", &n); for (int i = 0; i
준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구, 태양, 그리고 달을 나타낸다.지구를 나타내는 숫자를 E, 태양을 나타내는 숫자를 S, 달을 나타내는 숫자를 M이라고 했을 때, 이 세 수는 서로 다른 범위를 가진다. (1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19)우리가 알고있는 1년은 준규가 살고있는 나라에서는 1 1 1로 나타낼 수 있다. 1년이 지날 때마다, 세 수는 모두 1씩 증가한다. 만약, 어떤 수가 범위를 넘어가는 경우에는 1이 된다.예를 들어, 15년은 15 15 15로 나타낼 수 있다. 하지만, 1년이 지나서 16년이 지나면 16 16 16이 아니라 1 16 16이 된다. 이유..
여러 조건을 만족하는 정렬을 구현해보자. 우선 정렬할 객체를 생성할 클래스를 작성한다. 여기서는 Student로 하겠다.1234567891011class Student { int num; String name; String address; Student(int num, String name, String address) { this.num = num; this.name = name; this.address = address; }}Colored by Color Scriptercs 그 다음 Comparator 인터페이스를 구현하는 StudentCompare 클래스를 작성한다. 이때 Comparator 인터페이스의 제네릭 타입을 정해줘야한다. Student 끼리 비교하기 때문에 Student로 설정한다.Stu..
실습을 진행하면서 Controller의 메소드들 중 getBoard와 getBoardList의 리턴형이 ModelAndView였던 것을 String으로 통일시켜주는 부분이 있었다. 코드의 깔끔함이라는 관점에서는 납득을 하였지만, 정확히 어떻게 작동을 하는지는 확인해보지 않고 넘어갔었다. 이 부분을 짚고 넘어가고 싶었다. getBoardList 메소드의 코드를 살펴보면1234567891011@RequestMapping("/getBoardList.do")public String getBoardList(BoardVO vo, Model model) { if(vo.getSearchCondition() == null) { vo.setSearchCondition("TITLE"); } if(vo.getSearchKey..
JPA 이번에는 JPA를 사용해보자. ORM은 쿼리를 자동으로 생성해주는 등 편리한 점이 많기 때문에 꼭 써봐야겠다고 생각했다. 입문 저번처럼 스프링에 적용하기 전에 연습을 해보자. 먼저 maven 프로젝트를 하나 생성하고, 디펜던시 설정을 해준다. Project facets에 JPA를 체크하면 persistence.xml 파일이 자동으로 생성된다. 여기에 클래스 등록을 해준다.12345 com.springbook.biz.board.BoardVO//생략Colored by Color Scriptercs 다음은 엔티티 작성이다. @Entity 어노테이션을 사용하여 VO와 거의 동일하게 작성해준다.12345678910111213141516171819202122232425262728293031package co..
Mybatis 적용 마지막 챕터는 퍼시스턴스 레이어에 대해서 다룬다. 먼저 mybatis를 사용하여 굉장히 보기 싫었던 JDBC 접속 코드를 깔끔하게 만들자. 입문 스프링에 적용하기 전에 별도의 프로젝트를 만들어 적응해보고자 한다. 먼저 디펜던시를 설정해주고, IDE 마켓에서 java orm plugin을 설치해준다. 이녀석이 있으면 편하게 xml 파일을 만들 수 있다. VO는 기존 스프링 프로젝트에서 사용하던 BoardVO를 그대로 사용한다. 다음은 mapper xml을 작성한다. 파라미터의 물음표를 이름으로 바꿔주는 것 외에는 별다른 작업이 필요없다.1234567891011121314151617181920212223242526272829 insert into board(seq, title, write..
비즈니스 레이어 통합 그동안 진행하면서 컨트롤러가 DAO 객체를 직접 가져다 쓰는 코드를 짰었는데, 이런 코드는 좋지 않기 때문에 개선하고자 한다. 우선 그 이유부터 알아보자. 왜 안되는가? 상황 1 : 만약 기존의 DAO가 다른 클래스로 교체된다면? DAO를 참조하고 있는 모든 컨트롤러의 코드를 수정해야만 한다. 상황 2 : AOP를 사용하고 싶다. 그런데 AOP의 동작 시점인 비즈니스 메소드가 호출되지 않기 때문에 어드바이스도 호출되지 않는다. 실제로 지금까지의 코드에서는 AOP 설정을 해놨던 메소드가 전혀 호출되지 않고 있었다. 상황 1의 경우는 OCP를 위반하고 있다. 변경이 일어날 때마다 모든 부분을 수정하기 때문이다. 이는 추상화를 통하여 해결할 수 있다. 상황 2는 비즈니스 레이어를 강요하고..
어노테이션 기반 MVC 스프링은 xml을 통한 설정이 많다. 그래서 xml의 볼륨이 커지기 쉽고 비례적으로 복잡해진다. 따라서 이번에는 어노테이션 설정을 통해서 xml 파일을 날씬하게 만들어본다. 컨트롤러 설정 우선 presentation-layer.xml의 컨트롤러, handler mapping, view resolver 설정을 모두 지우고, 으로 대체한다. 패키지는 com.springbook.view로 설정한다.1234567891011 Colored by Color Scriptercs 그 다음 각 컨트롤러들을 하나로 모아서 BoardController로 묶어준 뒤, @Controller 어노테이션을 붙여준다. 이것만으로도 해당 클래스는 스프링 컨테이너에 의해 컨트롤러로 인식된다. @RequestMap..
Model2로 개선해보자 앞서 만든 게시판은 model1로서 뷰와 컨트롤러가 jsp에 모두 일임 되어있는 구조였다. 이는 유지보수에 매우 부적합한 형태이기 때문에 개선할 필요가 있다. 따라서 이번에는 model2로의 발전을 도모해본다. model2는 model1에서 컨트롤러를 따로 빼낸 형태이다. jsp이 가진 복수의 역할이 분리되므로 깔끔하고 이해하기 쉬운 코드가 될 수 있다. 12345678910111213 action action com.springbook.view.controller.DispatcherServlet contextConfigLocation /WEB-INF/config/presentation-layer.xml action *.doColored by Color Scriptercs우선 w..