_

Always be tactful

전체 글 110

[Spring] OOP: SOLID 원칙

Object-Oriented Programming 👉 객체지향 프로그래밍을 위한 다섯 가지 중요한 설계 원칙을 SOLID 원칙이라고 한다. *더보기는 관련 예시임 1. Single Responsibility Principle (단일 책임 원칙)하나의 클래스는 단 하나의 책임만 가져야 한다.즉, 여러 기능을 한 클래스에서 처리하지 않는다.더보기✅ 정보 저장 기능과 정보 출력 기능을 별도의 클래스로 분리2. Open/Closed Principle (개방-폐쇄 원칙)확장에는 열려 있고, 수정에는 닫혀 있어야 한다.즉, 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있도록 설계한다.더보기✅ 조건문 대신, 인터페이스나 추상 클래스를 사용하여 새로운 기능을 확장3. Liskov Substitution Pri..

고독한 개발 일기 #1

스프링이 뭔지도 모르는 이의 엉망진창 개발 일지입니다.읽지 않는 것을 추천드리오나, 고통에 몸부림치는 뉴비의 일기장이 궁금하다면 말리지 않습니다.2025-03-231:57 프로그램을 짤 때, 일단 컨트롤러부터 만든다고 한다.그래서 controller 패키지에 있던 ReservationController를 열었다. 가장 먼저, 필요한 어노테이션을 작성하라는 문구가 보였다.일단 컨트롤러니까 컨트롤러라고 명시했다.@Controller메서드에서 HTML 파일을 반환할 때 사용한다더라.지금 내가 갖고 있는 `index.html`이나 `revervation_form.html` 말하는 것 같다. 만약에 JSON을 반환해야 한다면 @RestController를 써야 한다더라.물론 이번 프로젝트는 웹 페이지를 렌더링하는..

[Java] 제네릭과 명명 관례

제네릭  제네릭은 용어에서 알 수 있듯이 범용적으로 사용하는 데 목적이 있다. 이는 메서드에 매개변수를 추가하는 것과 비슷한 맥락이지만 결정적인 차이가 있다.  메서드는 매개변수에 인자를 전달해서 사용할 값을 전달한다. 반면, 제네릭 클래스는 타입 매개변수에 타입 인자를 전달해서 사용할 타입을 결정한다.더보기를 생략한 Raw Type도 가능하지만 사용하지 않는다. Raw Type이 존재하는 이유는 과거 코드와의 하위 호환이 필요했기 때문에 지원할 뿐이다. 제네릭 명명 관례E - ElementK - KeyN - NumberT - TypeV - ValueS, U, V, etc.더보기타입 인자로 기본형(int)을 사용할 수 없으며, 대신 래퍼 클래스(Integer)를 사용한다.

[🦁2] Web App & Spring MVC #2

이번 포스트에서는 `스프링 MVC 동작 원리와 구현`을 다룹니다.학습 순서웹 애플리케이션 기본 원리스프링 MVC 동작 원리와 구현 📍 객체 지향 설계 원칙 (다음 주 예정)📚 세부 학습 순서Spring MVC 동작 원리DispatcherServlet의 역할 & 동작 방식Controller, View Resolver와의 관계Spring MVC 요청 처리 흐름 (Controller → Service → Repository)Spring을 활용한 REST API 구현REST의 특징 (HTTP 메서드, REST 제약 조건)@RestController와 REST API 구현Spring MVC 동작 원리DispatcherServlet의 역할 & 동작 방식  Spring MVC의 핵심 컴포넌트라고 할 수 있는 Di..

[🦁2] Web App & Spring MVC #1

이번 포스트에서는 `웹 애플리케이션 기본 원리`를 다룹니다.학습 순서웹 애플리케이션 기본 원리 📍 스프링 MVC 동작 원리와 구현객체 지향 설계 원칙 (다음 주 예정)*본 포스트에서 `더보기`는 추가 설명임📚 세부 학습 순서웹 애플리케이션의 기본 원리웹 애플리케이션프로토콜 (HTTP, HTTPS)Web Server와 WAS3계층 아키텍처스케일링 (아키텍처의 확장)웹 애플리케이션의 기본 원리웹 애플리케이션 🔹 Web App이란 `클라이언트`와 `서버` 간의 상호작용을 통해 동작하는 애플리케이션이다.클라이언트: 주로 사용자가 요청하는 `웹 브라우저`서버: 요청을 처리하는 `웹 서버`와 `WAS`🔹 웹 애플리케이션은 주로 `HTTP 프로토콜`을 이용하여 데이터를 주고받는다.클라이언트(웹 브라우저)가 U..

[🦁1] Git & GitHub, 1주 차 정리

깃은 형상관리 시스템이다.학습 순서 기본적인 Git 사용법 → 변경 사항 관리 → 협업 & 고급 기능이번 주 키워드Working Directorygit reset & git revertgit stashConflictgit rebasecherry-pick1. Working Directory 우선, 깃의 추적 여부에 따라 `Untracked`와 `Tracked`로 나뉨. 여기서 깃의 추적이라고 함은 깃이 관리하는 파일인가를 뜻하는데, 깃의 관리 기준은 "git add를 한 번이라도 하였는가?"로 이해하면 쉬움.git add를 한 번도 하지 않은 새 파일 → Untrackedgit add를 한 번이라도 한 파일 → Tracked 파일이 한 번이라도 git add 된 경우 Tracked 상태가 유지되며, 해..

최적화 문제를 위한 DP (탑다운, 바텀업 방식)

다이나믹 프로그래밍은 시간 단축을 위한 알고리즘이다. 탑다운 방식과 바텀업 방식이 존재하며, 결국 핵심은 계산한 값을 저장하고 재활용한다는 것이다.동적 계획법(DP)를 구현해 보자. 탑다운: 메모이제이션 이름에서 알 수 있듯 큰 문제부터 작은 문제로 해결하는 방식이다. ✅ 재귀구조가 직관적이고 구현이 간단하다. ✅ 재귀호출이 깊어질수록 스택 오버플로우 가능성이 있다.public class Fibonacci { static int[] dp; public static int fibonacci(int n) { if (n 바텀업: 터뷸레이션 이름에서 알 수 있듯 작은 문제부터 큰 문제로 해결하는 방식이다. ✅ 스택 오버플로우 위험이 없으며 모든 값에 쉽게 접근할 수 있다.✅ 반복문을 ..

그래프 탐색 알고리즘 BFS 풀이

인사말 모두들 안녕하신가요. 저는 어느덧 알고리즘을 건든 지 140일 지났답니다. 기쁜 소식이 있어 전해드리자면, 최근에 BFS 문제들을 풀며 골드 구간에 진입했어요. 목표는 골랜디 마스터고요. 이번에 문제를 풀며 스스로 아쉬웠던 부분들이 있어서 지금의 생각과 감정을 기록하려고 글을 적습니다.BFS인데 그래프가 2개?package bfs;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.LinkedList;import java.util.Queue;public class Problem10026 { static final int[] dx = {0, 0, -1,..

비전공자 ADsP 2일 합격 수기

ADsP 제44회 응시하였습니다. 번아웃이 와서 미루고 미루다가 시험 이틀 전부터 준비했습니다. 가채점 돌려보니 56-62점 사이로 나올 것 같네요. 기억나지 않는 게 딱 3문항 있거든요. 이 중에서 2개 이상 맞혔다면 턱걸이 합격 가능할 것 같습니다. (3월 14일 수정) 60점 합격했습니다.준비 과정 1일 차 유튜브 아답터가 유명하길래 일단 아래 영상부터 시청하였습니다. 시간이 촉박한지라 냅다 기출 박치기로 전략을 짰습니다. 들으면서 한 번에 이해하려고 하지 않았고 대강 들은 뒤 바로 기출로 넘어갔습니다. ADsP - 아답터 기출문제집은 작년에 데이터 분석 프로젝트를 마무리하며 선물 받은 게 있어서 「ADsP 모든 것」이라는 교재 사용했습니다. 1과목, 2과목 연습문제 위주로 싹 풀었어요. 대강 60..

자격증 2025.02.26

[Java] BOJ 18870: 좌표 압축과 랭킹 알고리즘

문제수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다. X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.이해하기좌표 압축을 적용한 값 X'i가  Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같다. 중복되는 원소가 같은 순위를 가진다는 점이 마치 SQL Server에서의 DENSE_RANK 느낌인데, 이 문제에서 추가로 고려할 점은 값이 작을수록 순위가 높다는 것과 가장 높은 순위는 0순위라는 점이다. 중복되는 원소를 같은 순위로 둔다는 점을 고려할 때, 일단 Set이나 Map을 활용..

큐 구현체 LinkedList vs ArrayDeque

문제정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오. 명령은 총 여섯 가지이다.push X: 정수 X를 큐에 넣는 연산이다.pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.size: 큐에 들어있는 정수의 개수를 출력한다.empty: 큐가 비어있으면 1, 아니면 0을 출력한다.front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다. BOJ에서 제공하는 큐 문제다. LinkedList와 ArrayDeque 모두 큐 자료구조를 구현할 ..

[Java] BOJ 1550: Integer.parseInt()

BufferedReader를 쓰면서 문자열을 숫자 값으로 전환하는 일이 많았다. 그래서 Integer.parseInt()가 자연히 몸에 배어있었는데, 이게 특정 진법으로 해석해 숫자 값을 뱉는 친구라는 건 오늘에서야 알았다. (지능 이슈) 변명이지만 지금까지 진법 자체를 다룰 일이 딱히 없었기도 하고, 아무튼 단순히 Int로 파싱 하는 거라 생각했는데, 아래와 같이 기수를 입력하면 해당 진법으로 해석해 값을 뱉어낸다.Integer.parseInt(Stirng, base)// 2진법Integer.parseInt("1010", 2); // -> 10 반환// 8진법Integer.parseInt("12", 8); // -> 10 반환// 16진법Integer.parseInt("A", 16); // -> 10 ..

[Java] BOJ 13909: 창문 닫기와 힙 메모리 한도

요즘 변수명을 의미 있게 작성하려고 노력하는 중이다. 물론 알고리즘을 풀 때는 편의상 내가 알 수 있을 정도로만 작명한다. 동시에 메서드는 최대한 빼서 구현하는 편인데, 특별한 이유는 없고 메서드를 만드는 것에 익숙해지고 싶어서다.창문 닫기 문제는 9단계에 위치했지만 앞선 단계들보다 쉽다. 그래서 크게 생각할 점 없이 코드를 짤 수 있었다.// https://www.acmicpc.net/problem/13909import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Problem13909 { public static void main(String[] args) throws ..

[GitHub] Commit & Push Changes to GitHub via Terminal

IDE가 제공하는 커밋 기능만 사용하던 사람들이 분명히 있을 겁니다. 저도 그랬던 기억이 있어서 이참에 정리해 봤어요. 1일 1포스팅이 지치기도 하고요. 아무튼 오늘은 이걸로 넘어가겠습니다.1. Git 설치 확인git --version* Git 버전이 출력되면 설치된 것입니다.* 출력되지 않은 경우, Git을 설치해 주세요. [깃 설치하기]2. 로컬 리포지토리 준비git clone https://github.com/username/repository* 작업할 리포지토리의 URL을 복사한 후, 명령어를 통해 클론합니다.* 이미 준비된 상태라면 4번으로 넘어가 주세요.3. 리포지토리로 이동cd repository* cd는 change directory의 약자이며, 명령어를 통해 경로를 변경합니다.4. 변경 ..

[GitHub] Conventional Commits / 커밋 유형 정리

커밋 메시지를 유의미하게 작성하자. 커밋 유형을 통해 각 커밋이 어떤 종류의 변경을 포함하는지 설명할 수 있다. 커밋 메시지를 잘 작성하면, 나중에 프로젝트의 변경 이력을 살펴볼 때 쉽게 이해할 수 있다. 다음은 일반적으로 구분되는 커밋 유형이다. feat (새로운 기능 추가)  feat: 로그인 기능 추가fix (버그 수정)  fix: 로그인 화면에서 발생하는 오류 수정docs (문서 수정)  docs: README.md 파일 업데이트style (스타일 변경)  style: 코드 들여쓰기 정리refactor (리팩토링)  refactor:  함수 구조 개선perf (성능 개선)  perf: 이미지 로딩 속도 개선test (테스트 추가/수정)  test: 유닛 테스트 추가chore (기타 작업)  cho..