TIL(20240618) [Spring:@Component와 @Autowired, 알고리즘:조합]
📌 Spring
팀 프로젝트에 들어가기 앞서서, 스프링 빈 등록에 대해 복습을 하고 넘어가려고 한다. 아직 개념정리가 확실히 되어있지 않다고 느껴서 이 부분을 정확하게 이해하고 넘어가기 위함이다!
💡 스프링 빈을 등록하는 방법
- 컴포넌트 스캔(@Component)과 자동 의존관계(@Autowired) 설정
@Component 컴포넌트 스캔
Component 애너테이션이 붙은 것들은 객체로 생성하여 스프링컨테이너에 등록한다. 즉, 스프링 빈으로 자동등록된다.
그럼 controller나 serivce, repository는 어떻게 해서 스프링 빈으로 자동등록 되는가?
3 layer 는 interface이고 셋다 @Component 애너테이션을 가지고 있기 때문에 자동으로 빈등록이 되는것!
@Autowired
- 연관관계 설정!
- ex) controller-service-repository 연결시켜준다.
여기서 주의할 점은 com.sparta.reviewspotproject 패키지 안에서만 컴포넌트 스캔이 가능하다.
그 이유는?
해당 패키지 아래에 보면 어플리케이션이 있는데,
어플리케이션 안에 @ComponentScan이 있기 때문에 패키지 내에서 @Controller 애너테이션을 달아주면 어플리케이션에서 자동으로 컴포넌트 스캔을 해서 자동으로 빈을 등록해주게 되는 것이다. 그러니까 com.sparta.reivewspotproject가 아닌 다른 패키지에서 클래스를 만들어 @Controller 애너테이션을 달아줘도 스프링컨테이너에 빈을 등록해주지 못하게 되는것이다. (=찾지를 못한다.)
참고사항
- 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다. 즉, 하나만 등록해서 공유한다라는 의미이다. 따라서 같은 스프링 빈이면 모두 같은 인스턴스이다. 싱글톤이 아니게 설정은 할 수 있지만 특별한 경우가 아니면 대부분 싱글톤을 사용한다고 한다.
1
2
3
4
5
6
7
싱글톤(Singleton)?
- 특정 클래스의 인스턴스를 1개만 생성되는 것을 보장하는 디자인 패턴이다. 생성자를 통해서 여러 번 호출이 되더라도 인스턴스를 새로 생성하지 않고 최초 호출 시 만들어두었던 인스턴스를 재활용하는 패턴을 말한다.
싱글톤을 사용하는 이유?
- 인스턴스 재활용으로 메모리 낭비를 방지한다.
💡 알고리즘 종류 : 조합
조합(combination)이란? 서로 다른 n개의 원소 중에서 순서에 상관없이 r개를 선택하는 것이다.
ex) int num[] = {1,2,3} 3개의 원소로 이루어진 배열에서 2개의 숫자를 뽑는 경우 [1,2][1,3][2,3] 3개가 된다.
순열은 주어진 배열에서 순서에 따라 결과가 달라지는 방식
조합 vs 순열
1 2
1) 조합은 순서에 상관없이 {1,2,3} {2,1,3} {3,1,2}든 결과는 같은것으로 취급하지만 2) 순열은 순서에 따라 결과가 달라지기에 {1,2,3} {2,1,3} {3,1,2} 다 다른 결과가 나온다.
📌 코딩테스트1️⃣ : 삼총사
🔒 문제 : 한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다. 한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.
🚫 조건 :
- 3 ≤ number의 길이 ≤ 13
- 1,000 ≤ number의 각 원소 ≤ 1,000 서로 다른 학생의 정수 번호가 같을 수 있습니다.
🔓 문제풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public int solution(int[] number) {
int answer = 0;
for(int i =0; i<number.length; i++){
for(int j=i+1; j<number.length; j++){
for(int k=j+1; k<number.length; k++){
if(number[i] + number[j] + number[k] == 0){ // index 1번부터 돌면서 3개 원소의 합이 0이라면
answer++; // answer +1
}
}
}
}
return answer; // 배열에서 삼총사 만들수 있는 갯수 반환
}
}