분류 전체보기 172

[스프링] 5. Lombok

지난시간 데이터를 주고 받기 위해 DTO클래스를 생성했다. 자바는 코틀린과 달리 data키워드를 제공하지 않기 때문에 getter, setter, constructor, toString같은 메서드들을 직접 구현해야 했다. IDE레벨에서 지원하긴 하지만 멤버변수가 늘어날 때마다 직접 추가하기 불편하다. 이럴때 롬복(Lombok)을 사용하면 편리하다. DTO // dto/StudentDTO.java public class StudentDTO { int id; String name; public StudentDTO(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(i..

[C++] 시간 측정 방법

C언어에서 시간을 측정할 때 time.h헤더를 사용하거나 windows.h헤더를 사용하여 시간을 측정한 기억이 있다. time은 직관적이었지만 정밀한 측정이 힘들었고, windows.h의 QueryPerformanceCounter 함수를 이용한 측정은 꽤 정밀하지만 비직관적이었다. (리눅스에서는 사용도 못한다.) C++는 보다 정밀한 측정을 기본적으로 제공한다. #include 시간의 신 크로노스(Chronos)에서 따왔다고 한다. 핵심 기능인 시간을 측정하는 코드는 다음과 같다. std::chrono::system_clock::time_point start = std::chrono::system_clock::now(); // do Something; std::chrono::duration duratio..

[스프링] 4. Object Mapper

지난시간에 api를 만들어서 string데이터를 주고 받았다. 지난시간에도 말했듯이 오직 string만 주고 받는 일은 거의 없고 여러 데이터를 포함해서 보낸다. 예를들면 학생을 요청할때 학번, 이름, 학과등을 모아서 보내는 경우가 있다. api는 서로 다른 언어끼리도 통신할 수 있는데 서로 객체를 표현하는 방식이 다르기 객체를 직접 보낼 수 없다. 객체를 문자열(json)로 바꿔서 전송하고 그 문자열을 객체로 바꿔서 수신한다. 여기서 객체와 문자열을 바꾸는 역할을 Object Mapper가 한다. 객체 -> Object Mapper -> json -> Object Mapper -> 객체 DTO 전송될 객체를 DTO로 나타낸다. DTO는 Data Transfer Object의 약자이고 송신측과 수신측의 ..

[스프링] 3. REST API 만들기

우리는 REST API를 통해 CRUD를 구현할 수 있다. CRUD는 Create, Read, Update, Delete이고 각각 http method에서 POST, GET, PUT, DELETE에 대응된다. 리소스를 생성하는데 GET을 써서 구현해도 동작이야 하겠지만 이것 또한 개발자들간의 합의(?)같은 것이기 때문에 일치시키는게 좋다. HTTP Method 지난시간에 GetMapping을 통해 GET을 구현했다. {method}Mapping어노테이션을 사용하면 해당하는 메소드를 구현할 수 있다. // controller/ApiController.java @RestController public class ApiController { @GetMapping("/api/hello") public Strin..

[스프링] 2. 첫 api 만들기

스프링은 api 서버로 사용이 가능하다. request를 받으면 "Hello world"를 반환하는 코드를 작성해보자. Controller 스프링은 request를 Controller에서 받고 클래스를 정의해줘야 한다. Controller는 프로젝트 폴더 안에 controller라는 패키지를 만들고 Controller라는 접미사를 가진 클래스명으로 사용하는 것이 국룰인듯 하다. // controller/ApiController.java @RestController public class ApiController { @GetMapping("/api/hello") public String hello(){ return "Hello world"; } } @RestController : 이 컨트롤러는 Rest요청..

[스프링] 1. 스프링 시작하기

Prologue 지금까지 스프링 공부 시도를 3번쯤 한 것 같은데 계속 까먹어서 블로그에 글을 남기면서 공부하려고 합니다. 초보자의 입장에서 바라본 스프링을 작성한 카테고리이니 잘못된 점 지적 환영합니다. 스프링 우리나라 기업들은 자바를 상당히 많이 사용한다. 그중에서도 전자정부프레임워크와 수많은 레거시 코드들이 스프링으로 이루어져 있다. 그만큼 역사가 깊고 스프링이 견고하다는 뜻인 것 같다. 나는 지금까지 자바를 잘 몰라서 스프링 말고 다른 프레임워크(장고, fastapi, express 등)를 공부해 왔지만 스프링도 배워둬야 할 것 같아서 공부를 시작하게 되었다. 프로젝트 만들기 인텔리제이에서 프로젝트 만드는 방법은 간편하다. 1. 새 프로젝트 2. 프로젝트 설정 Spring Initializr를 선..

[C++] 난수 생성 방법

C를 먼저 공부하고 C++를 공부하는 사람이라면 난수를 생성할 때 stdlib.h(cstdlib)에 있는 rand 함수를 사용했을 것이다. rand함수를 사용하면 난수가 생성되는것 처럼 보이지만 실제로 여러번 실행해보면 같은 결과가 나온다. rand함수를 대략적으로 구성하면 다음과 같을 것이다. int myRand() { static int seed = 94263523; seed = (seed + 998244353) % (1000000007); return seed; } 여기에서 시드넘버가 일정하기 때문에 언제나 같은 수가 나올 것이고 실행해보면 난수가 생성된것 처럼 보인다. 이를 해결하기 위해 시드넘버를 현재시간 기준으로 설정하곤 한다. #include int myRand() { static int s..

[알고리즘] PBDS

지난 UCPC 2022에 PBDS가 나왔다. 몰랐던 자료구조니까 공부하긴 했는데 이게 생각보다 강력한 것 같다. C++에서 지원하는데 이게 있으면 세그트리를 안짜도 된다.(근데 짜는게 맘편하긴 하다.) 감사한 곳 https://codeforces.com/blog/entry/11080 C++ STL: Policy based data structures - Codeforces codeforces.com 일단 g++에서만 가능하다고 한다.(unfortunately only for the GNU C++) 개념적으로는 set(map)인데 순서를 기록한다고 한다. 특정 수가 몇번째로 큰지, 특정 수보다 작은 수가 몇개 있는지를 구할 수 있는 내장 자료구조이다. 사용하려면 헤더를 따로 인클루드 하고 네임스페이스도 쓰..

[알고리즘] UCPC 2022 예선 후기

건국대학교에서 만난 훌륭한 실력을 가진 팀원들과 함께 UCPC를 참가하였다. 다들 실력이 좋으셔서 5솔이라는 좋은 성적을 거두었다. 팀원 : riroan, aru0504, kth990303 Before Contest 예비소집 문제에서 최근 UCPC에서 A번이 가장 쉽다는 힌트를 주었다. 그래서 올해도 A가 가장 쉬울 것으로 예상해서 누가 A를 풀지 정해야 했는데 kth990303님이 풀겠다고 했다. 어려운 문제도 붙잡고 있는 스타일이어서 확실하게 풀 수 있는 A를 빠르게 풀고 그동안 나와 aru0504님이 다른 문제를 보기로 했다. 나는 대회에서 문제를 딱 보고 10초 안에 풀이가 떠오르지 않으면 넘기는 성격이라 모든 문제 파악하는게 더 좋았는데 잘 된것같다. 00:01 A solve! 대회 시작 후 몇..

[알고리즘] 파이썬 dict, C++ map/unordered_map

우리는 문제를 풀거나 프로그래밍을 할 때 map(unorderd_map), dict을 쓰곤 한다. 키에 무엇이든 넣을 수 있어 편리한 자료구조이지만 사용 시 조심해야 할 부분이 있는 것 같아 포스팅하게 되었다. 감사한 곳 https://codeforces.com/blog/entry/101817 Anti-hash-table test in Python - Codeforces codeforces.com 시간복잡도 기반 python dict(defaultdict) $O(1)$ 해시 C++ map $O(\log{n})$ RB Tree C++ unordered_map $O(1)$ 해시 우선 차이는 위와 같다. dict이랑 unordered_map은 같은 해시 기반이다. 위 표만 보면 $O(1)$이기 때문에 dict..