좌충우돌 개발공부

TIL(20240618) [Spring:@Component와 @Autowired, 알고리즘:조합]


📌 Spring

팀 프로젝트에 들어가기 앞서서, 스프링 빈 등록에 대해 복습을 하고 넘어가려고 한다. 아직 개념정리가 확실히 되어있지 않다고 느껴서 이 부분을 정확하게 이해하고 넘어가기 위함이다!

💡 스프링 빈을 등록하는 방법

  • 컴포넌트 스캔(@Component)과 자동 의존관계(@Autowired) 설정

@Component 컴포넌트 스캔

  • Component 애너테이션이 붙은 것들은 객체로 생성하여 스프링컨테이너에 등록한다. 즉, 스프링 빈으로 자동등록된다.

  • 그럼 controller나 serivce, repository는 어떻게 해서 스프링 빈으로 자동등록 되는가?

  • 3 layer 는 interface이고 셋다 @Component 애너테이션을 가지고 있기 때문에 자동으로 빈등록이 되는것!

alt text alt text alt text

@Autowired

  • 연관관계 설정!
  • ex) controller-service-repository 연결시켜준다.

여기서 주의할 점은 com.sparta.reviewspotproject 패키지 안에서만 컴포넌트 스캔이 가능하다.

그 이유는?

alt text

해당 패키지 아래에 보면 어플리케이션이 있는데,

alt text

어플리케이션 안에 @ComponentScan이 있기 때문에 패키지 내에서 @Controller 애너테이션을 달아주면 어플리케이션에서 자동으로 컴포넌트 스캔을 해서 자동으로 빈을 등록해주게 되는 것이다. 그러니까 com.sparta.reivewspotproject가 아닌 다른 패키지에서 클래스를 만들어 @Controller 애너테이션을 달아줘도 스프링컨테이너에 빈을 등록해주지 못하게 되는것이다. (=찾지를 못한다.)

참고사항

  • 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다. 즉, 하나만 등록해서 공유한다라는 의미이다. 따라서 같은 스프링 빈이면 모두 같은 인스턴스이다. 싱글톤이 아니게 설정은 할 수 있지만 특별한 경우가 아니면 대부분 싱글톤을 사용한다고 한다.

싱글톤(Singleton)?
- 특정 클래스의 인스턴스를 1개만 생성되는 것을 보장하는 디자인 패턴이다. 생성자를 통해서 여러 번 호출이 되더라도 인스턴스를 새로 생성하지 않고 최초 호출 시 만들어두었던 인스턴스를 재활용하는 패턴을 말한다.

싱글톤을 사용하는 이유?
- 인스턴스 재활용으로 메모리 낭비를 방지한다. 


💡 알고리즘 종류 : 조합

  • 조합(combination)이란? 서로 다른 n개의 원소 중에서 순서에 상관없이 r개를 선택하는 것이다.

  • 수식 : alt text

  • ex) int num[] = {1,2,3} 3개의 원소로 이루어진 배열에서 2개의 숫자를 뽑는 경우 [1,2][1,3][2,3] 3개가 된다.

  • 순열은 주어진 배열에서 순서에 따라 결과가 달라지는 방식

  • 조합 vs 순열

      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 서로 다른 학생의 정수 번호가 같을 수 있습니다.

🔓 문제풀이


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; // 배열에서 삼총사 만들수 있는 갯수 반환
    }
}