일단 씻고 나가자
23.03.14 본문
2023. 03. 14 화요일
- [Java] Queue 클래스 객체 생성법? 주요 함수?
: Queue는 인터페이스이므로, 직접 객체를 만들 순 없으나 (만들려면 내부의 추상 메서드를 모두 override 해야 함.) LinekedList로 업캐스팅하여 쉽게 만들 수 있다.
Queue queue = new LinkedList();
add()/ poll()/ peek()/ contains(value)/ size()/ isEmpty()/ clear()
Queue는 Stack과 조금 다르게 clear 상태에서 poll을 하면 null을 반환한다.
- ArrayList와 LinkedList의 차이?
: ArrayList는 특정 인덱스에 삽입/삭제 시에 해당 인덱스 이후 모든 인덱스를 한 칸씩 미루거나 당겨서 List를 조절한다.
LinkedList는 객체가 이전, 이후로 연결된 객체의 주소를 가지고 있기에 삽입/삭제 시 이전, 이후 객체의 주소만 연결해주면 된다.
따라서 삽입/삭제의 기능에는 LinkedList가 빠르지만 단방향성과 순차접근이기에 자료를 검색하는 데에는 속도가 느리지만,
참조의 지역성(locality of reference) 덕에 검색의 기능에는 ArrayList가 무작위 접근으로 빠르며 삽입/삭제의 기능에서는 속도가 저하된다.
- 오름차순으로 정렬된 배열을, 다른 배열을 사용하지 않고 같은 배열에서 중복하지 않는 값으로 하나씩 오름차순 정렬하는 아이디어?
: for문으로 배열의 처음부터 도는 I 인덱스 변수와 하나의 index 인덱스 변수를 더 만들고,
I 위치의 값이 index 위치의 값과 다르다면 index의 다음 위치에 해당 값을 넣고 index++.
- [Java] 배열을 특정 인덱스만큼 자르는 방법?
: int[] output = Arrays.copyOfRange(int[], 시작 인덱스, 끝 인덱스+1);
- n 사이즈의 배열에서 1~n까지 한 개, 혹은 두 개 들어 있다고 가정할 때 두 개가 들어 있는 숫자를 판별하는 방법?
: 배열의 사이즈까지의 숫자이므로 n-1은 절대 배열 크기를 넘지 않는다. 따라서 각 배열의 칸에 있는 숫자-1 을 인덱스로 사용해서 for문에서 순차 접근하다 보면 같은 숫자가 있는 곳은 같은 인덱스를 가리킬 수밖에 없다.
(ex. [3, 1, 3]의 배열이라면 첫 번째 3부터 시작. 3은 3-1 = 2 인덱스를 가리키고 있고, 두 번째 3 또한 2 인덱스를 가리킨다.)
따라서 한 번 접근한 위치의 값을 음수로 바꾸고, (그 값을 인덱스로 쓸 때는 절댓값 활용) 나중에 돌다가 또 접근했을 때 해당 값이 음수라면 그 인덱스 +1 값은 두 번 있는 꼴이 된다.
- 최대 공약수, 최소 공배수를 구하는 방법? 유클리드 호제법?
: 최대 공약수는 1부터 해당 두 숫자보다 작은 숫자까지 돌며 두 숫자가 동시에 %index==0이 되는 가장 큰 값이다.
최소 공배수는 두 수의 곱에 최대 공약수를 나눈 값이다.
유클리드 호제법은 두 수의 최대 공약수를 구하는 방법으로,
A, B 두 수 중 큰 수를 작은 수로 나누고,
다시 나눈 수에 나머지를 나누는 걸 반복하다가 마지막 계산에서 ‘나눈 값’을 최대 공약수로 계산하는 방법이다.
즉, [A % B = C] 이라면
[B % C = D], [C % D = E] ... [A’ % B’] = 0일 때 B’의 값이다.
- 스프링의 컨트롤러란? 스프링 빈?
: @Controller 어노테이션을 쓰며, 해당 클래스는 스프링이 실행될 때 스프링 컨트롤러에서 해당 클래스의 객체를 생성하고 메모리에 넣어 관리한다.
이것을 스프링 컨테이너에서 스프링 빈이 관리된다고 한다.
해당 그림에서의 스프링 컨테이너 안에 들어 있는 모양새이다.
그래서 스프링에 관련된 컨트롤러 기능들이 동작하는 것이다.
- 의존관계를 위한 스프링의 구성 방식? 해당 어노테이션?
: 컨트롤러로 선언된 클래스는 스프링 시작 후 자동으로 객체 생성이 되어 관리하기 때문에, 공용 서비스나 자원 등을 해당 컨트롤러 생성자 내부에 만들어 다른 클래스들이 받아서 쓰게 만들면 된다. 이를 스프링 컨테이너에 등록한다고 하며, 딱 하나만 등록이 된다. 추가로 부가 기능을 받을 수 있다.
@Autowired 어노테이션의 기능은 해당 생성자의 생성 시에, 매개 변수로 받은 객체를 받아 연결한다. 해당 어노테이션을 통해 연결하기 위해선 service의 클래스에 @Service를, repository의 클래스에 @Repository 어노테이션을 걸어두면 된다. 이 세 가지는 정형화된 패턴이고, 해당 어노테이션을 통해 스프링이 컨테이너에 자동으로 올려준다. 세 어노테이션이 있는 클래스를 먼저 실행하면서 스프링이 해당 매개변수에 있는 클래스에 대해 필요하네?하고 객체를 생성하고 넣어둔다는 뜻.
즉, 컨트롤러에서 외부 요청 받고, 서비스에서 비즈니스 로직을 만들고, 리포지토리에서 데이터를 저장한다. 이런 어노테이션이 없으면 해당 클래스는 그냥 순수한 자바 클래스이기 때문에 스프링이 알 방법이 없다. 이렇게 스프링이 넣어주는 것을 의존관계, 즉 Dependency Injection이라 한다. 이렇게 컨테이너에 등록된 스프링 빈은 싱글톤(하나만 등록해서 공유)이며, 해당 빈을 호출하는 모든 메서드에 하나의 객체만 돌아가며 제공한다.
- 스프링 빈을 등록하는 2가지 방법?
1. 컴포넌트 스캔과 자동 의존관계 설정
: 원래의 어노테이션은 @Component를 사용하여 선언해야 하지만, 컴포넌트 어노테이션의 특수한 경우인 Service 등을 사용하여 등록할 수 있음. 스프링은 컴포넌트 관련 어노테이션의 클래스를 모두 스프링 빈으로 자동 등록하여 담고 시작하며, 해당 방식과 생성자의 @Autowired로 묶은 것이 해당 방법. (얻는 이점이 많음) 컴포넌트 스캔은 또한 main 메서드가 존재하는 패키지의 하위 클래스들은 모두 등록한다. 따라서 다른 패키지에 쌩뚱맞은 클래스에 어노테이션을 넣는다고 실행 되는 것이 아니다.
2. 자바 코드로 직접 스프링 빈 직접 등록.
- git에서 해당 명령어에 대한 도움말을 주는 명령어와, add를 하지 않고 commit하는 방법?
: [git 명령어 –help]를 입력하면 명령어 관련 매뉴얼 홈페이지를 띄워준다.
[git commit –a] 하면 수정된 파일을 모두 add하고, 바로 commit 창으로 띄워준다.
추가적으로 m은 뒤의 메시지를 commit 메시지로 등록한다는 명령어인데,
git commit –am “message”라고 쓰면 에디터로 들어가지 않고 바로 commit 할 수 있다.