회고록3
들어가며 드디어 6개월 간의 회사 생활이 끝이 났다. 길다면 길고, 짧다면 짧진 않고 그냥 길었다. 빠듯한 일정 탓에 마지막 날까지도 API들을 만들어냈고, 덕분에(?) 아직 실감이 나지 않는다. 회사생황을 이어서 하는 선택지도 있었지만 더 좋은 회사에 가기 위해 백수가 되는 길을 선택했다. 동아리 같은 대외활동 없이 나혼자 공부하고, 취업준비...
들어가며 드디어 6개월 간의 회사 생활이 끝이 났다. 길다면 길고, 짧다면 짧진 않고 그냥 길었다. 빠듯한 일정 탓에 마지막 날까지도 API들을 만들어냈고, 덕분에(?) 아직 실감이 나지 않는다. 회사생황을 이어서 하는 선택지도 있었지만 더 좋은 회사에 가기 위해 백수가 되는 길을 선택했다. 동아리 같은 대외활동 없이 나혼자 공부하고, 취업준비...
들어가며 회사에서 레거시 코드를 유지보수하면서, 잘 정리되지 않은 코드와 시간에 쫒기는 코드로 인해 프로젝트를 이해하고 제대로 버그를 고쳐나갈 수 있기까지 꼬박 한달이 걸렸다. 이 경험으로 인해, 나는 남들이 읽기 쉬운 코드를 어떻게 짤 수 있을지 고민하고 확립되지 않은 컨벤션도 세워보려는 시도를 하였다. 또 좋은 코드를 잘 작성하기 위해 유명한...
들어가며 1. 주요 개념 정리 2. 시나리오 설계 및 가정 TaskScheduler를 짚어보고, 왜 도입해야 하는지를 정리해보았다. 이번 포스팅에서는 실제로 TaskScheduler를 적용하면서 어떤 점들을 고려했고, 어떤 기술을 적용했는지 알아보겠다. 대기 중인 쓰레드 @Scheduled와 마찬가지로 예약 시간을 체크하는 쓰레드가 대기...
들어가며 1. 주요 개념 정리 3. TaskScheduler 도입 이전 글에서 @Scheduled와 TaskScheduler의 개념 및 사용예시를 살펴보았다. 개념들을 이해했다면 @Scheduled는 복잡한 스케줄 작업을 하는 데에 한계가 있다는 것을 알아차렸을 것이다. 이 포스팅에서는 @Scheduled사용을 지양하게 된 시나리오를 보며 T...
들어가며 2. 시나리오 설계 및 가정 3. TaskScheduler 도입 특정 시간에 알림을 발송하는 작업을 위해 @Scheduled가 아닌 TaskScheduler를 사용하여 단일 인스턴스의 자원 사용량을 줄여보았다. 다음과 같은 순서로 나눠서 포스팅을 하려 한다. @Scheduled와 TaskScheduler 개념 및 주요 기능 ...
서론 스프링의 @Transational 은 AOP 기술을 활용하여 개발자가 별도의 DB 커넥션 설정, 롤백 처리 등의 로직을 신경쓰지 않아도 알아서 자동으로 처리해준다. 하지만 편리함에 익숙해지고 아무렇게나 사용하다 보면 다양한 오류 상황을 겪을 수 있다. 이 글에서는 @Transational 작동 방식을 짧게 짚어보고, 트랜잭션 범위가 얼마나 ...
프리코스 지원 7기 우테코 프리코스에 지원했다 2년 전부터 눈여겨 보고는 있었는데, 바쁘다는 핑계(왜 바쁠때만 하세요?)로 미루다가 더이상 미룰 수 없는 4학년에 도전하게 되었다 하지만 회사를 다녀서 결국 더 바쁜 시기에 우테코 프리코스를 하게 되었다. 1달 동안 정말 지옥이었다… 지원 이유 우테코가 매력적으로 보였던 이유는 학원...
PHP: Hypertext Preprocessor 위의 이름은 현재 PHP의 약자를 나타낸다. 기존 약자는 Personal Home Page Tools 이었고, 이름 그대로 개인 홈페이지를 만들기 위한 툴이였지만, 점차 발전함에 따라 대표적인 서버 사이드 스크립트 언어가 되었다. 언어의 사용 순위를 매겨주는 사이트를 보면 점유율이...
Tomcat 이란? 아파치 소프트웨어 재단에서 개발하는 Java 기반의 서블릿 컨테이너이자 웹 애플리케이션 서버이다. Java Enterprise Edition 표준의 일부만을 지원하기 때문에 완전한 웹 애플리케이션 서버(WAS)는 아니지만, 편의상 WAS로 분류한다. 톰캣은 내장되어 있는 웹서버를 이용해 독립적으로도 사용될 수 있고...
개요 스프링 이전의 기술들을 살펴보면 EJB에 대한 이야기가 많이 나온다. 김영한 선생님 마저 눈을 감고 계시는 악명 높은 EJB가 뭔지 궁금했다. 이번 기회를 통해 알아보자. EJB의 역할 지난 포스팅(JSP와 서블릿이 무엇일까?)에서 MVC 패턴 중 서블릿은 Controller를, JSP는 View를 맡았다고...
웹 서버 프로그램 서블릿(Servlet)과 JSP를 다루기 전에 먼저 웹 서버 프로그램이 생겨난 배경부터 짚어보겠다. 인터넷을 통해 정보를 공유하고자 하는 요구가 증가하면서 웹페이지를 각 클라이언트가 들고 있고 수시로 업데이트하는 것은 비효율적이었다. 때문에 중앙에서 웹페이지와 콘텐츠를 관리하고, 클라이언트가 필요할 때 요청하여 최신...
서론 JPA를 사용한다면 반드시 알아야 하는 Optional에 대해 공부하면서 표현식과 문장의 차이가 뭔지 잘 안와닿아서 그냥 넘어갔었다. DB로부터 조회된 값이 있을 경우 에러를 발생시키기 위해 평소 자주 쓰던 orElseThrow() 를 쓰듯이 ifPresent()를 쓰고자 했는데, 여기서 의문이 생겼다. 람다식에서 오류 발생시키는 구...
전략 패턴(Strategy Pattern)이란? 실행(런타임) 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바꾸는 행위(행동) 디자인 패턴 전략을 사용할 Context에서 interface에 의존함으로써 전략을 쉽게 바꿔 낄 수 있다. 사용 예시 // 추상화된 전략 interface Strategy { vo...
서론 이전 글에서 객체의 필드값에 랜덤으로 값을 할당했었는데 실제로 테스트 해보니 랜덤이 아니었던 문제가 있었다. 이는 sampleList() 사용할 때 발생하였으며, 원인을 정확히 파악하지는 못했지만 라이브러리를 뜯어보며 나름의 가설을 세워보았다. 이전 글에 추가하려 했으나 점점 길어져서 따로 작성하게 되었다. 라이브...
Fixture, Dummy Data, Mock, Monkey Testing 라이브러리를 소개하기 전에 Fixture와 자주 쓰이는 테스트 용어, Monkey라는 이름은 어디서 유래한건지 알아보자. [Fixture] 테스트를 위해 미리 준비된 상태나 데이터 테스트에서 검증할 핵심 데이터를 제공하며, 테스트 성공 여부를 결정하는...
TDD는 무엇인가? TLD를 논하기 전에 TDD가 무엇인지 간단하게 살펴보자. Test-Driven Development는 RED - 테스트를 먼저 작성한 뒤 GREEN - 테스트를 통과하는 최소한의 코드를 작성하고 REFACTOR - 작성한 로직을 개선하는 방법론이다. 기존...
로깅이란? 애플리케이션이 실행되는 동안 발생하는 다양한 이벤트, 에러, 경고 및 기타 정보를 기록하여 디버깅, 성능 모니터링, 문제 분석 등에 도움을 주는 기능이다. 로깅에 대한 개념은 많이 나와있으므로 다루지 않겠다. Slf4j Simple Logging Facade for Java 자바 애플리케이션에서 여러 로깅 구현체...
Database 백업 10일동안 진행했던 해커톤 포텐데이 의 프로젝트 문덕을 디벨롭하면서, 애플 앱스토어를 통해 실제로 유저들에게 서비스를 제공하기로 했다. 100% 완벽한 안정성을 가진 서비스는 없으므로, 백업과 복구할 수 있는 수단을 미리 준비해야 한다. 가장 편하고 간단한 방법은 클라우드 서비스의 RDS 서비스를 이용하는 것이다. ...
파사드 패턴 도입 이유 기존의 프로젝트 구조는 하나의 서비스에서 다른 여러 개의 서비스를 의존하는 구조였다. 이는 의존하는 서비스의 변경으로 어떤 파급 효과가 일어날지 알기 힘든 구조가 되었다. 따라서 Controller 계층과 Service 계층 사이에 여러 개의 서비스를 사용하는 Facade 계층을 추가하는 파사드 패턴을 도입하였다. ...
공유페이지 제공 기존에 진행 중인 사이드 프로젝트 문덕은 문화생활에 대한 리뷰를 작성하고 보관할 수 있는 서비스다. 커뮤니티 기능 없기 때문에 자신만 자기가 쓴 글을 볼 수 있었다. 공유를 원하는 사용자를 위해 우리는 공유페이지를 제공하기로 했다. 이 글에서는 임시방편으로 만들었던 공유페이지에서 완성도를 끌어올리기 위해 어떻게 로직을 ...
서론 컨퍼런스를 좀 다니면서 개발자로써의 인사이트를 얻어야겠다고 생각하여 GDG에 참여하게 되었다. GDG가 무엇인지, 들은 세션에 대해 짧은 정리와 느낀점을 적어보겠다. 어떤 행사인가 GDG I/O Extended 는 Google Developer Groups 에서 주최하였다. Google I/O의 주요 발표 내용을 공유하고...
JWT, RTR에 대한 개념이 부족하다면 이 글을 보고 오기 바란다. Refresh Token Rotation 다중 토큰을 사용하는 JWT에서 Refresh Token(RT)의 탈취 위험을 줄이고자 도입하는 기술이다. 하나의 RT만 계속 사용한다면 공격자는 회원의 신분(Access Token)으로 계속 서비스를 이용할 수 있게 된다....
Redis란 REmote DIctionary Server 의 약자다. Key - Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈소스 기반의 NoSQL DBMS 데이터베이스 뿐만 아니라 캐시, 메세지 브로커로도 사용되며 인메모리 데이터 구조를 가진 저장소다. 빠른 속도, 편리한 기능으로 Key-Val...
이 글을 또 쓰게 된 계기 처음 회고록을 시작한지 4개월도 안지났다. 시간 진짜 안지나가는 것 같다. 이렇게 자주 쓸 생각은 아니었는데 어쩌다보니 또 쓰자고 마음먹게 되었다. 이유는 단순하다. 해이해졌다고 생각이 들었기 때문이다. 사실 지난 회고록을 쓴 이후 나름의 선방을 하긴 했다. 학점도 미쳐버린 폼으로 역대 최고치를 찍었고, 회사 인턴 생...
Record란? 자바 14버전에 처음 등장하여 16버전에서 정식 스펙이 되었다. 데이터 전송 객체(DTO)나 값 객체(VO) 같은 불변 데이터를 간단하고 명확하게 정의할 수 있게 해준다. Record의 등장 배경 기존 클래스 사용에 있어서 반복적이고 귀찮은 코드인 보일러 플레이트 코드를 줄이기 위해 도입되었다. [보일러 플...
빌더 패턴(Builder Pattern) 빌더 패턴은 복잡한 객체를 단계별로 생성할 수 있도록 하는 생성 패턴(Cretional Pattern)이다. 객체의 생성 과정을 유연하게 만들어줘 다양한 표현으로 객체를 생성할 수 있게 해준다. 즉, 객체의 생성 과정을 가독성이 좋은 형태로 만들어준다. 객체의 생성 책임을 분리하는 팩토리 ...
옵저버 패턴(Observer Pattern) 스타크래프트의 옵저버 유닛처럼 관찰자를 뜻하는 패턴이다. 옵저버(관찰자)들이 관찰하고 있는 옵저버블(대상자)의 상태가 변화가 있을 때마다 대상자는 자신의 목록에 있는 관찰자들에게 통지하고, 알림을 받은 관찰자들은 그에 따른 작업을 수행하는 행동 패턴이다. 객체들 사이의 일대다 의존성을 정의...
팩토리 패턴(Factory Pattern) 팩토리 패턴은 객체 생성 로직을 별도의 클래스나 메서드로 분리하는 패턴이다. 객체 생성 로직을 숨기고, 로직의 변경이 클라이언트에 영향을 주지 않아 코드를 유연하고 확장 가능하게 한다. 팩토리 패턴에는 크게 3가지로, 단순 팩토리 패턴, 팩토리 메서드 패턴, 추상 팩토리 패턴이 있다. 단순...
싱글톤 패턴이란 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. [여러 개의 웹 요청이 들어올 때] 만약 싱글톤 패턴을 사용하지 않는다면, 한 번에 여러 개의 요청이 들어올 때마다 해당 요청을 처리하기 위한 객체들이 여러 개 생성될 것이다. 모든 요청에 대해 각각 객체가 생성되고 소...
CI/CD 구축 CI/CD의 새로운 패러다임 - Github Actions 지난 포스팅에서 다루었던 GitHub Actions 개념들을 바탕으로 스프링 프로젝트를 도커 허브에 올리고(CI), Naver Cloud Platform의 서버 인스턴스에서 배포하는 과정(CD)를 구축해보겠다. 아키텍쳐로 나타내면 아래 그림과 같다. wor...
CI/CD Continous Integration(지속적 통합)과 Continuous Delivery/Deploy(지속적 배포) 소프트웨어 개발에서 지속적으로 수행해야하는 반복 작업 개발 주기를 단축하고 코드 품질을 높인다. 기존 CI/CD 툴들의 문제점 github action 등장 전에는 Jenkins, Circle CI,...
다익스트라의 한계 다익스트라(Dijkstra) 알고리즘 벨만 포드(Bellman-Ford) 알고리즘 이전 포스팅에서 다익스트라는 음수 가중치를 고려할 수 없다는 한계를 극복하기 위해 벨만 포드 알고리즘을 다뤘었다. 이외에 또다른 한계를 알아보자. 다익스트라는 하나의 점에서 모든 지점까지의 최단 경로를 구하는 알고리즘이다. 모...
다익스트라의 한계 다익스트라(dijkstra) 알고리즘 위 그림에서 다익스트라는 각 노드에 한번만 방문하고, 바로 앞에 있는 간선 중에서 가장 짧은 것을 선택한다. 그 결과 1->3 경로의 거리는 음수 가중치를 인식하지 못해 5가 아닌 10이라는 결과가 도출된다. 이렇게 다익스트라는 음수 가중치를 가진 간선이 있다면 사용할 수...
이 포스팅은 Cookie, Session, Token을 안다는 가정 하에 진행됩니다. 대부분의 사용자 인증/인가 작업에 JWT를 알아보고 탈취 위험과 이를 방지하기 위한 기법까지 알아보겠습니다. JWT(Json Web Tokens) 서버에서 상태를 저장하는 Session 방식의 몇가지 한계를 극복하기 위해 stateless 방식으로...
각 기술의 등장 순서 Cookie - Session - Token - JWT(JSON Web Token) 이 포스팅에서는 Cookie, Session, Token의 등장 배경을 통해 각 기술이 무엇인지 알아보겠다. JWT에 대해서는 짧게만 언급하고 추후에 탈취 위험, 탈취에 대한 대응책까지 자세하게 다루겠습니다. Cookie ...
이 포스팅에서는 스프링을 사용하여 사용자의 인증 여부를 확인하기 위해 보통 Spring Security를 사용합니다. 하지만 이 프레임워크는 거대하기 때문에 처음부터 이해하기는 힘듭니다. 이 포스팅에서는 비슷한 동작 방식을 가진 스프링 인터셉터를 통해 사용자의 인증 여부를 확인하는 간단한 예제를 알아보겠습니다. 등장하는 ...
🙃 B+ 트리 (B+ Tree) 기존의 B-Tree와 데이터의 연결리스트로 구현된 색인구조다. b-tree 와의 가장 큰 차이점은 리프노드가 아닌 노드(Internal Node)에 데이터가 아닌 주소(인덱스)가 들어가있다는 것이다. 데이터들은 리프노드에만 들어있다. [장점] internal node에서 데이터를 저장하지 ...
😮 M원 검색 트리(M-way Search Tree) B 트리 이전에 먼저 M원 검색 트리를 알아야 한다. 이진 탐색 트리(BST)의 차수는 2이기 때문에 높이가 높아지는 단점이 있다. M원 검색 트리는 차수를 2에서 m개로 늘려 높이를 낮춘 것이다. [특징] 각 노드는 m-1 개의 레코드와 m개의 서브트리를 가질 수 있...
🤔 BST 란? 이진 트리 기반의 탐색을 위한 자료구조이다. 노드의 왼쪽 자식은 부모의 값보다 작은 값을 가져야 하며 노드의 오른쪽 자식은 부모의 값보다 큰 값을 가져야 한다. [이진 탐색 + 연결 리스트] 이진 탐색 탐색에 소요되는 시간 복잡도는 O(log n) 하지만 삽입, 삭제가 불가능하다....
🤔 트리란? 실제 나무를 거꾸로 세워놓은 듯한 모양이라서 트리라고 부른다. [트리가 나온 이유] 일반 배열에서 삽입이나 삭제를 하는데 O(n) 의 시간이 걸린다. 하지만 트리는 편향된 트리가 아닌 이상 일반적인 트리에서 O(log n)으로 감소된다. [사용사례] 계층적 데이터를 저장할 때 ...
🤔 해시(Hash) 란? 해시란 다양한 길이를 가진 데이터를 고정된 길이의 데이터로 매핑한 값을 말한다. 해시 알고리즘을 이용해 고유한 인덱스를 얻는다. 인덱스를 이용하여 빠른 검색 속도와 빠른 저장 속도를 갖는다. [해시 함수] 데이터를 효율적으로 관리하기 위해, 임의의 길이의 데이터를 수학적 연산을 통해 고정된 길이의 데이...
🤔 <> 는 무엇일까? - Generic List<String> list = new ArrayList<>(); 에서 <> 는 무엇일까? 다이아몬드 연산자 라고도 불리는 <>는 제네릭 타입을 명시할 때 사용된다. 제네릭(Generic) 은 클래스 또는 메서드에서 사용될 데이터 타입을 일반...
🤔 우선순위 큐란? 먼저 들어오는 데이터가 먼저 나가는 FIFO인 Queue와 달리, 우선순위 큐는 우선순위가 높은 데이터가 먼저 나가는 자료구조이다. 큐의 예시가 은행업무를 기다리는 대기줄이라고 하면, 우선순위 큐의 예시는 병원의 응급 환자를 생각할 수 있다. 자료 구조 먼저 나가는 요소 ...
🤔 Array 입력된 데이터들이 메모리 공간에서 연속적으로 저장되어 있는 자료구조 메모리상에서 연속적으로 저장되어 있는 특징을 갖기 때문에, index를 통한 접근이 용이하다. 배열의 크기는 처음 생성할 때 정하며, 이후에는 변경할 수 없다. [Array 시간복잡도] 탐색 : O(1) 접근하고자 하는 인...
🤔 최소 스패닝 트리(Minimum Spanning Tree)란? 가능한 모든 Spanning Tree 중에서 가장 작은 가중치를 갖는 트리를 의미한다. 크루스칼(Kruskal)과 프림(Prim) 알고리즘이 MST를 찾는 대표적인 알고리즘이다. Spnning Tree란 주어진 그래프의 모든 정점을 포함하면서 사이클이 없는 부분 그래프를 ...
🤔 힙(Heap) 이란? 완전 이진 트리 의 일종으로 우선순위 큐를 위해 만들어진 자료구조이다. 여러 개의 값들 중에서 최댓값이나 최솟값을 빠르게 찾아내도록 만들어진 자료구조이다. 이진 탐색 트리는 중복 값을 허용하지 않지만 힙은 중복 값을 허용한다. 메모리의 힙(heap) 영역과는 다른 개념이다! [우선순위 큐] ...
😃 문제 유형 어떤 문제가 나왔는지 궁금하신 분들을 위해 가장 먼저 설명하겠다. 문제에 대한 자세한 설명은 생략한다. 코테 문제 개수를 보고 8이라는 숫자를 보자마자 놀랐지만 다행히(?) 3문제만 알고리즘이고, 나머지는 객관식으로 백엔드 기술들과 관련된 개념을 묻는 문제들이 나왔다. 이번에 새롭게 객관식 나왔는데...
🤔 다익스트라 알고리즘이란? 최단 경로 탐색 알고리즘이다. 하나의 정점에서 다른 모든 정점으로 가는 최단 경로를 알 수 있다. 간선의 가중치는 음수를 포함할 수 없다. DP를 그래프로 확장시킨 것과 같다. 😮 다익스트라가 DP 유형인 이유 DP - Dynamic Programming 위 내용에 따르면 D...
🤔 병렬 스트림(ParallelStream) 자바 8에서 등장한 stream의 기능으로 병렬 처리를 쉽게 처리할 수 있는 메서드이다. 개발자가 직접 쓰레드 혹은 쓰레드풀을 생성/관리 할 필요 없이 parallelStream(), parallel() 만 사용하면 병렬 처리가 된다. Fork / Join Framework 관리 방식을 이용한다...
🤔 스트림(stream) 이란? 자바 8부터 추가된 기술로 데이터의 추상화된 연속적인 흐름을 다루는 API다. 람다를 활용해 배열과 컬렉션을 함수형으로 간단하게 처리할 수 있다. 스트림은 데이터 소스(타입)를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드를 정의해 놓아서 데이터 소스에 상관없이 모두 같은 방식으로 다룰 수 있어 코드...
🤔 자바의 정렬 자바에서는 데이터를 정렬하는 여러가지 방법을 제공한다. 이러한 정렬 기능들은 코딩 테스트를 풀 때 유용하게 사용된다. 기본적으로 오름차순, 내림차순을 넘어 정렬 기준을 입맛대로 정의하여 코딩테스트에서 유용하게 사용해보자 😤 Arrays.sort() int[] numbers = {5, 3, 9, 1, 6}; Array...
🤔 유니온 파인드 알고리즘이란? 상호 배타적 집합, Disjoin-set(서로소 집합) 이라고도 부른다. 최종 목표는 합연산을 진행하면서, 어떤 두 노드가 같은 집합에 있는지 확인하는 것이다. 이 알고리즘은 Union과 Find 두가지의 연산을 진행한다. 크루스칼 알고리즘과 프림 알고리즘에 사용된다. 😮 Find 연산 하나...
🤔 DP 란? Dynamic Programming(동적 계획법) 사실 이름은 멋있어 보여서 지은 것이라고 한다. 복잡한 문제를 재귀적으로 나누어 해결하는 방식 각 하위 문제의 해결 결과를 저장해두고 필요할 때 다시 사용(메모제이션)하여 효율적으로 문제를 해결할 수 있다. 재사용하기 때문에 계산의 중복을...
🧐 Optional 등장 이유 개발을 할 때 가장 많이 발생하는 예외 중 하나가 NullPointerException 이다. NPE 는 컴파일 시점이 아닌 런타임 시점에서 발생하기에 쉽게 발견하기 어렵다. NPE 를 피하기 위해서는 null 여부를 검사해야 하는데, 변수가 많아질수록 검사 로직의 개수는 늘어나...
🤔 직렬화(Serializable)란? 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터 변환하는 기술이다. 이와 반대로, 변환된 데이터를 다시 객체로 변환하는 기술을 역직렬화(Deserializable) 라고 한다. 예시를 들면, A라는 컴퓨터에서 만든 객체...
final 의미 기본적으로 final 키워드를 붙이면 해당 값을 변경할 수 없도록 동작한다. 즉, 단 한 번만 할당될 수 있는 Entity를 정의할 때 사용된다. final 키워드는 final 변수, final 메서드, final 클래스 총 3가지에 적용할 수 있다. final 변수 final 변수에서는 다시 네가지 경우로 세...
Call by Value 함수에 인자를 전달할 때 인자의 실제 값이 복사되어 매개변수에 저장된다. 이렇게 복사된 값은 함수 내에서 지역 변수로 사용된다. 함수 내에서 이 값을 변경해도 원래 변수의 값은 영향을 받지 않는다. 장점 원본 데이터가 변경될 위험이 없어 안전하다. 함...
리플렉션 (Reflection) JVM은 클래스 정보를 클래스 로더를 통해 읽어와서 해당 정보를 JVM 메모리에 저장한다. 그렇게 저장된 클래스에 대한 정보가 마치 거울에 투영된 모습과 닮아있어, 리플렉션이라는 이름을 가지게 되었다. 리플렉션을 사용하면 생성자, 메서드, 필드 등 클래스에 대한 정보를 아주 자세히 알아낼 수 있다. 컴파...
int 정수를 저장한다. Primitive type (기본 자료형) 이다. 기본 자료형은 스택 메모리에 값을 직접 저장하기 때문에 처리 속도가 빠르다. 산술 연산이 가능하며, null 값을 가질 수 없다. Integer 정수를 저장한다. Reference type (참조 자료형) 이다. 객...
객체의 값 비교 객체끼리의 값을 비교할 때 우리는 객체 안의 값들이 다 같으면 true가 되기를 기대하지만 실상은 그렇지 않다. static class Person { public String name; public int age; public Person(String name, int age) { thi...
투포인터란? two pointer 라고 불린다. 두 개의 포인터를 활용하여 문제를 해결하는 알고리즘이다. 1차원 배열에서 두 개의 포인터 사이 원소들의 부분합을 구하는 문제가 대표적이다. 슬라이딩 윈도우 sliding window 라고 불린다. 부분배열의 길이가 유동적으로 변하는 투포인터와 달리 슬라이딩 윈도우는 길이가 고...
String 이란? Immutable(불변)하기 때문에 + 등의 concat 연산 시 원본을 변경하지 않고 새로운 String 객체를 생성한다. 이로 인해 메모리 공간의 낭비가 발생하고 성능이 떨어진다. 불변 객체이기 때문에 멀티 쓰레드 환경에서 동기화를 신경쓰지 않아도 된다.(Thread-safe) 문자...
Binary Search 란? 이진 탐색 / 이분 탐색 이라고 부른다. 정렬되어 있는 리스트 에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법이다. 배열 내부가 정렬되어 있어야만 사용할 수 있는 알고리즘이다. 변수 3개(start, end, mid) 를 사용하여 탐색한다. 최악의 경우 순차 탐색의 경우 O(n) 걸리는 반면,...
오버로딩(overloading)과 오버라이딩(overriding) 비슷하게 생겼지만 완전히 다른 개념이다. 하지만 공통점이 하나 있는데, 그것은 둘 다 자바의 다형성을 지원하는 방식들이라는 것이다. 또한 둘 다 적용 대상이 메서드이다. 오버로딩(overloading)이란? 같은 클래스 내에서 같은 이름의 메서드를 여러 개 가지면서...
Monotone Stack 이란? 일련의 값에서 바로 다음 큰값이나, 바로 다음 작은 값을 구해야할 때 사용할 수 있는 Stack 풀이법이다. 주로 배열의 요소들을 순회하면서, 각 요소의 다음에 오는 더 큰 요소나 더 작은 요소를 찾는 문제에 사용된다. 즉, 어떤 특정 요소를 기점으로 처음으로 큰 요소를 찾거나 작은 요소를 찾는 문제에 적...
류호석님의 자바 템플릿 import java.io.*; import java.util.StringTokenizer; public class Main { static FastReader scan = new FastReader(); //정답은 sb에 append 를 사용하여 출력 //만약 개행까지 출력하고 싶으면 append('\n...
접근 제한자 default 보통 우리는 default를 접근 제한자로 많이 생각한다. 자바에는 접근 제한자가 총 4개로 제한 수준이 작은 순서대로 public, protected, default, private 가 존재한다. 그 중 default 는 같은 패키지 내에서의 접근을 허용하는 제한자 이다. 접근 제한자를 별도로 설정하지 않는...
static 이란? 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미한다. 일반적으로 우리가 만든 class는 static 영역에 생성되고, new 연산을 통해 생성한 객체는 heap 영역에 생성된다. GC는 Heap 영역의 메모리를 관리하기 때문에 영역 밖인 static을 자주 사용하면 프로그램 종료까지 메모리가 ...
추상클래스(abstract class)란? 하나 이상의 추상 메소드를 포함하는 클래스 추상 클래스는 미완성된 클래스이다. 클래스 앞에 abstract 키워드를 붙인다. 미완성된 메소드인 추상 메소드를 포함하고 있다. 혼자서는 클래스의 역할을 하지 못한다. 새로운 클래스를 작성할 때 부모 클래스의 ...
JVM Java Virtual Machine 스택 기반의 자바 가상 머신 자바 애플리케이션을 클래스 로더로 통해 읽어 들여 자바 API와 함께 실행한다. Java와 OS(운영체제) 사이에서 중개자 역할을 수행하여 Java가 OS에 구애받지 않고 독립적으로 작동이 가능하다. Garbage collection(메모리 관리)를 수행한다....
클래스(Class) 란? 객체를 만들어 내기 위한 설계도 혹은 틀 연관되어 있는 변수와 메서드의 집합 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성과 행위를 변수와 메소드로 정의한 것이다. 객체(Object) 란? 소프트웨어 세계에 구현할 대상 클래스에 선언된 모양 그대로 생성된 실체 ...
Stack 이란? 쌓아놓은 더미 를 뜻한다. Last-In First-Out (LIFO:후입선출) 이다. 가장 늦게 들어온 데이터가 가장 먼저 나간다. 자료의 출력 순서가 입력 순서의 역순으로 이루어질 때 사용한다. 예시 총기의 탄창에 들어있는 탄알 스마트폰에서 뒤로가기를 누를 때 이전에 수행되던 앱이 나오는 경우 ...
객체란 무엇인가? 객체는 여러 개로 정의되어 있다. 소프트웨어 세계에 구현할 대상이며 속성과 기능을 가지는 프로그램 단위 이름(name)과 값(value)으로 구성된 프로퍼티(property)의 정렬되지 않은 집합 어떠한 속성값과 행동을 가지고 있는 데이터 상태와 행동을 함께 지닌 실체 속성값과 기능을 가지는 데이터라고 정의할 수...
이 글을 쓰게 된 계기 sopt 서버파트에 떨어졌다. 정말 열심히 작성했고 나름 잘 작성했다고 생각했기에 어느정도 자신만만했다. 하지만 떨어졌다. 떨어진 이유를 전혀 몰랐다면 정말 억울하고 슬펐겠지만 다행히(?) 짐작할 수 있었다. 작성할 때에도 염려되었던 부분인데 개발에 관련된 얘기만 주구장창 나열했다. sopt는 실력이 낮더라도 얼마나 다양하고...
블로그 포스팅을 시작하기 위해 github 블로그를 선택했고 정적 사이트 생성기인 jekyll과 chirpy 를 사용하게 되었습니다. 구체적인 진행 과정은 제가 참고한 블로그들을 링크하고 따로 언급하지 않겠습니다. 이 포스팅에서는 각 도구를 사용한 이유와 chirpy를 이용해 블로그 생성까지 발생했던 오류를 다룹니다. Github 블로그를 선...