블로그
전체 8#카테고리
- 백엔드
#태그
- 워밍업클럽
- 백엔드
- 클린코드
- 프로젝트
- CS스터디-발자국
- CS스터디-미션
2025. 03. 09.
0
[인프런 워밍업 클럽] 스터디 3기_백엔드 클린 코드, 테스트 코드 1주차 발자국
공부내용1. 우리가 클린코드를 추구하는 이유가독성이해가 잘 된다.유지보수 하기가 수월하다.우리의 시간과 자원이 절약된다.2. 프로그램 이란?프로그램 = 데이터 + 코드3. 추상과 구체중요한 정보는 가려내어 남기고, 덜 중요한 정보는 생략하여 버린다.적절한 추상화 는 해당 도메인의 문맥 안에서, 정말 중요한 핵심 개념만 남겨서 표현하는 것추상은 항상 구체적인 실재에서 시작해야 한다. -Pablo Picasso 고수준 : 추상화 레벨이 높다 (자연어)저수준 : 추상화 레벨이 낮다 (기계어)4. 이름 짓기: 가장 단순하면서도, 아주 중요한, 고도의 추상적 사고를 기반으로 한다.표현하고자 하는 구체에서 정말 중요한 핵심 개념만을 추출하여 잘 드러내는 표현우리 도메인의 문맥 안에서 이해되는 용어작명 팁단수와 복수를 구분하기어미에 ‘-(e)s’ 를 붙여 어떤 데이터(변수, 클래스 등)가 단수인지, 복수인지 나타내는 것만으로도 읽는이에게 중요한 정보를 같이 전달할 수 있다.이름 줄이지 않기ex) column → col, latitude → lat, longitude → lon관용어처럼 많은 사람들이 자주 사용하는 줄임말 정도는 존재한다.은어/방언 사용하지 않기새로운 사람이 팀에 합류했을때, 용어를 단번에 이해할 수 있는가?도메인 용어 사용하기도메인 용어를 먼저 사전으로 정의하는 과정이 필요할 수 도 있다.좋은 코드를 보고 습득하기ex) pool, candidate(당선, 후보), threshold(문지방, 한계점, 임계값)등비슷한 상황에서 자주 사용하는 단어, 개념 습득하기5. 메서드와 추상화잘 쓰여진 코드라면, 한 메서드의 주제는 반드시 하나다. (0개도 2개도 아닌, 무조건 1개)→ 여러개라고 느껴진다면 추상화가 제대로 되지않은것이니 분리해야한다.6. 메서드 선언부메서드 구성요소 : 반환타입 메서드명 (파라미터) {}메서드 선언부 : 반환타입 메서드명 (파라미터) {}메서드 구현부 : 반환타입 메서드명 (파라미터) {}반환타입메서드 시그니처에 납득이 가는, 적절한 타입의 반환값 돌려주기→ 반환 타입이 boolean인데, 이게 이 메서드에서 무엇을 의미하는거지?void 대신 충분히 반환할 만한 값이 있는지 고민해보기→ 반환값이 있다면 테스트도 용이해진다.메서드명추상화된 구체를 유추할 수 있는, 적절한 의미가 담긴 이름파라미터와 연결지어 더 풍부한 의미를 전달할 수도 있다.파라미터파라미터의 타입, 개수, 순서를 통해 의미를 전달파라미터는 외부 세계와 소통하는 창 💡메서드 생성 기능 (블럭 잡고 + ⌥ + ⌘ + M) 💡inline 기능 (⌥ + ⌘ + N)목적불필요한 변수를 줄이고 싶을 때메서드가 너무 작아서 굳이 따로 뺄 필요가 없을 때리팩토링할 때 코드 단순화방법변수를 선언한 곳에 값 자체를 직접 넣음메서드 호출을 해당 메서드의 코드로 직접 치환함상수를 선언한 곳에 값을 직접 대입함 inline 예제before int a = 10; int b = a * 2; System.out.println(b); after int b = 10 * 2; **System.out.println(b); => 변수 a를 없애고, 직접 값(10)을 대입함** 7. 추상화 레벨하나의 세계 안에서는 추상화 레벨이 동등해야 한다.8. 매직넘버, 매직스트링 (옵션 + 커맨드 + C)의미를 갖고 있으나, 상수로 추출되지 않은 숫자, 문자열 등상수 추출로 이름을 짓고 의미를 부여함으로써 가독성, 유지보수성이 향상됨추출 이후 클래스 하단에 모아짐섹션3. 논리, 사고의 흐름1. 뇌 메모리 적게 쓰기 💡“범주화”정리 시스템에서 중요한 과제를 최소의 인지적 노력으로 최대의 정보를 제공하는 것이다.-정리하는 뇌, 대니얼 J.레비틴- 💡“집중력”뇌는 한 번에 한 가지 일 밖에 하지 못한다. 멀티태스킹? 그건 저글링일 뿐.-도둑맞은 집중력, 요한 하리-인지적 경제성최소한의 인지로 최대의 효율을 내보자뇌 메모리 적게 쓰기다른 사람들이 우리가 작성한 코드를 읽을 때 뇌 메모리를 효과적으로 쓸 수 있도록 가독성을 높이는 것이 핵심이다.2. Early return메서드로 추출 (리턴하기위해)if문을 쪼개서 elseif와 else의 사용을 지양3. 사고의 depth 줄이기중첩 분기문, 중첩 반복문메서드 추출로 중첩 분기문, 반복문을 줄여서 사고를 쪼개서 해볼 수 있음무조건 1 depth로 만들라는게 아님, 추상화를 통해 사고과정의 depth를 줄이는 것이 중요사용할 변수는 가깝게 선언하기4. 공백 라인을 대하는 자세공백 라인도 의미를 가진다.5. 부정어를 대하는 자세부정어구를 쓰지않아도 되는 상황인지 체크부정의 의미를 담은 다른 단어가 존재하는지 고민부정연산자 보다는 isNotA와 같이 표현하는것이 가독성이 좋음6. 해피 케이스와 예외 처리해피케이스는 우리가 의도한대로 진행되는 상황을 말함해피케이스의 예외 처리예외가 발생할 가능성 낮추기어떤 값의 검증이 필요한 부분은 주로 외부 세계와의 접점의도한 예외와 예상치 못한 예외를 구분하기Null을 대하는 자세항상 NullPointException을 방지하는 방향으로 경각심 가지기메서드 설계 시 return null을 자제Optional에 관하여Optional은 꼭 필요한 상황에서 반환타입에 사용한다.Optional을 파라미터로 받지 않도록 한다.Optional을 반환받았다면 최대한 빠르게 해소한다.섹션 4. 객체 지향 패러다임1. 단일 책임 원칙 (SRP, Single Responsibility Principle)클래스는 하나의 역할만 담당해야 한다.2. 개방-폐쇄 원칙 (OCP, Open/Closed Principle)코드는 확장할 수 있어야 하고, 기존 코드 수정 없이 기능을 추가할 수 있어야 한다.3. 리스코프 치환 원칙 (LSP, Liskov Substitution Principle)자식 클래스는 부모 클래스의 기능을 대체할 수 있어야 한다.4. 인터페이스 분리 원칙 (ISP, Interface Segregation Principle)필요한 기능만 포함한 작은 인터페이스를 여러 개로 나누어야 한다.5. 의존 역전 원칙 (DIP, Dependency Inversion Principle)구현이 아닌 추상화에 의존해야 한다.1주차 회고그 유명한 클린코드를 개발 공부 시작할때 경험해보고 싶어서 신청함Java 중급 문법 공부하고 있는 나에게도 '이렇게 생각할 수 있구나' 신선한 충격이었음강의를 하나하나 들을때마다 묘하게 빠져들음코드를 따라칠때는 메서드 추출이나 인라인처리 등의 단축키를 많이 사용하게 됨매직넘버, 매직스트링이라는 개념을 알게됨추상의 개념을 이해했다가 못했다가 계속 반복하면서 아직 자리잡지 못하고있음근데 또 강의를 보면 오 .. 신기하다 하면서 보고 있음=> 결론 : 어려우면서 재밌다 클린코드
백엔드
・
워밍업클럽
・
백엔드
・
클린코드
2025. 03. 09.
0
[인프런 워밍업 클럽] 스터디 3기_백엔드 프로젝트 (Kotlin, Spring Boot)
공부 내용 섹션 2. 웹 개발 기본과 프로젝트 준비1. 웹 서비스를 구성하는 요소1) 클라이언트요청하는 주체 (PC, 스마트폰의 브라우저(구글 크롬, 애플 사파리 등))2) 서버요청대로 작업을 수행한 후 응답하는 주체일반적으로 데이터베이스에서 데이터의 CRUD 이후 결과를 클라이언트에게 반환하는 작업을 함3) 데이터베이스데이터의 집합을 의미하며, 그 집합을 저장 및 관리하는 프로그램을 DBMS (Database Management System)이라고 함브라우저에서 주소창을 입력하면 어떤 일이 일어날까?사용자가 주소창에 https://www.naver.com 입력브라우저가 DNS 서버에서 해당 도메인의 IP 주소를 찾음클라이언트(브라우저)가 해당 IP 주소의 서버로 요청 전송 (HTTPS 요청)서버가 요청을 처리하고 필요하면 데이터베이스와 통신서버가 요청에 대한 응답을 생성하여 클라이언트에게 전송브라우저가 응답을 해석하고 HTML을 렌더링하여 웹 페이지 표시2. 웹 프레임워크와 Spring웹 프레임워크동적 웹 서비스 개발을 편리하게 만들어주는 도구웹을 개발할 때 공통적으로 요구되는 기능을 쉽게 활용할 수 있도록 제공Spring FrameworkJava 기반의 웹 프레임워크MVC 패턴 (Model-View-Controller)소프트웨어 아키텍처 디자인 패턴사용자의 요청을 받아 데이터와 화면을 전달하는 과정에서 각각의 역할을 분담✔ 주요 구성 요소Model : 데이터를 담음View : 데이터를 꺼내옴, 사용자에게 보여지는 화면을 담당함Controller : 데이터를 넣음, 요청을 받아 작업을 수행함레이어드 아키텍처 (Controller-Service-Repository)가장 대중적인 소프트웨어 아키텍처스프링 개발 시 대부분 레이어드 아키텍처 기반으로 개발하며, 3가지 계층으로 구분✔ 주요 계층Presentation (Controller): 클라이언트가 요청할 수 있는 인터페이스를 정의하고, 전달받은 데이터를 검증, Service의 메소드(처리 로직)를 호출Business (Service): 목적에 맞게 데이터를 처리하고, 일반적으로 레포지토리의 다양한 DB 처리 메소드를 호출해 저장, 수정, 조회, 삭제 등을 수행Data Access (Repository): DB에 접근해 작업을 요청하고, 다양한 DB 처리 방법을 제공하면 여러 서비스에서 공통적으로 사용할 수 있음3. HTTP와 REST APIHTTP (Hyper Text Transfer Protocol)네트워크로 통신하는 두 컴포넌트 간의 통신 규약REST APIHTTP 통신으로 동작하는 애플리케이션의 기능을 정의하는 컨벤션 (강제성은 없음)6. 패키지 구조- domain - presentation - admin 섹션 3. 개발 - Domain강의를 보면서 코드 쳐봤습니다 ! https://github.com/0802222/portfolio-dongdong.git GitHub - 0802222/portfolio-dongdongContribute to 0802222/portfolio-dongdong development by creating an account on GitHub.github.com 다음주부터는 미니 프로젝트 주제도 정하고 미션도 해야합니당 ㄷㄷㄷ바쁘다 바뻐 ! 1주차 회고HTTP, DB와 같이 이미 알던 개념도 있고, 알고있었지만 아리송한 Java Bean 개념도 들었고, 영속성 컨텍스트와 같이 새로운 개념도 있었음아직 익숙하지 않은 문법들이 있음 (필드만들 때 변수명 앞에 var 를 붙이는 것)var id: Long?과 같이 자료형 뒤에 물음표가 붙으면 null이 허용된다 라는것도 새로 배움!entity 패키지 작성할 때 1: 다 관계를 작성해봄 (experience : experinceDetail class)양방향 연관관계 메서드 mappedBy를 알게 됨처음보는 어노테이션과 java 중급-고급 문법이 언뜻언뜻 보임=> 결론 : 모르는게 엄청 많지만 일단 따라해보는 중이다~
백엔드
・
워밍업클럽
・
백엔드
・
프로젝트
2024. 10. 20.
1
[인프런 워밍업 클럽 CS 2기] 3주차 발자국
학습기간1주차 2024-10-14(월) ~ 2024-10-18(금)강의 수강학습내용 요약알고리즘섹션3-알고리즘삽입 정렬(Insertion Sort)선택정렬과 마찬가지로 배열을 두 영역으로 나누어 정렬을 진행함 (정렬된 영역, 정렬되지 않은 영역)정렬되지않은 영역에서 데이터를 하나씩 꺼내서 정렬영역의 적절한 위치에 삽입하여 정렬하는 것 삽입 정렬의 성능도 버블,선택정렬과 같이 O(n^2)이다.병합 정렬(Merge Sort)반으로 나누고 또 반으로 나눠서 각 원소로 정렬 한 후 한단계 씩 병합해가면서 정렬재귀함수 호출 모양과 아주 비슷한 모양을 하고 있음 분할된 배열을 병합할때는 N개의 데이터를 n번 비교하므로 n과 logn을 곱해서 O(nlogn)의 성능이 나옴장점 : 성능이 지금까지 배운 정렬보다 좋음단점 : 재귀적인 기법을 이용해 이해와 구현이 어려움퀵 정렬(Quick Sort)퀵정렬은 이전에 알아본 병합정렬과 같이 분할 정복 알고리즘에 속함그래서 재귀를 사용함퀵정렬은 정렬전 배열에 있는 수자중 하나를 피벗 으로 설정해줌피벗을 선택하는 방법은 여러가지 있으나, 여기서는 이해하기 쉽게 배열의 왼쪽에 있는 것으로 선택함퀵정렬은 이렇게 한번 진행될 때 마다 피벗이 정렬되고 정렬된 배열을 좌우로 나눠 같은 방식으로 재귀호출해 모든 배열을 정렬함성능 피벗이 배열을 반으로 가르지않고 한쪽에 치우쳤을 경우 O(n^2)의 성능임대부분 피벗을 중간값으로 설정하므로 배열을 매번 반으로 가를 수 있어서 평균적인 성능은 ‘새타(nlogn)’의 성능을 가짐성능만 보면 병합정렬이 더 좋다고 볼 수 있는데, 실제로 병합정렬과 비교하면 퀵정렬이 더 적은비교와 더 적은메모리 공간을 차지하기 때문에 더 좋은 알고리즘으로 평가됨퀵정렬 : 새타(nlogn), O(n^2)병합정렬 : O(nlogn)장점 : 성능이 지금까지 배운 정렬보다 좋음단점 : 재귀적인 기법을 이용해 이해와 구현이 어려움 동적 프로그래밍-메모이제이션(memoization)재귀를 이용해 큰문제를 작은문제로 분할해서 해결했음 ⇒ 분할정복단점 : 재귀를 사용하면 함수가 호출되어 콜스택의 영역을 차지하는 단점 외에도 성능에 크게 영향을 미치는 단점이 있음피보나치 수열(하향식 문제)무한대 수열을 만듦….구현 시 성능이 좋지 못함return 값인 fibonacci(n-2)가 재귀적으로 호출할 때 반복계산이 되는 경우가 있고, 중복호출도 있음, 시간이 낭비됨⇒ 결과값을 저장해 함수호출수를 줄이고 성능이 향상됨메모이제이션으로 성능향상해보기계산하려는 데이터가 있는지 검색없다면 함수를 호출해 그결과를 저장⇒ 해시테이블(데이터 검색,삽입이 빠른 장점이 있음)을 이용⇒ 해시테이블의 키에 계산하려는 값을, 밸류에 계산결과를 저장함메모이제이션계산결과를 저장해서 여러번 계산하지 않도록 하는 기법장점 : 재귀적인 기법으로 어려운 문제를 단순히 풀 수 있고, 계산결과를 해시테이블에 저장하기 때문에 중복계산을 하지않아 속도가 빠름, 재귀가 더 직관적이라면 메모이제이션이 유리함단점 : 함수를 여러번 호출하는 재귀를 사용하기 때문에 함수를 하나 호출하는것보다 오버헤드가 더 들고, 함수호출로 메모리 공간에 스택을 차지하고 메모이제이션을 위한 해시테이블 공간까지 차지하기 때문에 메모리를 더 많이 사용함 동적 프로그래밍-타뷸레이션상향식 계산방식계산에 필요한 모든 값을 전부 계산후 테이블에 저장해둠재귀가 직관적이지 않을때는 타뷸레이션을 이용해 메모리도 절약하고 속도도 빠르게 해결할 수 있음 운영체제섹션8-가상메모리가상메모리 개요운영체제나 프로세스보다 큰 프로그램이 실행되지 못할 때, 가상메모리를 이용해 실행 할 수 있음프로세스(사용자)는 메모리 관리자(가상메모리)를 통해서 메모리(메인메모리)에 접근함프로세스 입장에서는 물리메모리에 직접 접근할일이 없고, 메모리 관리자에게 요청만 하면됨메모리 관리자는 프로세스의 요청이 있으면 그에맞는 물리 메모리로 연결시켜줌가상메모리의 크기는 이론적으론 무한대지만, 실제론 메모리의 크기와 CPU의 비트수로 결정됨ex) 만약 32비트의 경우, 표현할 수 있는 주소값은 2^32승으로 대략 4GB정도 되고, 가상 메모리의 크기도 똑같이 4GB임가상메모리 할당운영체제가 사용하는 0번지를 제외가상메모리 시스템에서는 운영체제 영역을 제외한 나머지영역을 일정한 크기로 나누어서 프로세스에게 할당함메모리 분할방식과 동일하게 가변분할방식(세그멘테이션)과 고정분할방식(페이징)으로 나뉨각각 단점을 보완한 세그멘테이션-페이징 혼용기법을 사용함가상메모리시스템-가상주소가상주소는 메모리나 스왑영역 중 한 곳에 위치함메모리 관리자는 가상주소와 물리주소를 일대일 매핑 테이블로 관리함 동적 주소 변환(DAT, Dynamic Address Translation)메모리 관리자는 물리메모리+스왑영역을 합쳐서 프로세스가 사용하는 가상주소를 물리주소로 변환함동적주소변환을 거치면 프로세스는 마음대로 사용자 데이터를 물리 메모리에 배치할 수 있음 세그멘테이션(배치정책)세그멘테이션에서 프로그램은 함수나 모듈등으로 세그먼트를 구성함데이터, 코드, 힙, 스택, 라이브러리 등 장점 : 메모리를 가변적으로 분할 할 수 있고,각 영역을 모듈로 처리할 수 있기 때문에 공유와 각 영역에 대한 메모리 접근보호가 편리함단점 : 가변분할 방식의 단점인 외부단편화가 발생함논리주소사용자, 프로세스, CPU가 바라보는 주소메모리 관리자(MMU)가 중간에서 세그멘테이션 테이블에 저장된 Base Address와 Bound Address 정보를 이용해 물리주소로 변환 해줌CPU에서 논리주소가 전달되면, 메모리관리자는 이 논리주소가 몇번 세그먼트인지 알아내서 메모리관리자 내의 segment table base register에서 물리 매모리내에 있는 세그멘테이션 테이블을 찾고 세그먼트 번호를 인덱스로, base address와 bound address를 찾음cf) 운영체제는 컨텍스트 스위칭을 할 때 마다 메모리 관리자 내에 있는 segment table base register를 해당 프로세스의 것으로 값을 바꿔줘야 하기 때문에 컨텍스트 스위칭은 굉장히 무거운 동작임 논리주소 → 물리주소 변환 예시CPU에서 세그먼트 1번이 0x632번지로 접근한다고 가정해보자메모리 관리자는 CPU의 요청을 받고 세그먼트가 1번인 것을 알아내고, 메모리 관리자 내에 있는 segment table base register를 이용해서 세그멘테이션 테이블을 찾아냄세그멘테이션 테이블을 찾은다음, 세그먼트 1번이 위치한 1번 인덱스를 참조하고, 논리주소 632와 bound address 1000을 비교해보면 논리주소가 더 작음⇒ 더 작은 논리주소 632와 base address 5200을 더해 물리주소 5832가 됨페이징(배치정책)메모리를 할당할 때 정해진 크기의 페이지로 나눔모든 페이지는 크기가 같기때문에 관리가 쉬워지고, 외부단편화 현상이 발생하지 않음물리주소 공간도 논리주소공간(페이지)과 같이 동일하게 나뉘는데 이걸 프레임 이라고 부름페이징의 주소변환 방법세그멘테이션과 마찬가지로 메모리관리자는 테이블을 갖고 있고, 이를 페이지 테이블 이라고 부름CPU에서 논리주소를 전달해주면, 메모리 관리자는 이 논리주소가 몇번 페이지 인지, 오프셋은 얼마인지 알아냄메모리 관리자 내 page table base register(PTBR)를 이용해서 물리 메모리에 있는 페이지 테이블을 찾고, 페이지 번호를 인덱스로 프레임 번호를 알아내고 오프셋을 이용해 물리주소로 변환함오프셋의 계산페이지 테이블에 invalid로 표시되어있으면 스왑영역, 즉 하드디스크에 저장되어 있다는 의미임세그멘테이션과 페이징의 차이페이지의 크기이다.세그멘테이션은 프로세스마다 크기가 달라 bound address를 가지고 있지만,페이징은 모든 페이지의 크기가 동일해서 크기를 표현하는 bound address는 필요하지 않음세그멘테이션 (외부단편화 발생), 페이징 (내부단편화 발생-정해진 크기의 페이징보다 프로세스의 정보가 작으면 그만큼 공간이 낭비됨)페이징은 페이지의 크기가 고정되어있기때문에 공유하거나 권한을 부여하는게 어려움페이징에서 가장 신경써야하는것은 페이지 테이블의 크기임각 프로세스마다 페이지 테이블을 가지고 있는데, 프로세스가 많아질수록 테이블도 많아지기 대문에 프로세스가 실제로 사용할 수 있는 메모리 영역이 줄어듦실제로 메모리 관리자가 참조하는 페이지 테이블도, 물리메모리의 운영체제 영역에 저장되어 있기 때문에 페이지 테이블의 크기가 너무 크면 사용자 영역이 부족하게 됨 페이지드 세그멘테이션(배치정책)세그멘테이션과 페이징의 장점을 취한 방식메모리 접근권한은 메모리의 특정 번지에 부여된 권한으로 읽기(Read), 쓰기(Write), 실행(Execute) 3가지로 나뉨ex) 0x0 ~ 0x1000까지는 읽기 권한, 0x1000~0x2000까지는 읽기,쓰기 권한 설정 .ᐟ프로세스의 각 영역의 메모리 권한 알아보기CODE : 프로그램 그 자체이므로 수정되면 안됨 → 읽기/실행 권한DATA : 일반변수, 전역변수, 상수로 선언한 변수 저장 → 읽기 /(쓰기)권한HEAP : 읽기/쓰기 권한STACK : 읽기/쓰기 권한메모리 접근 권한 검사가상주소→물리주소 변환 될 때마다 일어남권한 위반 시 에러발생 및 종료페이지드 세그멘테이션세그멘테이션 테이블과 페이지 테이블이 혼합된 것세그멘테이션 테이블에는 권한 비트를 추가하고, base address는 페이지 넘버로 바뀌고, bound address는 이 세그멘트의 페이지 개수로 바뀜(이름만 달라졌을 뿐 본질은 달라지지 않음)단점 : 물리메모리에 접근하기 위해서 메모리에 접근을 2번 해야됨(1. 세그멘테이션 테이블 참조, 2.페이지 테이블 참조)⇒ 오늘날에는 이러한 단점때문에 페이징과 페이지드 세그먼테이션 기법을 적절히 섞어서 사용함디맨드 페이징(가져오기 정책) 조만간 필요할 것 같은 데이터를 메모리로 가져오고, 쓰이지 않을 것 같은 데이터는 스왑영역으로 이동시키는 정책임스왑영역으로 데이터를 이동시키는 것을 최소화 시켜야 함(CPU의 수백개가 넘는 사이클이 걸리기 때문에 성능이 안좋아짐)페이지 테이블을 이루고 있는 한 행을 페이지 테이블 엔트리(PTE) 라고 함페이지 테이블 엔트리(PTE)접근비트페이지가 메모리에 올라온 후 데이터에 접근이 있었는지 알려줌메모리에 읽기나 실행 작업을 했다면 1 로 바뀜변경비트페이지가 메모리에 올라온 후 데이터에 변경이 있었는지 알려줌메모리에 쓰기 작업을 했다면 1 로 바뀜유효비트페이지가 물리메모리에 있는지 알려줌유효비트가 1이라면 스왑영역에 있고, 0이라면 물리메모리에 있음읽기/쓰기/실행 비트해당 메모리에 접근권한이 있는지 검사하는 권한비트 페이지 교체정책프로세스는 데이터 접근을 위해 메모리를 참조하는데, 해당 데이터가 메모리에 없으면 Page Fault가 발생함Page Fault가 발생하면 해당 페이지를 스왑영역에서 메모리로 불러들여야하는데 메모리가 꽉차서 공간이 없다면 메모리에 있는 페이지 중 하나를 선택헤서 스왑영역으로 옮겨야 함메모리에 있는 페이지를 스왑영역으로 옮길때 어떤 페이지를 선택할지 결정하는 정책을 페이지 교체정책이라고 함페이지 교체정책의 종류무작위 선택 방법무작위로 선택해서 교체하는 이 방법은 지역성을 고려하지 않기때문에 자주사용되는 페이지가 선택될 수 있어 성능이 별로 좋지 않음그래서 거의 사용되지 않음FIFO(First In First Out, 메모리에 들어온지 가장오래된 페이지를 선택하는 방법)페이지 1이 먼저 들어왔으면 먼저 교체함단점 : 자주쓰는 페이지가 먼제 교체되는 단점이 있음구현이 간단하고 성능도 꽤 괜찮아서 조금 변형해서 많이 쓰임Optimum(앞으로 가장 오랫동안 쓰이지 않을 페이지를 선택하는 방법)사실상 구현이 불가능한 이론적인 선택 방법(앞으로 누가 가장 사용되지않을지 모르니까)다른 알고리즘과 성능비교를 할 때 참조용으로 쓰임LRU(Least Recently Used, 최근에 가장 사용이 적은 페이지 선택 방법)지역성 이론의 시간의 지역성에 따르면 최근 사용한 데이터가 앞으로도 사용할 확률이 높기 때문에, 최근에 가장 사용을 적게한 페이지가 앞으로도 사용될 확률이 적다는 결론이 나옴실제로도 Optimum 알고리즘에 근접한 성능을 보임하지만 프로그램이 지역성을 띄지 않을 땐 성능이 떨어짐 LRU의 유사 구현 - 클락 알고리즘(Clock Algorithm)접근 비트 하나만 이용함일정 시간 간격마다 모든 페이지의 접근비트를 0으로 초기화함만약 페이지가 참조되었다면 접근비트는 1로 설정 됨일정 시간 간격마다 페이지가 참조되었는지 여부를 확인 할 수 있음향상된 클락 알고리즘(Enhanced Clock Algorithm)이 알고리즘은 접근비트만 이용하는 것이 아니라 변경비트까지 봄스왑영역으로 보내지는 것 중 순위가 높은거슨 접근비트가 0이고, 변경비트도 0인 페이지임그다음으로 접근비트0, 변경비트1 → 접근비트1, 변경비트0 → 접근비트1, 변경비트 1 인페이지 순으로 교체됨LRU만 사용되고 FIFO는 사용되지 않는 것 처럼 보이나, 부득이하게 FIFO를 사용할 때가 있음하드웨어적으로 접근비트를 지원하지 않는 시스템에선 FIFO를 이용함⇒ 어쩔수없이 FIFO의 성능을 높일 수 있는 방법 고안 (2차 기회 페이지 교체 알고리즘)2차 기회 페이지 교체 알고리즘FIFO방식에서 자주 사용하는 페이지에게 또 한번의 기회를 주는 것FIFO방식과 동일하게 동작하지만, 만약 Page Fault 없이 페이지 접근에 성공했다면 해당 페이지를 큐의 맨 뒤로 이동시켜 수명을 연장시켜주는 방식성능 : LRU > 2차 기회 페이지 교체 알고리즘 > FIFO 순 스레싱과 워킹셋CPU 스케쥴링의 목표 : CPU 사용률을 높임방법 : 동시에 실행하는 프로세스의 수 (멀티프로그래밍 정도, Degree of Multiprogramming)를 올림⇒ 어떤 프로세스가 I/O 작업으로 CPU를 사용할 수 없을 때, 다른 프로세스로 컨텍스트 스위칭을 해서 CPU 사용율을 높일 수 있음⇒ CPU 사용율을 높이기 위해 멀티프로그래밍 정도를 늘렸으면, 이 프로세스들이 필요로 하는 공간이 있기 때문에 물리메모리에 프레임을 할당해야함⇒ 하지만, 물리메모리에 할계가 있기때문에 모든 프로세스의 모든 프레임을 물리메모리에 올릴 수 없고, 일부는 스왑영역에 저장됨 스레싱발생 원인 : 근본적인 원인은 물리메모리의 크기가 부족한 것 해결방법 : 프로세스가 실행되면 일정량의 페이지를 할당하고, Page Fault가 발생하면 더 많은 페이지를 할당함 워킹셋현재 메모리에 올라온 페이지는 다시 사용할 확률이 높기 때문에 하나의 세트로 묶어서 메모리에 올림 프로세스가 준비상태에서 실행상태가되는 컨텍스트 스위칭을 할 때 사용됨 회고처음시작할땐 프로그래밍 언어와 SQL정도 공부한 상태라 자료구조, 알고리즘, 운영체제 모두 용어가 겁나고 두려웠었는데 감자님 인강을 통해 그림으로 배우고 많은 예시, 직접 구현등을 해보니까 자신감이 생긴 것 같다.독학하다보니 이렇게 스케쥴을 가지고 공부해본적이 드문데 인강을 뽀개는 법을 배운것 같고, 정처기 실기에서도 LRU 페이지 교체가 나와서 신기했다.. 엮여 있는 것 같아서 앞으로의 내 공부에 많은 영향이 있을 것 같다. 기대된다!
2024. 10. 20.
1
[인프런 워밍업클럽 CS 2기] 3주차 미션
운영체제메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.메모리는 레지스터, 캐시 | 메인메모리(RAM) | 보조저장장치(HDD, SSD)로 나눌 수 있다.레지스터가장 빠른 메모리, CPU내 존재, 휘발성 메모리, bit는 레지스터의 크기임CPU 계산시 레지스터로 가져와서 연산을 하고, 결과는 다시 메인메모리(RAM)에 저장시킴메인메모리에 있는 값을 옮기려면 느리기때문에, 필요한 값은 미리 옮김CPU의 한사이클에 접근할 수 있어서 굉장히 빠름캐시메인메모리에 있는 데이터를 미리 옮긴 곳이 캐시임성능의 이유로 여러개를 둠 (L1, L2, …)CPU의 수~수십 사이클에 접근할 수 있어서 빠름메인메모리실제 운영체제와 다른 프로세스들이 올라가는 공간전원이 꺼지면 데이터가 지워짐 = 휘발성 메모리보조저장장치보다 속도는 빠르지만 가격이 비싸기 때문에 데이터 저장보다는 실행중인 프로그램을 올리는 용도로 사용됨CPU의 수백 사이클에 접근해서 시간이 걸림보조저장장치속도 느림, 용량 큼, 가격 저렴, 비휘발성 메모리CPU 수백만 사이클에 접근해 시간이 많이소요됨 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식(세그멘테이션)프로세스의 크기에 따라 메모리를 나누는 방식한 프로세스가 메모리의 연속된 공간에 할당되기 때문에 연속 메모리 할당 이라고 함장점 : 메모리가 연속된 공간에 할당되기 때문에 더 크게 할당돼서 낭비되는 공간인 내부 단편화 가 없음단점 : 두개의 빈공간을 합해서 60MB가 있을때, 60MB의 새로운 프로세스를 연속된 공간에 할당하지 못하는 외부 단편화 가 발생함⇒ 조각 모음 : 외부 단편화가 발생한 공간을 합쳐줌조각모음 실행 시, 현재 메모리에서 실행되고 있는 프로세스들의 작업을 일시 중지해야하고, 메모리 공간을 이동시키는 작업을 해야하기 때문에 오버헤드가 발생하게 됨고정 분할 방식(페이징)프로세스의 크기와는 상관없이 정해진 크기로 메모리를 할당하는 방식한 프로세스가 메모리에 분산되어 할당되기 때문에 비연속 메모리 할당 이라고 함장점 : 같은 크기로 나누기 때문에 구현이 간단하고, 오버헤드가 적음단점 : 작은 프로세스도 큰 영역에 할당돼서 공간이 낭비되는 내부 단편화 가 발생함⇒ 해결하는 방법은 없고, 분할되는 크기를 조절해서 내부단편화를 최소화 함CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱⇒ CPU 스케쥴러는 CPU 사용률이 낮아지면 더많은 프로세스를 메모리에 올리게 되고 반복되다보면 어느새 CPU 사용률은 0에 가깝게 떨어지게 되며, 이를 스레싱 이라고 부름HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.HDD는 주변장치로써 버스도 분리되어 있어서 실행에는 필요없다고 느낄 수 있는데 운영체제를 RAM에 올리면 컴퓨터가 끄고 켜질때마다 날아가기때문에 꼭 필요하고, 데이터 스왑시 에서도 필요하다.SSD는 부팅속도나, 프로그램을 실행하고 처리할때 속도면에서 도움을 줘 현대에서는 필수로 자리잡고 있는 것 같다.파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일시스템의 프리블록리스트를 통해 특정 파일을 지워도,파일 테이블의 헤더를 삭제하고 프리블록리스트에 추가하기때문에 사용했던 블록의 데이터는 그대로 남아있어서 복구가 가능하다.자료구조와 알고리즘지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬 : O(n^2)장점 : 구현이 간단하고, 코드가 직관적임단점 : 속도가 느리고, 비효율적임선택 정렬 : O(n^2)장점 : 메모리 사용이 적고, 자료 이동 횟수가 적음단점 : 속도가 느리고, 큰 데이터를 다룰 때 비효율적임삽입 정렬 : O(n^2)장점 : 거의 정렬된 데이터를 처리할 때 효율적임단점 : 데이터가 많을수록 성능이 떨어짐병합정렬 : O(nlogn)장점 : 성능이 지금까지 배운 정렬보다 좋음단점 : 재귀적인 기법을 이용해 이해와 구현이 어려움퀵정렬 : 새타(nlogn), O(n^2)장점 : 성능이 지금까지 배운 정렬보다 좋음단점 : 재귀적인 기법을 이용해 이해와 구현이 어려움 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.메모리가 부족한 시스템이라면 결과값을 그때 그때 계산해서 사용하는 메모이제이션을 택할 것 같다. 해시테이블을 이용해 속도도 올리고 계산결과값을 저장하는 장점도 있기 때문이다.
백엔드
2024. 10. 13.
1
[인프런 워밍업클럽 CS 2기] 2주차 발자국
학습기간1주차 2024-10-07(월) ~ 2024-10-11(금)강의 수강학습내용 요약운영체제섹션3. CPU 스케쥴링SJF(Shortest Job First)Burst Time이 짧은게 먼저 실행되면 평균 대기시간이 짧아지기 때문에 짧은 작업먼저 실행 RR(Round Robin)프로세스에게 일정시간을 할당하고 시간이 종료되면 남은작업은 큐의 맨뒤로 밀려나게됨 MLFQ(Multi Level Feedback Queue)MLFQ 는 가장 일반적으로 쓰이는 CPU 스케쥴링 기법으로, RR 알고리즘의 업그레이드 버전임 섹션4. 프로세스 동기화프로세스 간 통신 프로세스는 독립적으로 실행되기도 하지만 다른 프로세스와 데이터를 주고받으며 통신하기도 함 공유자원과 임계구역 프로세스가 통신할 때 공동으로 이용하는 변수나 파일 등 을 공유자원이라고 함 상호배제 메커니즘(세마포어) int semaphore(정수형 변수)세마포어를 사용하면 공유자원에 여러 프로세스가 동시에 접근하지 못하기때문에 동기화문제가 발생하지 않음 상호배제 메커니즘(모니터) 모니터는 세마포어의 단점을 해결한 상호배제 메커니즘이며, 운영체제가 처리하는것이 아니고, 프로그래밍 언어차원에서 지원하는 방법임 섹션5. 데드락데드락(교착상태) 여러 프로세스가 다른작업이 끝날때 까지 기다리다가 아무도 작업을 진행하지 못하는 상태교착상태의 필요조건 4가지 ⇒ 한가지라도 충족되지 않으면 교착상태가 발생하지않음 데드락 해결 - 교착상태 회피(Deadlock avoidance)프로세스에게 자원을 할당할 때 어느정도 자원을 할당해야 교착상태가 발생하는지 파악해서 교착상태가 발생하지 않는 수준의 자원을 할당하는 것 알고리즘 (Algorithm)섹션3재귀 (recursion) 어떠한 것을 정의할 때 자기 자신을 참조하는 것을 뜻함재귀함수는 자기 자신을 계속 호출하다가 특정 조건 (=기저조건(탈출조건)) 이 나오면 함수를 종료해야하므로 기저조건이 반드시 있어야 함 재귀적으로 생각하기하위문제의 결과를 기반으로 현재문제를 계산 버블 정렬 (Bubble Sort) 배열에서 앞과 뒤를 비교해 큰숫자를 뒤로 자리를 바꿈[ 4, 3, 2, 1] 가 있으면 [1, 2, 3, 4] 가 됨 선택 정렬 (Selection Sort) 배열의 정렬되지 않은 영역의 첫번째 원소를 시작으로 마지막 원소까지 비교 후 가장 작은 값을 첫번째 원소로 가져옴[6, 3, 4, 1, 2, 5] 가 있으면 [1, 2, 3, 4, 5, 6] 이 됨 학습내용 회고(칭찬, 아쉬움, 보완, 차주 목표 등)저번주보다 밀도있게 공부했다 .ᐟ2~3일에 걸쳐 하루 학습 목표량을 정해 정리하면서 들으니까 성취감도 있고 미션하기도 수월해졌다.그런데 알고리즘..재귀함수 하노이탑 코드구현부터 머리에 안들어오기 시작했다... ㅠㅠ(그래도 정렬은 머리에 들어옴)다음주는 스케쥴상 별일이 없다면 감자님이 짜주신대로 스케쥴을 진행해보면 어떨까 싶다. 미션해결과정 요약 (접근 관점, 해결 과정, 채택 이유)재귀함수를 만들어보는 미션은 재귀함수 이론들을때부터 "아 이건 미션으로 나오겠구나" 생각이 들었는데, 막상 미션으로 받아보니 구조는 알겠는데 쉽게 코드가 작성이 안됐다. 그래서 팩토리얼 코드를 가져와서 일단 함수명, 매개변수명을 바꾸고 조건을 미션에 맞게 변경해봤는데 코드가 작동이 안됐다. 결국 챗지피티 도움을 받아 코드를 수정했지만 초보에게는 이런 과정 (뼈대를 냅두고 살을 수정하는 과정)이 유의미했다고 생각한다. ㅎㅎㅎ미션 해결 회고그 외 미션들은 강의들으면서 내용을 정리했기 때문에 필요한내용만 복사해서 미션 답을 제출할 수 있었다. 굿 ~
백엔드
2024. 10. 13.
1
[인프런 워밍업클럽 CS 2기] 2주차 미션
운영체제FIFO 스케줄링의 장단점이 뭔가요?장점 : 스케쥴링 큐에 들어온 순서대로 CPU를 할당받아 처리할 수 있음, 단순하고 직관적임단점 : 먼저들어온 프로세스가 완전히 끝나야 다음프로세스를 실행할 수 있음, 실행시간이 짧은 프로세스라도 순서를 기다려야함, I/O작업이 있으면 CPU는 작업이 끝날때까지 쉬고있기 때문에 CPU사용률이 낮아짐, Burst Time에 따라 성능(평균대기시간)이 달라지기때문에 일반적으로 쓰이진않고 일괄처리 시스템에 쓰임 SJF를 사용하기 여러운 이유가 뭔가요?SJF는 Burst Time이 짧은게 먼저 실행되면 평균 대기시간이 짧아지기 때문에 짧은 작업먼저 실행되며, 이론적으로 FIFO 보다 성능이 좋으나, 구현시 아래 문제가 발생해 잘 사용되지 않음문제1. 어떤 프로세스가 얼마나 실행될지 예측이 힘듦문제2. Burst Time이 긴 프로세스는 뒤로밀려나 아주오랫동안 실행되지 않을수도 있음 RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?RR 스케쥴링은 컨택스트 스위칭이 일어나기때문에, 타임슬라이스가 아주 작으면 그만큼 컨택스트 스위칭 시간이 추가되기 때문에 오버헤드가 발생함 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?CPU를 사용하는 프로세스가 실행하다가 스스로 CPU사용을 반납하면 사용률이 적어 I/O Bound Process일 확률이 높고, 반대로 타임슬라이스 크기를 오버해서 CPU 스케줄러에 의해 CPU를 강제로 뺏기는 상황이면 CPU 사용이 많은것으로 CPU Bound Process일 확률이 높음 공유자원이란무엇인가요?프로세스가 통신할 때 공동으로 이용하는 변수나 파일 등 을 공유자원이라고 함 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?교착상태의 필요조건 4가지는 아래와 같으며, 한가지라도 충족되지 않으면 교착상태가 발생하지않음상호배제 (어떤 프로세스가 한 리소스를 점유했다면, 그 리소스는 다른 프로세스에게 공유가 되면 안됨)비선점 (프로세스 A가 리소스를 점유할 때, B는 리소스를 빼앗을 수 없어야함)점유와 대기 (프로세스가 리소스 A를 가지고 있는 상태에서 B를 원하는 상태여야함)원형 대기 (점유와 대기를 하는 프로세스의 관계가 원형을 이뤄야 함) 자료구조와 알고리즘재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?재귀함수는 자기자신을 참조하기때문에 기저조건을 만들지 않거나, 잘못 설정했을 때 콜스택에서 재귀함수가 계속쌓여 메모리 부족을 야기시킴 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.//0 ~ 입력n까지 홀수의 합을 더하는 재귀함수 구현하기 function sumOdd(n){ if (n
백엔드
2024. 10. 06.
1
[인프런 워밍업클럽 CS 2기] 1주차 발자국
프로그래밍 언어만 배우다가 자료구조, 알고리즘, CS 등등 알아야될게 많아서 엄두도 안나고근데 등장은 자주해서 머리가 아팠는데 인프런에서 스터디를 모집하길래 냅다 결제를 갈겼다 처음 3일까지는 열심히했는데 그 뒤로 주말, 약속 등등으로 벌써부터 풀어져서 지금 이시간에 발자국을 남기게 되었다 ㅋㅋㅋ가이드를 읽어보니 공부한 내용을 자세히 올리지말라그래서 목차로 대신하고(노션에는 따로 정리하면서 공부함)회고 위주로 적어보려 한다. 학습기간1주차 2024-09-30(월) ~ 2024-10-04(금)연휴가 많아서 띄엄띄엄 공부했다..; 헬스장에서 트레드밀 위에 아이패드 올려놓고 공부함 (의지 ㄷㄷ)강의 수강학습내용 요약알고리즘섹션1자료구조와 알고리즘 개요시간복잡도자바 스크립트 실행환경 구축섹션2배열연결리스트스택큐덱해시테이블셋6개의 자료구조를 배웠고, 각각의 정의와 추상자료형, 구현, 테스트를 통해 익혔다. 운영체제섹션1운영체제 개요, 역사, 구조컴퓨터 하드웨어와 구조, 부팅과정, 인터럽트 섹션2프로그램과 프로세스멀티 프로그래밍과 멀티프로세싱PCB프로세스 상태컨텍스트 스위칭프로세스 생성과 종료쓰레드섹션3CPU 스케쥴링 개요다중큐스케쥴링 목표FIFO운영체제의 전반적인 구조와 프로그램, 프로세스, 스레드, CPU 등을 집중적으로 개념학습했다.학습내용 회고(칭찬, 아쉬움, 보완, 차주 목표 등)잘한점 : 그렇게 많이 나오던 운영체제의 내용을 쭉 훑어서 뿌듯하다. 평소에 스택, 큐, 연결리스트, 해시테이블은 한번씩 유튜브를 통해 익혀서 내용 이해에 많은 도움이 되었다.아쉬운점 : 평소에 한번 본 내용+ 짧은 강의시간 이라서 너무 만만하게 봤다.보완 : 일단 강의 다 들어보고 시간을 배분하자 .ᐟ
백엔드
・
CS스터디-발자국
2024. 10. 06.
1
[인프런 워밍업클럽 CS 2기] 1주차 미션
운영체제폴링방식 성능향상1초마다 플레이어가 스킬을 사용했는지 체크하는 코드, 1초마다 체크하기 때문에 성능에 좋지않다. 이를 해결하기 위한 방식으로 어떤걸 이용해야 하는지?while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 } 해당 코드는 주기적으로 cpu를 동작시키는 폴링 방식으로, 비동기적으로 작동하는 인터럽트 방식을 통해 플레이어가 스킬을 사용했을때 cpu에게 신호를 주는 인터럽트 서비스 루틴(ISR)을 실행시켜 작업을 완료해야 한다.프로그램과 프로세스가 어떻게 다른가요?프로그램은 컴퓨터의 관점에서 저장장치만 사용하는 수동적인 존재이고, 프로세스는 메모리도 사용하고 운영체제의 CPU 스케쥴링 알고리즘에 따라서 CPU도 사용하고, 필요에 따라 입출력도 하기때문에 능동적인 존재이다.멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?둘 다 여러개를 처리하는것은 동일하나, 멀티프로그래밍은 메모리의 관점에서 메모리에 여러개의 프로세스가 올라온 것이고, 멀티프로세싱은 CPU의 관점에서 여러개의 프로세서를 처리하는 것을 말한다.운영체제는 프로세스를 관리하기 위해서 어떤것을 사용하나요?운영체제는 CPU를 통해 프로세스를 관리하기 위해 프로세스마다 PCB(Process Control Block) 에 여러 정보를 저장해 관리한다. PCB는 연결리스트로 구성되어 있으며, 운영체제는 프로세스가 종료되면 연결리스트에서 해당 프로세스의 PCB를 제거한다.컨텍스트 스위칭이란 뭔가요?운영체제에서 CPU를 통해 프로세스(A)를 실행하는 중에, 다른 프로세스(B)를 실행하기 위해 실행중인 프로세스(A)의 상태를 저장하고 다른프로세스(B)의 상태값(PCB)으로 교체하는 작업을 말한다. 자료구조와 알고리즘여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다. 이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤걸 선택하실 건가요? 이유를 함께 적어주세요. 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램은 덱(deque)의 자료구조를 선택한다. 학생은 전학, 전입, 자퇴 등의 이유와 1년이 지나면 교실에 새로운 학생들이 오기 때문에 덱을 이용해 수정이 편리한 프로그램으로 작성한다. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.순서대로 주문을 처리하는 프로그램에는 큐(queue)의 자료구조를 선택한다. 큐는 FIFO의 규칙을 가진 자료구조로, 순서대로 처리하기 위해 tail을 추가하고 양방향 연결리스트로 구현하면 된다.
백엔드
・
CS스터디-미션