Java Day23

YDC·2025년 7월 31일

우테코8기

목록 보기
23/23

Day22 복습

해시테이블이란

대부분의 프로그래밍 언어는 해시 테이블이라는 자료 구조를 포함하며, 해시 테이블에는 빠른 읽기라는게 있음
해시 테이블은 다양한 프로그래밍 언어로서 서로 다른 이름으로 불림 해시, 맵, 해시맵, 딕셔너리, 연관 배열 등
해시 테이블은 쌍으로 이뤄진 값들의 리스트임 첫 번째 항목을 키라 부르고 두번 째 항목을 값이라고 부름
Menu = { “French fries” => 0.75} French fries 가 키 고 0.75가 값임
해시 테이블의 값 룩업은 딱 한단계만 걸리므로 평균적으로 효율성이 O(1)임

해싱

문자를 가져와 숫자로 변환하는 이러한 과정을 해싱이라고 부름
글자를 특정 숫자로 변환하는데 사용한 코드를 해시 함수라고 부름

해시테이블 예시 유의어 사전

Thesaurus{"bad”} = “evil”
코드로 표현하면 해시 테이블은 {“bad”=“evil”}이렇게 됨
Bad 는 214 =8로 해싱되고 컴퓨터는 셀8에 evil을 집어 넣음
반대로 bad의 값을 룩업하다고 하면 bad = 8 셀8을 찾아서 저장된 값을 반환함
컴퓨터는 룩업하고 있는 키를 해싱해서 해당하는 값을 얻고 그 값에 해당하는 셀로 바로가기때문에 O(1)의 효율성을 가짐
배열에서 메뉴 항목의 값을 룩업하려면 항목을 찾을 때까지 값을 순회하면 검색해야했음
정렬되지 않은 배열에서는 최대 O(N) 정렬된 배열에서는 최대 O(logN)이걸리나 해시 테이블을 사용하면 O(1)만에 할 수 있음

충돌 해결

하지만 해시 테이블에도 문제가 있음 bad 와 dab이 있다면 같이 해싱이 8로 됨 이러면 충돌이 일어남
지를 해결 하는 방법 중 하나가 분리 연결 법임 충돌이 발생했을때 셀에 하나의 값을 넣는 대신 배열로의 참조를 넣는 방법임
셀8에 evil이 들어있는데 dab pat을 추가하면 셀 8에는 bad evil , dab pet이라는 배열이 들어가기됨
여기로 dab를 룩업하면 컴퓨터는 해당 키를 해싱하고 셀8을 룩업함
그안에서 인덱스 0을 찾아보고 룩업하고있는 dab이 있는지 배열을 차래대로 검색함
위와같이 모든 데이터가 해시 테이블의 한셀에 들어가게 된다면 해시테이블은 배열보다 나은게 없음
따라서 최악의 경우 해시테이블의 룩업 성능은 O(N)임 이렇기 때문에 해시 테이블에 충돌이 거의 없도록 디자인 해야함

충돌조정

해시 테이블은 해시테이블에 얼마나 데이터를 저장하는지 얼마나 많은 셀을 쓸 수 있는지 어떤 해시함수를 사용하는지에 따라 효율성이 정해짐
좋은 해시 함수란 사용 가능한 모든 셀에 데이터를 분산시고 많은 메모리를 낭비하지 않으면서 균형을 유지하면서 충돌을 피해야함
충돌 조정을 위해 컴퓨터 과학자는 규칙을 세웠음 제장된 데이터가 7개면 셀이 10개여한다 등 데이터와 셀 간 이러한 비율을 부하율이라고함

Spring Framework란?

Javar기반의 애플리케이션 프레임 워크로 엔터 프라이즈급 애플리케이션을 개발하기 위한 다양한 기능을 제공함

1.제어역전

자바는 사용하려는 객체를 선언하고 해당 객체의 의존성을 생성한 후 객체에서 제공하는 기능을 하용함
객체를 생성하고 사용하는 일련의 작업을 개발자가 직접 제어하는 구조이나 스프링은 제어역전의 특징으로 개발 방식이 다름

사용할 객체를 직접 생산하지 않고 객체의 생명주기 관리를 외부에 위임함 여기서 외부는 스프링 컨테이너 또는 IoC컨테이너를 의미함

객체의 관리를 컨테이너에게 맡겨 제어권이 넘어간 것을 제어 역전이라고 부르고 제어역전을통해 의존성 주입(DI) 관점지향 프로그래밍(AOP)등이 가능해짐

2.의존성 주입

의존성주입(DI)란이란 제어 역전의 방법중 하나로 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식을 의미함
스프링에서 의존성을 주입받는 방법츤 세 가지가 있음
1.생성자를 통한 의존성 주입
2.필드 객체 선언을 통한 의존성 주입
Setter 메서드를 통한 의존성 주입

@Autowired라는 어노테이션을 통해 의존성을 주입할 수도 있음

스프링에서 권장하는 의존성 주입 방법은 생성자를 통해 의존성을 주입받는 방식임
다른 방식과는 다르게 생성자를 통해 의존성을 주입받는 방식은 레퍼런스 객체 없이 객체를 초기화 할 수 없기 때문에

3.관점 지향 프로그래밍(AOP)

AOP관점 지향 프로그래밍은 OOP를 더 잘 사용하도록 돕는 개념임
AOP는 관점을 기준으로 묶어 개발하는 방식을 의미함

OOP방식의 애플리케이션 로직은 객체마다 핵심 기능을 수행하기 위한 로직과 함께 부가 기능인 로깅 트랜잭션 등의 코드를 작성함
유지보수 목적이나 데이터 베이스 접근을 위해 작성된 로깅과 트랜잭션 영역은 같은 기능을 수행할 확률이 높음
즉 핵심 기능을 구현한 두 로직에 동일한 코드가 포함된다는걸 의미함

AOP의 관점에서 부가기능은 핵심기능이 어떤 기능인지 무관하게 로직이 수행되기 전 또는 후에 수행되기만 하면 됨
비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식을 AOP라고 함

AOP를 구현 하는 방법은 크게 세 가지가 있음

1.컴파일 과정에서 삽입 하는 방식
2.바이트코드를 메모리에 로드하는 과정에 삽입하는 방식
3.프락시 패턴을 이용하는 방식

스프링은 디자인 패턴중 하나인 프락시 패턴을 통해 AOP기능을 제공하고 있음

AOP의 목적은 OOP와 마찬가지로 모듈화를 해서 재사용 가능한 구성을 만드는 것이고
모듈화 된 객체를 편하게 적용할 수 있게 함으로써 개발자가 비즈니스 로직을 구현하는 데만 집중하게 해줌

스프링 부트는 spring-boot-starter-web모듈을 사용하면 기본적으로 톰캣을 사용하는 스프링MVC구조를 기반으로 동작함

서블릿은 클라이언트의 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술임
일반적으로 서블릿은 서블릿 컨테이너에서 관리하는데 서블릿 컨테이너는 서블릿 인스턴스를 생성하고 관리하는 역할을 수행하는 주체임
톰캣은 WAS의 역할과 서블릿 컨테이너의 역할을 수행하는 대표적인 컨테이너임
스프링에서는 DispatcherServlet이 서블릿의 역할을 수행함
Dispatchseblet의 동작은 요청이 들어오면 핸들러 매핑을 통해 요청 URI에 매핑된 핸들러를 탐색하고 핸들러 어댑터로 컨트롤러를 호출함
컨트롤러의 응답이 돌아오면 ModelAndView로 응답을 가공해서 반환함 뷰형식으로 리턴하는 컨트롤러를 사용할 때는 뷰 리졸버를 통한 뷰를 받아 리턴함

핸들러 매핑은 요청 정보를 기준으로 어떤 컨트롤러를 사용할지 선텅하는 인터페이스임 핸들러 매핑 인터페이스는 여러구현체를 가짐
예시
BeanNameUrlHandlerMapping
빈 이름을 URL로 사용할때 사용하는 매핑 전략
빈을 정의할때 슬래시가 들어가면 매핑 대상이 됨
@Bean(“/hello”)

ControllerClassNameHandlerMapping
URL과 일치하는 클래스 이름을 갖는 빈을 컨트롤러로 사용하는 전략
이름중 Controller를 제외하고 앞부분에 작성된 sulfix를 소문자로 매핑함

SimpleUrlHandlerMapping
URL패턴에 매핑된 컨트롤러를 사용하는 전략

DefaultAnnotationHandlerMapping
어노테이션으로 URL과 컨트롤러를 매핑하는 방법

스프링 레이어드 아키텍처 구성

프레젠테이션 계층

상황에 따라 유저 인터페이스 계층이라고도 함
클라이언트와 접점이 됨
클라이언트로부터 데이터와 함께 요청을 받고 처리 결과를 응답으로 전달하는 역할을 함

비즈니스 계층

상황에따라 서비스 계층이라고도 함
핵심 비즈니스 로직을 구현함
트랜잭션 처리나 유효성 검사 등의 작업도 수행함

데이터 접근 계층

상황에 따라 영속 계층이라고도 함
데이터 베이스에 접근하는 작업을 수행함

디자인 패턴

소프트웨어를 설계할 때 자주 발생하는 문제들을 해결하기 위해 고안된 해결책임
애플리케이션 개발에서 발생하는 문제는 유사한 경우가 많고 해결책도 동일하게 적용할 수 있기때문에 패턴이라고함
그러나 디자인 패턴이 모든 문제의 정답은 아니고 상황에 맞는 최적의 패턴을 결정해서 사용하는 것이 바람직 함

생성 패턴

추상 : 팩토리 구체적인 클래스를 지정하지 않고 상황에 맞는 객체를 생성하기 위한 인터페이스를 제공하는 패턴
빌더 :객체의 생성과 표현을 분리해 객체를 생성하는 패턴
팩토리 : 메서드 객체 생성을 서브클래스로 분리해서 위임하는 패턴
프로토타입 :원본 객체를 복사해 객체를 생상하는 패턴
싱글톤 : 한 클래스마다 인스턴스를 하나만 생성해서 인스턴스가 하나임을 보장하고 어느 곳에서도 접근할 수 있게 제공하는 패턴

구조패턴

어댑터 : 클래스의 인터페이스를 의도하는 인터페이스로 변환하는 패턴
브리지 : 추상화와 구현을 분리해서 각각 독립적으로 변형캐 하는 패턴
컴포지트 :여러 객체로 구성된 복합 객체와 단일 객체를 클라이언트에서 구별 없이 다루는 패턴
데코레이터 : 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 하는 패턴
퍼시드 : 서브시스템의 인터페이스 집합들에 하나의 통합된 인터페이스를 제공하는 패턴
플라이웨이트 : 특정 클래스의 인스턴스 한 개를 가지고 여러 개의 가상 인스턴스를 제공할 때 사용하는 패턴
프락시 : 특정 객체를 직접 참조하지 않고 해당 객체를 대행(프락시)하는 객체를 통해 접근하는 패턴

행위패턴

책임 연쇄 :요청 처리 객체를 집합으로 만들어 결합을 느슨하게 만드는 패턴
커맨드 :실행될 기능을 캡슐화해서 주어진 여러 기능을 실행하도록 클래스를 설계하는 패턴
인터프리터 : 주어진 언어의 문법을 위한 표현 수단을 정의하고 해당 언어로 구성된 문장을 해석하는 패턴
이터레이터 :내부 구조를 노출하지 않으면서 해당 객체의 집합 원소에 순차적으로 접근하는 방법을 제공하는 패턴
미디에이터 : 객체의 상태 정보를 저장하고 필요에 따라 상태를 복원하는 패턴
메멘토 : 객체의 상태 정보를 저장하고 필요에 따라 생태를 복원하는 패턴
옵저버 :객체의 상태 변화를 관챃라는 관찰자들 즉 옵저버 목록을 객체에 등록해 상태가 변할 때마다 메서드 등을 통해 객체가 직접 옵저버에게 통지하게하는 패턴
스테이트 : 상태에 따라 객체가 행동을 변경하게 하는 패턴
스트래티지 : 행동을 클래스로 캡슐화해서 동적으로 행동을 바꿀 수 있게 하는 패턴
템플릿 : 메서드 일정 작업을 처리하는 부분을 서브클래스로 캡슐화해서 전체 수행 구조는 바꾸지 않으면서 특정 단계만 변경해서 수행하는 패턴
비지터 : 실제 로직을 가지고 있는 객체가 로직을 적용할 객체를 방문하면 실행하는 패턴

REST API

애플리케이션에서 제공하는 인터페이스를 의미함 API를 통해 서버 또는 프로그램 사이를 연결할 수 있음 REST API는 REST 아키텍처를 따르는 시스템 애플리케이션 인테페이스임

REST의 특징

유니폼 인터페이스
일관된 인터페이스를 의미 REST 표준 서버는 HTTP 표준 정송 규약을 따르기 때문에 어떤 프로그래밍 언어로 만들어졌느냐와 상관 없이 플랫폼 및 기술에 종속되지 않고
타 언어 플랫폼 기술 등과 호환해 사용할 수 있다는 것을 의미함

무상태성

REST는 무상태성이라는 특징을 가짐 무상태성이란 서버에 상태 정보를 따로 보관하거나 관리하지 않는다는 의미
서버 클라이언트가 보낸 요청에 대해 세션이나 쿠키 정보를 별도 보관하지 않음 그렇기 대문에 한 클라이언트가 여러 요청을 보내든 여러 클라이언트가 하나의 요청을보내든
개별적으로 처리함 서버가 불필요한 정보를 관리하지 않으므로 비즈니스 로직의 자유도가 높고 설계가 단순함

캐시 가능성

REST는 HTTP 표준을 그대로 사용하므로 HTTP의 캐싱 기능을 적용할 수 있음 이 기능을 이용하기 위해서는 응답과 요청이 모두 캐싱 가능한지 명시가 필요하며
캐싱이 가능한 경우 클라이언트에서 캐시에 저장해두고 같은 요청에 대해서는 해당 데이터를 가져다 사용함
서버의 트랜잭션 부하가 줄어 효율적이고 사용자 입장에서 성능이 개선됨

레이어 시스템

REST 서버는 네트워크 상의 여러 계층으로 구성될 수 있음 그러나 서버의 복잡도와 관계없이 클라이언트는 서버와 연결되는 포인트만 알면 됨

클라이언트 - 서버 아키텍쳐

REST서버는 API를 제공하고 클라이언트는 사용자 정보를 관리하는 구조로 분리해 설계함 이구성은 서로에 대한 의존성을 낮추는 기능을 함

REST URI 설계 규칙

URI 규칙
URI의 마지막에는 /를 포함하지 않음
언더바(_)는 사용하지 않고 -하이픈을 사용함
URL에는 행위가 아닌 결과를 포함함
URI는 소문자로 작성해야함
파일확장자는 URI에 포함하지 않음

학습 목표

백준 3문제

  • 2941 크로아티아 알파벳
  • 1315 그룹 단어 체커
  • 25206 너의 평점은

CS

  • 누구나 자료구조와 알고리즘 8강

JAVA(Spring)

  • 스프링부트 핵심가이드 5강 + GIt hub 레포지트리 만들기

1.백준 3문제

1.2941 크로아티아 알파벳

문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
크로아티아 알파벳 변경
č c=
ć c-
dž dz=
đ d-
lj lj
nj nj
š s=
ž z=
예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.
입력
첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.
단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.
출력
입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

예제 입력 1 

ljes=njak

예제 출력 1 

6

예제 입력 2 

ddz=z=

예제 출력 2 

3

예제 입력 3 

nljj

예제 출력 3 

3

예제 입력 4 

c=c=

예제 출력 4 

2

예제 입력 5 

dz=ak

예제 출력 5 

3

풀이

package advance;
import java.util.Scanner;

public class BOJ_2941_CAlphabet {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String[] cap = {"c=","c-","dz=","d-","lj","nj","s=","z="};
        String ap = sc.nextLine();
        for(String ch:cap){
            ap = ap.replace(ch,"*");
        }
        System.out.println(ap.length());
    }
}

입력을 재배치해서 갯수를 세는 아이디어가 필요했던 문제

2.1316그룹 단어 체커

문제

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.

출력

첫째 줄에 그룹 단어의 개수를 출력한다.

예제 입력 1 

3
happy
new
year

예제 출력 1 

3

예제 입력 2 

4
aba
abab
abcabc
a

예제 출력 2 

1

예제 입력 3 

5
ab
aa
aca
ba
bb

예제 출력 3 

4

예제 입력 4 

2
yzyzy
zyzyz

예제 출력 4 

0

예제 입력 5 

1
z

예제 출력 5 

1

예제 입력 6 

9
aaa
aaazbz
babb
aazz
azbz
aabbaa
abacc
aba
zzaz

예제 출력 6 

2

풀이

package advance;
import java.util.Scanner;
public class BOJ_1316_GroupWordChecker {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int score=0;
        for(int i =0;i<n;i++){
           String a = sc.next();
           boolean[] visited = new boolean[26];
           boolean isGroup = true;

           char prev = 0;

           for(int j =0;j<a.length();j++){
               char current = a.charAt(j);

               if(current!=prev){
                   if(visited[current-'a']){
                       isGroup = false;
                       break;
                   }
                   visited[current-'a'] = true;
               }
               prev = current;
           }
            if(isGroup){
                score++;
            }
        }
        System.out.println(score);
    }
}

배열을 만들어서 위치를 기억하는 로직을 만드는게 어려웠던 문제

3.25206 너의 평점은

문제

인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다!
치훈이의 전공평점을 계산해주는 프로그램을 작성해보자.
전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.
인하대학교 컴퓨터공학과의 등급에 따른 과목평점은 다음 표와 같다.
A+ 4.5
A0 4.0
B+ 3.5
B0 3.0
C+ 2.5
C0 2.0
D+ 1.5
D0 1.0
F 0.0
P/F 과목의 경우 등급이 P또는 F로 표시되는데, 등급이 P인 과목은 계산에서 제외해야 한다.
과연 치훈이는 무사히 졸업할 수 있을까?
입력
20줄에 걸쳐 치훈이가 수강한 전공과목의 과목명, 학점, 등급이 공백으로 구분되어 주어진다.
출력
치훈이의 전공평점을 출력한다.
정답과의 절대오차 또는 상대오차가 (10^{-4}) 이하이면 정답으로 인정한다.
제한

  • 1 ≤ 과목명의 길이 ≤ 50
  • 과목명은 알파벳 대소문자 또는 숫자로만 이루어져 있으며, 띄어쓰기 없이 주어진다. 입력으로 주어지는 모든 과목명은 서로 다르다.
  • 학점은 1.0,2.0,3.0,4.0중 하나이다.
  • 등급은 A+,A0,B+,B0,C+,C0,D+,D0,F,P중 하나이다.
  • 적어도 한 과목은 등급이 P가 아님이 보장된다.

예제 입력 1 

ObjectOrientedProgramming1 3.0 A+
IntroductiontoComputerEngineering 3.0 A+
ObjectOrientedProgramming2 3.0 A0
CreativeComputerEngineeringDesign 3.0 A+
AssemblyLanguage 3.0 A+
InternetProgramming 3.0 B0
ApplicationProgramminginJava 3.0 A0
SystemProgramming 3.0 B0
OperatingSystem 3.0 B0
WirelessCommunicationsandNetworking 3.0 C+
LogicCircuits 3.0 B0
DataStructure 4.0 A+
MicroprocessorApplication 3.0 B+
EmbeddedSoftware 3.0 C0
ComputerSecurity 3.0 D+
Database 3.0 C+
Algorithm 3.0 B0
CapstoneDesigninCSE 3.0 B+
CompilerDesign 3.0 D0
ProblemSolving 4.0 P

예제 출력 1 

3.284483

예제 입력 2 

BruteForce 3.0 F
Greedy 1.0 F
DivideandConquer 2.0 F
DynamicProgramming 3.0 F
DepthFirstSearch 4.0 F
BreadthFirstSearch 3.0 F
ShortestPath 4.0 F
DisjointSet 2.0 F
MinimumSpanningTree 2.0 F
TopologicalSorting 1.0 F
LeastCommonAncestor 2.0 F
SegmentTree 4.0 F
EulerTourTechnique 3.0 F
StronglyConnectedComponent 2.0 F
BipartiteMatching 2.0 F
MaximumFlowProblem 3.0 F
SuffixArray 1.0 F
HeavyLightDecomposition 4.0 F
CentroidDecomposition 3.0 F

풀이

import java.util;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        double totalScore = 0.0;
        double totalCredit = 0.0;
        
        Map<String,Double>gradeMap = new HashMap<>();
        gradeMap.put("A+",4.5);
        gradeMap.put("A0",4.0);
        gradeMap.put("B+",3.5);
        gradeMap.put("B0",3.0);
        gradeMap.put("C+",2.5);
        gradeMap.put("C0",2.0);
        gradeMap.put("D+",1.5);
        gradeMap.put("D0",1.0);
        gradeMap.put("F",0.0);
        
        for(int i=0; i<20;i++){
            String subject = sc.next();
            double credit = sc.nextDouble();
            String grade = sc.next();
            
            if(grade.equals("P"))continue;
            
            totalScore+= credit*gradeMap.get(grade);
            totalCredit+=credit;
    
        }
        System.out.println(totalScore/totalCredit);
    }
}

Map 또는 if else를 사용해서 등급에 따른 학점을 넣어주는 문제

2.CS

1.누구나 자료구조와 알고리즘 8강 스택과 큐로 간결한 코드 생성

스택

스택이 데이터를 저장하는 방법은 배열과 같으나 3가지 제약이 있음
데이터는 스택의 끝에만 삽입할 수 있음
데이터는 스택의 끝에서만 읽을 수 있음
데이터는 스택의 끝에서만 삭제할 수 있음
스택의 끝을 위(top) 스택의 시작을 밑(bottom)이라고 부름

스택의 동작

스택에 새값을 집어 넣는걸 스택에 푸시한다고 함
배열 끝에 데이터를 삽입함 중간이나 처음에 삽입하는건 불가능함
스택의 위(끝에서부터)원소를 제거하는걸 스택에서 팝한다고 함
맨 나중에 넣은게 맨 먼저 제거되고 제일 처음 넣은게 제일 나중에 제거됨
이런한 연산을 LIFO Last In First Out 이라고 표현함

스택과 같이 임시데이터를 다루며 제약이 있는 배열이나
스택과 다르게 처음으로 추가된 항목이 가장 먼저 제거됨
FIFO First In First Out
마찬가지로 3가지 제약기 있음
데이터는 큐의 끝에만 삽입 할 수 있다 ==stack
데이터는 큐의 앞에서만 읽을 수 있다 != stack
데이터는 큐의 앞에서만 삭제할 수 있다 != stack

큐의 동작

큐의 삽입은 스택과 같이 끝에 삽입되나
삭제는 맨처음 원소부터 제거됨

큐는 요청받은 순서대로 요청을 처리하므로 비동기식 요청을 처리하는 완벽한 도구임

3.JAVA(Spring)

1.GET API 만들기

컨트롤러 클래스에 RestController 와 @RequestMapping설정

@RestController
@RequestMapping(“api/v1/get-api”)
Public class GetController{

}

@RequestMapping 구현하기

@RequestMapping 어노테이션을 별다른 설정을 하지 않으면 HTTP의 모든 요청을 받음
GET API 만들기기 때문에 GET 메소드의 요청만 받기위해 설정

package com.springboot.api.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {

    //http://localhost:8080/api/v1/get-api/hello
    @RequestMapping(value = "/hello",method =RequestMethod.GET)
    public String getHello(){
        return "Hello World";
    }
}

그러나 스프링4.3버전 이후로 새로 나온 어노테이션을 사용하기 때문에 @RequestMapping 어노테이션은 더이상 사용되지 않음
이제는 @GetMapping @PostMapping @PutMapping @DeleteMapping

매개변수 없는 GET메서드 구현

package com.springboot.api.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GetController {

    @GetMapping("/api/v1/get-api/name")
    public String getName() {
        return "Flature";
    }
}

실무 환경에서는 매개변수를 받지 않는 메서드가 거의 쓰이지 않음
웹 통신의 기본 목적은 데이터를 주고받는것이기 때문에 대부분 매개변수를 받는 메서드를 작성하게됨
매개변수를 받을 때 자주 쓰이는 방법중 하나가 URL자체에 값을 담아 요청하는것임

이러한 방식으로 코드를 작성할때는 정해야될 규칙들이 있음
@GetMapping 어노테이션 값으로 URL을 입력할때 중괄호를 사용해 어느 위치에서 값을 받을지 지정해야함
메서드의 매개변수와 그 값을 연결하기 위해 @PathVariable을명시하여 @GetMapping어노테이션과@PathVariable에 지정된 변수의 이름을 동일하게 맞춰야함

@Path Variable을 활용한 GET 메서드 구현

package com.springboot.api.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GetController {

    @GetMapping("/api/v1/get-api/variable1/{variable}")
    public String getVariable1(@PathVariable String variable) {
        return variable;
    }
}
profile
초심자

0개의 댓글