전체 글 202

클린코더스 6강 - Form

💡백명석 님의 클린 코더스 강의를 듣고 요약한 자료입니다. 목차 1, 2강 OOP 3, 4강 Function 5강 Function Structure 6강 Form Coding Standards 조직이 일정 수준의 크기가 되면 관료적인 문서화를 요구한다. 코드를 어떻게 작성할 것인지에 대한 표준을 마련하는 것은 필요하지만, 별도로 문서화하는 것은 회의적. Comments should be rare CodingStandards가 코멘트 작성을 강제하면 어떨까? 프로그래머는 필요해서가 아니라 의무적으로 코멘트를 작성하게 될 것이다. 무의미한 코멘트가 많이 생산될수록 코멘트를 읽는 사람이 줄어들 것이다. 따라서 코멘트는 특별하게, 그것이 반드시 필요한 경우에만 작성해야 한다. Comments are failur..

[오브젝트01] 객체, 설계

프로그래밍 패러다임 패러다임이란, 한 시대의 사회 전체가 공유하는 이론이나 방법, 문제 의식 등의 체계를 말한다. 프로그래밍에 패러다임이 필요한 이유는, 개발자 공동체가 동일한 프로그래밍 스타일과 모델을 공유할 수 있게 하므로 불필요한 의견 충돌을 방지하기 때문이다. 티켓 판매 애플리케이션 추첨을 통해 관객들에게 무료 초대장을 발송했다. 당첨되지 않은 관객과 당첨된 관객을 구분해서 당첨되지 않은 관객은 티켓을 구매해야만 입장할 수 있는 프로그램을 만들 것이다. 첫 번째는 초대장을 구현하는 것이다. public class Invatation{ private LocalDateTime when; //초대 일자 } 그리고 티켓 클래스 public class Ticket { private Long fee; pub..

Study/오브젝트 2021.03.30

[스프링 인 액션] #2 WebConfig로 뷰 컨트롤러 설정하기

HomeController처럼 모델 데이터나 사용자 입력을 처리하지 않고 뷰만 전달하는 컨트롤러를 뷰 컨트롤러라고 한다. 이런 경우 별도로 컨트롤러를 만들지 않더라도 WebConfig설정만으로 처리할 수 있다. @Controller public class HomeController { @GetMapping("/") public String home() { return "home"; } } 이 클래스를 아래와 같이 바꿀 수 있다. @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.add..

Study 2021.03.13

[스프링 인 액션] #2 웹 애플리케이션 개발하기

목표 MVC구조로 데이터베이스와 연결하지 않은 매우 간단한 웹 어플리케이션 개발해보기 요구사항 타코 재료를 선택해서 자신만의 타코를 만들 수 있다. 완성한 타코를 주문할 수 있다. 단계 도메인 설정 도메인이란, 애플리케이션 이해에 필요한 개념을 다루는 영역이다. 컨트롤러 작성 컨트롤러는 요청에 알맞은 작업을 처리하고 절절한 view를 반환한다. 뷰란 HTML을 말하고 타임리프 같은 템플릿을 이용하여 원하는 데이터를 넣어 줄 수 있다. 유효성 검사 클라이언트가 폼 데이터를 올바르게 작성했는지 유효성을 검사한다. 2번까지는 매우 쉬운 내용이어서 생략하고, 3번을 간단하게 정리한다. 스프링은 빈 유효성 검사(Bean Validation) API를 제공한다. 애플리케이션에 if/else를 덕지덕지 붙여 검사하지..

Study 2021.03.13

[스프링 인 액션] #1 스프링 애플리케이션 작성하기

스프링이란? 스프링은 애플리케이션 컨텍스트라는 컨테이너를 제공한다. 이것은 애플리케이션 컴포넌트(빈)를 생성하고 관리한다. 컴포넌트 또는 빈은 스프링 애플리케이션 컨텍스트 내부에서 서로 연결되어 완전한 애플리케이션을 만든다. 벽돌, 모르타르, 목재, 못, 배관, 배선이 어우러져 집을 구성하는 것과 비슷하다. 빈의 상호 연결은 의존성 주입(Dependency Injection, DI)이라고 알려진 패턴을 기반으로 수행된다. 애플리케이션 컴포넌트에서 의존(사용)하는 다른 빈의 생성과 관리를 자체적으로 하는 대신 별도의 컨테이너가 한다. 이 컨테이너는 모든 컴포넌트를 생성하고 관리하고 그 컴포넌트를 필요로 하는 컴포넌트에게 주입(연결)한다. 애플리케이션 부트스트랩 Springboot는 JAR파일에서 애플리케이..

Study 2021.03.12

프로세스 스케쥴링 #2 멀티 프로그래밍

프로세스 스케쥴링 멀티 프로그래밍 멀티 프로그래밍의 목적 최대한 CPU를 많이 활용하도록 하는 시스템 시간 대비 CPU활용도를 높이자 애플리케이션을 짧은 시간 안에 실행 완료한다 멀티 프로그래밍 애플리케이션이 온전히 CPU를 쓰기보다 다른 작업을 중간에 필요로 하는 경우가 있다. 단순한 예를 들자면, 애플리케이션이 실행되다가 파일(저장 매체)을 읽는다거나 프린팅을 해야 한다고 했을 때 그동안 아무 일도 할 수 없도록 설계되어 있다면? 만약 어떤 애플리케이션을 실행하는데 걸리는 시간이 10초라고 해보자. 이 애플리케이션은 A와 B라는 작업을 하는데, 각각 3초씩 걸린다. 그런데 A를 실행할 때 파일을 읽는 작업이 추가로 실행되는데 그 시간이 4초다. 이 애플리케이션이 CPU를 점유하는 시간은 총 10초지만..

Study/운영체제 2021.03.10

#1 생성자 대신 정적 팩터리 메서드를 고려하라

Item #1 생성자 대신 정적 팩터리 메서드(static factory method)를 고려하라. 1. 이름을 가질 수 있다 생성자만으로 객체의 특성을 설명할 수 없다. 이름을 지을 수 있다면 객체의 특성을 좀 더 구체적으로 묘사할 수 있다. BigInteger(int, int, Random) 보다 BigInteger.probablePrime 이 더 좋은 이름이다. 2.호출될 때마다 인스턴스를 생성하지 않아도 된다 불변 클래스는 인스턴스를 미리 만들어 두거나 새로 생성한 인스턴스를 캐싱하여 재활용하는 식으로 불필요한 객체 생성을 피할 수 있다. 생성 비용이 큰 객체라면 성능을 끌어올릴 수 있다. 반복되는 요청에 같은 인스턴스를 반환하는 식으로 정적 팩터리 방식은 언제 어느 인스턴스를 살아있게 할 것인지..

클린코더스 5강 Function Structure #1

💡백명석 님의 클린 코더스 강의를 듣고 요약한 자료입니다. 목차 1, 2강 OOP 3, 4강 Function 5강 Function Structure 6강 Form Arguments 몇 개의 인자를 받을 것인가? 인자가 많아지면 함수의 복잡도가 증가한다. 인자의 개수는 많지 않은 것이 좋다. 3개를 넘지 않는 것을 권장한다. 특히 생성자에 인자가 많으면 실수할 확률이 매우 높아진다. 차라리 Java Bean의 setter를 방식으로 객체를 초기화하는 게 낫다. 하지만 setter로 객체를 초기화하는 동안 그 객체는 매우 불안정한 상태라는 단점이 있다. setter보다 Builder패턴이 더 나은 선택일 수 있다. Builder패턴에서 Builder를 생성할 때 필수 인자를 받고 나머지는 빌더로 채울 수 있..

초간단 Spring Scheduler 적용

Spring Scheduler는 Quartz라이브러리에 비해 사용하기가 매우 쉽습니다. 따로 의존성을 추가할 필요도 없습니다. 3분이면 적용해볼 수 있습니다. Springboot프로젝트 JDK1.8 이상 SchedulerTask @Slf4j @Component public class SchedulerTask { //1초마다 반복 @Scheduled(cron = "0/1 * * * * ?") //@Scheduled(fixedRate = 1000) public void schdulerTest() { log.info("NOW : {} ", LocalDateTime.now()); } } DemoApplication @EnableScheduling //Scheduling 활성화 @SpringBootApplicat..

Spring 2021.03.02

클린코더스 2강 - Function

💡백명석 님의 클린 코더스 강의를 듣고 요약한 자료입니다. 목차 1, 2강 OOP 3, 4강 Function 5강 Function Structure 6강 Form Function 함수는 한 가지 일만 해야 한다. 한 가지 일만 하는 함수를 만들기 위해서는 indentation, while, mested, if등이 없어야 한다. 잘 지어진 서술적인 긴 이름을 갖는 많은/작은 함수들로 유지해야 한다. The First Rule of Functions 함수는 더 이상 작을 수 없을 만큼 작아야 한다. 따라서 큰 함수를 보면 클래스로 추출할 생각을 해야 한다. 블록이 적어야 한다.--> 이 말은 블록 안의 또다른 블록은 계속 함수로 추출해야 한다는 뜻. if-else, while등 내부 블록은 한 줄이어야 한다..

클린 코더스 1, 2강 - OOP

💡백명석 님의 클린 코더스 강의를 듣고 요약한 자료입니다. 목차 1, 2강 OOP 3, 4강 Function 5강 Function Structure 6강 Form Why Clean Code 소프트웨어는 한 번 작성되면 최소 10번 이상 읽힌다고 한다. 내가 작성한 코드도 2주만 지나면 까먹기가 일쑤다. 실제 업무에서는 내 코드를 나만 보는 것도 아니다. 내가 아닌 누군가가 내 코드를 읽어야 할 수도 있다. 그래서 '돌아만 가는 코드' 말고 '읽기 쉬운 코드'를 작성해야 한다. 절차지향과 객체지향 절차지향은 프로시저가 같은 데이터에 의존하고, 프로시저가 프로시저를 의존하는 형태다. 이런 구조이기 처음엔 쉽게 만들 수 있지만 시간이 지날수록 수정이 어렵다. 그렇다면 객체지향적인 ..

객체지향 프로그래밍이란?

객체지향 프로그래밍이란 무엇인가? 서론 객체는 현실 세계로 비유하자면 우리가 보고 느끼고 듣는 것 모든 것이 객체가 될 수 있습니다. 지금 이 글을 쓰고 있는 키보드도 하나의 객체로 볼 수 있습니다. 더 섬세하게 들어가서, 키보드를 감싸고 있는 키캡 하나하나가 모두 객체라고 할 수도 있습니다. 여기서 객체를 지향한다는 것이 무엇인지 힌트를 얻을 수 있습니다. 키캡 하나도 객체가 될 수 있다고 했습니다. 그런데 만약 내가 '키보드'라는 단어를 입력하고 싶은데 'ㅣ'를 가리키는 단 하나의 키캡만 존재한다면 어떨까요? 'ㅣ'은 키보드라는 글자를 완성하는데 필요한 요소지만, 그 자체만으로는 아무 의미가 없습니다. 'ㅋ', 'ㅂ', '..

Study 2021.02.27

CI/CD란?

CI/CD란? CI/CD는 프로젝트 빌드 - 테스트 - 병합 - 배포까지의 전 과정을 말한다. 많은 경우, CI/CD라고 하면 자동화를 포함한 뜻으로 사용한다. CI (Continuous Integration) CI는 지속적인 통합을 말한다. 변경하거나 추가한 소스 코드를 기존의 프로젝트와 통합하여 빌드하고 테스트하는 과정이 지속적인 통합이다. git과 Travis CI/Jenkins같은 툴을 연동하여 CI를 자동화할 수 있다. CI를 자동화했을 때 얻는 이점은 크게 세 가지인 것 같다. 새로운 소스코드가 기존 코드와 충돌을 일으키는지 검증할 수 있기 때문에 신속한 문제 해결 가능. 테스트와 빌드를 자동화함으로써 기계적인 반복을 줄이고 빠른 검증이 가능. 이 과정을 통해 완전한 배포 파일을 만들 수 있다..

infra 2021.02.22

왜 main()는 public static void인가?

왜 main()는 public static void인가? 자바에서 main()는 뭘까? 너무나 당연하게 그 자리에 있어서 이것이 특별한 메서드라는 생각조차 하지 않게 된다. main()는 자바 프로그램의 시작점이다. main()은 다른 메서드와 다르게 그 자리에서 실행해볼 수 있다. 좋다. 그런데 어떻게 이런 일이 가능해지는 걸까? 이름 빼고 선언부가 완전히 같은 다른 메서드를 정의해도 그것을 main()를 거치지 않고 실행하기란 불가능하다. 왜 public인가? 우리는 IDE의 Java Application Run으로 프로그램을 실행하는데 익숙하다. 이는 프로그램을 실행하는 주체가 main()이라고 착각하게 만든다. 하지만 잘 알다시피 프로그램을 실행하는 것은 main()이 아니라 JVM이다. 우리는 ..

Java 2021.02.09

프로세스 스케쥴링

프로세스 스케쥴링 배치 처리 시스템, 시분할 시스템, 멀티 태스킹 배치 처리 시스템 배치 처리 시스템은 순차적으로 애플리케이션을 실행하는 방법이다. 이 방식은 큐 Queue와 비슷하다. 배치 처리 역시 큐와 같이 먼저 등록한 애플리케이션을 먼저 실행하는 FIFO(First In First Out) 구조다. 장점 배치 처리 시스템은 여러 프로그램을 순차적으로 실행시키기 위한 요구사항을 달성하기 위해 만들어졌다. 실행해야 하는 프로그램을 등록해두면 배치 처리 시스템이 순차적으로 실행하기 때문에 매번 직접 프로그램을 실행하지 않아도 된다는 장점이 있다. 단점 애플리케이션을 순차적으로 실행한다. 애플리케이션B의 실행 시간이 1분이어도 12시간짜리 애플리케이션 뒤에 등록하면 실행하는데 12시간 1분 뒤에나 결과를..

Study/운영체제 2021.02.09

유저 모드와 커널 모드

운영체제 구조 사용자 모드와 커널 모드 CPU Protection Rings CPU도 권한 모드를 가지고 있다. 사용자 모드 (User mode) 응용 프로그램이 사용하는 모드. 커널 모드(kernel mode) 특권 명령어 실행과 원하는 작업을 수행하기 위한 자원에 접근 즉, OS가 제공하는 기능을 사용할 수 있게 해주는 권한 모드 커널(kernel)이란? OS 본연의 기능. 운영체제의 핵심 소프트웨어를 커널이라고 한다. 시스템 콜은 커널 모드로 실행 커널 모드에서만 실행 가능한 기능이 있음 커널 모드로 실행하려면 반드시 시스템콜을 거쳐야 한다. 시스템콜은 운영체제가 제공한다. 응용 프로그램이 운영체제의 기능을 사용하려면, 반드시 시스템 콜을 거쳐 커널 모드로 접근해야 한다. 응용 프로그램은 사용자 모..

Study/운영체제 2021.02.08

[Java]Exception

Exception Exception과 RuntimeException 일반 예외와 런타임 예외를 구분하는 데서 시작해야겠다. Exception 반드시 처리해야 하는 예외. 그래서 체크 예외라고 불린다. 이 예외는 처리하지 않으면 컴파일할 수 없어서 컴파일 예외라고도 부른다. 이를 테면 ClassNotFoundException이나 IOException같은 것들이 체크 예외에 속한다. RuntimeException RuntimeException은 Exception을 상속받는 예외 클래스다. 프로그램 실행 중에 발생하는 에러를 런타임 예외라고 부르며 반드시 처리할 필요는 없다. 따라서 언체크 예외라고 부른다. 런타임 예외로는 흔히 볼 수 있는 NullPointerException이 있다. 컴파일하는 데에는 아무..

Java 2021.02.07

운영체제2 - 시스템 콜

응용 프로그램을 도서관에 비유 운영체제를 도서관에 빗대어 볼 수 있다. 운영체제 == 도서관 응용 프로그램 == 시민 하드웨어 == 책 시민은 도서관에 책을 요청하고, 도서관은 요청 받은 책을 대여한다. 시민은 책을 다 읽고 나면 도서관에 책을 반납한다. 이것을 운영체제로 치환하면 이렇다. 응용 프로그램은 운영체제에 필요한 하드웨어 자원을 요청한다. 운영체제는 요청 받은 하드웨어 자원을 응용프로그램에게 할당한다. 응용 프로그램은 할당 받은 자원으로 작업하고, 작업을 종료하면 다시 운영체제에게 하드웨어 자원을 반납한다. 응용 프로그램, 운영체제, 하드웨어의 관계 운영체제는 응용 프로그램이 요청하는 메모리를 허가/분배한다. 운영체제는 응용 프로그램이 요청하는 CPU시간을 제공한다. 운영체제는 응용 프로그래밍..

Study/운영체제 2021.02.07

Springboot + JPA + Querydsl로 좋아요 기능 만들기 1 - 등록

Springboot + JPA + Querydsl로 좋아요 기능 만들기 1 - 등록 개인 프로젝트에 좋아요 기능을 추가했다. Springboot2.3.1, SpringDataJPA, Querydsl을 사용하여 구현했다. 테스트는 JUnit5로 진행했다. 코드는 전체 코드는 github에서 확인할 수 있다. 화면 처리나 환경설정은 이 글에서 다루지 않는다. 내가 생각한 요구사항은 다음과 같다. 사용자는 게시물에 좋아요를 누를 수 있다. 사용자는 자신의 좋아요를 취소할 수 있다. 사용자는 자신이 좋아요를 누른 게시물을 조회할 수 있다. 사용자는 게시물 당 한 번만 좋아요를 누를 수 있다. 사용자는 전체 게시물을 조회할 때 좋아요 카운트를 확인할 수 있다. 우선 구현을 위해 세 개의 엔티티(테이블)가 필요하다..

Spring 2021.02.07

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000eaaa0000, 178978816, 0) failed; error='Not enough space' (errno=12)

문제 EC2(Amazon Linux2 AMI)서버에서 springboot gradle프로젝트를 ./gradlew test로 테스트하려고 하니 메모리가 충분하지 않다는 에러가 발생헀다. * What went wrong: Unable to start the daemon process. This problem might be caused by incorrect configuration of the daemon. For example, an unrecognized jvm option is used. Please refer to the User Manual chapter on the daemon at https://docs.gradle.org/6.7/userguide/gradle_daemon.html Proces..

ERROR!!!!!!! 2021.01.29

[Gradle Build Error]java.lang.ClassNotFoundException: org.gradle.wrapper.GradleWrapperMain

문제 EC2서버에서 springboot-gradle프로젝트를 다운 받고 테스트를 돌리려고 하면 실패했다 $ ./gradlew test 오류: 기본 클래스 org.gradle.wrapper.GradleWrapperMain을(를) 찾거나 로드할 수 없습니다. 원인: java.lang.ClassNotFoundException: org.gradle.wrapper.GradleWrapperMain이런 에러가 나타났다. 처음에 편법으로 해결한 방법은 Gradle을 설치해서 직접 gradle wrap으로 빌드했다. 하지만 이건 프로젝트가 업데이트되어 Pull해오면 다시 직접 gradle wrap으로 빌드를 해줘야 하는 편법이었다. 그리고 좀 이상했다. gradlew를 쓰는 이유가 gradle설치 없이도 gradle프로..

ERROR!!!!!!! 2021.01.29

Amazon Linux 2 AMI Java 버전 변경

현재 버전 확인 $ java -version openjdk version "1.8.0_272" OpenJDK Runtime Environment (build 1.8.0_272-b10) OpenJDK 64-Bit Server VM (build 25.272-b10, mixed mode)버전 변경 $ sudo /usr/sbin/alternatives --config java 3 개의 프로그램이 'java'를 제공합니다. 선택 명령 ----------------------------------------------- *+ 1 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.amzn2.0.1.x86_64/jre/b..

infra 2021.01.29

[Security] 현재 로그인한 사용자 정보 가져오기

문제 회원가입 시 인증 메일을 전송하고, 인증 키를 데이터베이스에 보관한다. 인증 API는 URL은 /member/auth/{key}다. {key}와 회원 DB에 저장된 key를 비교하는 절차를 거쳐야 한다. 회원이 인증 API에 요청했을 때 서버는 어떤 회원의 요청인지 알아야 한다. 알아본 방법은 총 세 가지다. 첫 번째 방법 Principal 보다시피 java.security가 제공하는 Pincipal은 로그인한 회원의 아이디(getName())정도만 받아올 수 있다. 회원 아이디로 데이터베이스에서 회원 정보를 불러와서 회원이 가진 인증 키를 사용할 수 있다. 제법 쓸만해 보이지만 한 번 더 셀렉트 해야 한다는 단점을 가지고 있다. 두 번째 방법 @AuthenticationPrincipal 이 애노테..

Spring 2021.01.23

[JPA] 연관관계를 가진 엔티티 save 하기

연관관계를 가진 엔티티 save 하기 insert하려는 테이블이 여러 테이블과 연관관계를 가지고 있을 때 어떻게 해야 할까? Recipe를 추가할 때, 재료는 Ingredient에, 요리 과정은 CookingMethod 테이블에 보관해야 한다. 유형이나 분류는 이미 정해져있는 것을 가져다 사용하면 되므로 제외했다. 프로세스를 짜보자. 사용자 입장에서. 등록하려는 레시피가 어떤 유형인지 선택한다. 등록하려는 레시피가 어떤 분류인지 선택한다. 요리 이름 완성된 요리 썸네일 삽입 간략한 설명 재료를 입력.(여러 개) 요리 과정 입력.(여러 개) 요리 과정 이미지 삽입(여러 개) 이렇게 입력하고 등록했을 때 서버에서 일어나는 일은 입력 받은 데이터를 분류한다. Ingredient를 등록한다. CookingMet..

JPA 2021.01.16

[JPA] @EntityGraph를 OnetoMany에 적용 시 페이징 처리 안 되는 이슈

문제 @Entity public class Recipe { ... @OneToMany(mappedBy = "recipe", cascade = CascadeType.ALL, fetch = FetchType.LAZY) Set ingredients = new HashSet(); @OneToMany(mappedBy = "recipe", cascade = CascadeType.ALL, fetch = FetchType.LAZY) @OrderBy("sequence ASC") Set cookingMethods = new HashSet(); @ManyToOne(fetch = FetchType.LAZY) private FoodNation foodNation; //한중일양식 @ManyToOne(fetch = FetchTyp..

JPA 2021.01.14

8주차 - 인터페이스

목표 자바의 인터페이스에 대해 학습하세요. 인터페이스 정의하는 방법 public interface Service { //final static 변수 //default 메소드 //public static 메소드 public abstract void show(); } 인터페이스는 상수(final static), 추상 메소드, default메소드, public static메소드 이 네 가지만 가지고 있을 수 있다. 자바9부터는 private메소드도 선언할 수 있게 되었다. 인터페이스에 선언된 모든 변수는 상수, default, static, private이 붙지 않은 메소드는 추상 메소드다. 따라서 final static이나 public abstract키워드는 생략 가능하다. 컴파일러가 자동으로 붙여준다. 인..

Java 2021.01.08

7주차 - package, import, classpath, 접근 제어자(access modifier)

목표 자바의 패키지에 대해 학습하세요. 학습할 것 (필수) package 키워드 import 키워드 클래스패스 CLASSPATH 환경변수 classpath 옵션 접근지시자 Package 패키지는 관련된 파일을 넣어둔 폴더와 비슷하다. 패키지란 관련된 클래스들을 묶어서 그룹화 해놓은 것을 하나의 패키지라고 한다. 폴더 안에서 또 관심사를 나누는 폴더가 있을 수 있는 것처럼, 패키지 안에 패키지가 존재할 수 있다. 이를 통해 큰 틀로 묶고, 점점 세분화 하는 방식으로 패키지를 나눌 수 있다. 패키지 안의 패키지는 마침표(.)로 구분한다. java.lang.String str; 패키지는 제공하는 것을 사용해도 되고 새롭게 정의해서 사용해도 된다. 패키지명은 소문자로 만들어서 클래스 이름과 구분할 수 있도록 하..

Java 2021.01.02

삽입 정렬(Insertion sort)

삽입 정렬(Insertion sort) 삽입 정렬은 원소가 있어야 하는 자리에 '삽입'한다고 하여 삽입 정렬이다. 5, 7, 2, 4 ,6 이라는 원소가 있고, 여기서 세 번째 원소인 2를 선택했다고 하자. 오름차순 정렬이라면 2는 맨 첫 번째에 위치해야 한다. 방법은 간단하다. 2보다 앞에 위치한 원소를 하나씩 비교하며 앞의 원소보다 2가 더 작다면 한 칸씩 앞으로 보내면 된다. 앞에서 공부한 버블, 선택 정렬과 마찬가지로 두 번째 원소부터 비교를 시작한다. 이전 원소들을 비교해나가기 때문에 첫 번째 원소부터 시작하지 않아도 된다. 버블 정렬, 선택 정렬과 같이 제자리 정렬(in-place) 알고리즘이다. 또한 버블, 선택 정렬에 비해 속도가 빠르다. 배열이 길어질수록 효율이 떨어진다는 ..

알고리즘 2020.12.31

2020년에 마신 커피들

12월 31일이다. 지구 종말 영화의 포스터 같은 풍경이 뉴노멀이라는 괴상한 말과 함께 일상으로 쳐들어왔다. 마스크를 끼지 않은 인간을 째려보기 시작했다. 마스크를 쓰지 않는 것은 범죄가 되었으며 거기에 저항하는 인간들은 뉴스에 나온다. 마스크가 처음엔 답답해 죽을 것 같더니 이제는 그럭저럭 쓰고 다닐만 하다. 나도 이제 뉴노멀에 적응한 뉴제너레이션의 일원이 된 걸까? 올해 가장 끔찍한 일은 역시 만원 지하철에서 사레들린 일이다. 기침할 수도, 하지 않을 수도 없는 상황이었다. 덕분에 침을 매우 조심해서 삼키는 인간이 되었다. 농담은 그만하고. 국비 학원 작년 이맘 때는 생활코딩에 푹 빠져있었다. 기억에 남는 문단을 공유하고 싶다. "웹페이지를 예쁘게 하기 위해서 HTML을 사용하지 않고 웹페이지 전체를..

메모 2020.12.31