하루에 4개씩 기초 지식!
더보기
1. 제어의 역전(IoC, Inversion of Control)!
- 제어의 역전(IoC)란 모든 객체에 대한(생성, 라이프 사이클 등) 제어권을 개발자가 아닌 IoC 컨테이너에게 넘긴 것을 의미!
- 스프링에서는 IoC 컨테이너에 객체들을 생성하면 객체끼리 의존성을 주입(DI, Dependency Injection)하는 역할을 하고 컨테이너에 등록한 객체들을 'Bean'이라고 한다!
2. 스프링 Bean을 등록하는 방법은 뭘까?
- 기본적으로 2가지가 있다!
- @Component 어노테이션을 사용하는 것!
@Controller, @Service, @Repository는 모두 @Component를 포함하고 있다! - 설정 클래스를 따로 만들어 @Configuration 어노테이션을 붙이고, 해당 클래스 안에서 빈으로 등록할 메서드를 만들어
@Bean 어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성된다!
- @Component 어노테이션을 사용하는 것!
3. 의존성 주입(DI, Dependency Injections)!
- 의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아서 사용하는 것!
이를 통해 객체간의 결합도를 줄이고 코드의 재사용성을 높일 수 있다!
의존성 주입은 생성자 주입, 필드 주입, 세터 주입의 3가지 방법이 있다!
이 중 Spring에서 가장 권장하는 의존성 주입 방법은 생성자를 통한 주입 방법!
이유는 순환 참조를 방지하고, 불변성을 가지며, 테스트에 용이하기 때문이다!
4. Spring Bean의 리사이클은 어떻게 관리될까?
- Spring Bean의 리사이클이 뭐지?
스프링 IoC 컨테이너 생성 -> Spring Bean 생성 -> 의존 관계 주입 -> 초기화 콜백 메서드 호출 -> 사용 -> 소멸 전 콜백 메서드 호출 -> 스프링 종료 - 스프링은 크게 3가지 Bean 생명주기 콜백을 관리
- 인터페이스(InitializingBean, DisposableBean)
- 설정 정보에 초기화 메서드, 종료 메서드 지정
- @PostConstruct, @PreDestory 언테이션 지원
Code Kata
1. 코드 처리하기 / Programers
문제 설명
문자열 code가 주어집니다.code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다.mode는 0과 1이 있으며, idx를 0 부터 code의 길이 - 1 까지 1씩 키워나가면서 code[idx]의 값에 따라 다음과 같이 행동합니다.
mode가 0일 때
code[idx]가 "1"이 아니면 idx가 짝수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.
code[idx]가 "1"이면 mode를 0에서 1로 바꿉니다.
mode가 1일 때code[idx]가 "1"이 아니면 idx가 홀수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다
code[idx]가 "1"이면 mode를 1에서 0으로 바꿉니다.
문자열 code를 통해 만들어진 문자열 ret를 return 하는 solution 함수를 완성해 주세요.
단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.
제한사항
1 ≤ code의 길이 ≤ 100,000
code는 알파벳 소문자 또는 "1"로 이루어진 문자열입니다.
class Solution {
public String solution(String code) {
String answer = "";
int mode = 0;
for(int i = 0; i<code.length(); i++){
if(code.charAt(i) == '1' && mode == 0){
mode = 1;
} else if(code.charAt(i) =='1'&& mode ==1){
mode = 0;
}
if(mode == 0){
if(code.charAt(i) != '1' && i%2 == 0){
answer += code.charAt(i);
}
} else if( mode == 1){
if(code.charAt(i) != '1' && i % 2 != 0){
answer += code.charAt(i);
}
}
}
if(answer.isEmpty()){
return "EMPTY";
}
return answer;
}
}
코드 로직 :
- 문자열을 한 글자씩 순회하면서, 현재 문자가 '1'이면 mode를 전환합니다.
- mode가 0일 때 '1'을 만나면 mode를 1로 변경합니다.
- mode가 1일 때 '1'을 만나면 mode를 0으로 변경합니다.
- mode가 0일 때 '1'을 만나면 mode를 1로 변경합니다.
- 현재 mode에 따라 조건을 달리해 문자를 answer에 추가합니다:
- mode가 0일 때: 짝수 인덱스에서 '1'이 아닌 문자를 answer에 추가합니다.
- mode가 1일 때: 홀수 인덱스에서 '1'이 아닌 문자를 answer에 추가합니다.
- mode가 0일 때: 짝수 인덱스에서 '1'이 아닌 문자를 answer에 추가합니다.
- 최종적으로, answer가 비어있으면 "EMPTY"를 반환하고, 그렇지 않으면 answer를 반환합니다.
시간 복잡도,,, 공간 복잡도,, 복잡허다,, 과연 이게 뭘까??
- 시간 복잡도란?
- 시간복잡도는 코드가 실행되는 데 걸리는 시간의 증가율을 나타내는 것이다!
입력 데이터의 크기 n에 따라 얼마나 많은 시간이 걸리는지 분석한다! - 시간 복잡도는 주로 빅오 표기법으로 표현!
- : 상수 시간. 입력 크기에 상관없이 항상 동일한 시간이 걸린다.
- O(n): 선형 시간. 입력 크기에 비례해서 시간이 증가한다!
- O(log n): 로그 시간. 입력 크기가 커질수록 조금씩만 시간이 증가한다!
- O(n2): 제곱 시간. 입력 크기에 제곱 비례해서 시간이 증가한다!
- : 상수 시간. 입력 크기에 상관없이 항상 동일한 시간이 걸린다.
- 시간복잡도는 코드가 실행되는 데 걸리는 시간의 증가율을 나타내는 것이다!
- 그럼 공간 복잡도는..?
- 공간 복잡도는 코드가 실행되면서 사용하는 메모리 양의 증가율을 나타내는 것!
- 입력 데이터의 크기 n에 따라 얼마나 많은 메모리를 사용하는지 분석한다!.
- 공간 복잡도도 시간 복잡도처럼 빅오 표기법으로 표현합니다.
- O(1): 상수 공간. 입력 크기에 상관없이 항상 동일한 메모리만 사용한다.
- O(n): 선형 공간. 입력 크기에 비례해서 메모리 사용량이 증가한다!
- O(log n): 로그 공간. 입력 크기에 비례하지 않고, 조금만 메모리 사용량이 증가한다!
- 공간 복잡도는 코드가 실행되면서 사용하는 메모리 양의 증가율을 나타내는 것!
자바에서 공간 복잡도는 데이터를 어떻게 저장하고 처리할지 결정할 때 중요하다!
예를 들어, 배열을 사용하면 모든 데이터를 한 번에 메모리에 저장해야 하니까 O(n)의 공간 복잡도가 있지만,
링크드 리스트를 사용하면 요소 하나씩 추가될 때마다 메모리가 필요하다.
'정보' 카테고리의 다른 글
SQL 기초부터 가보자 (1) | 2024.10.04 |
---|---|
Kafka란 뭘까? (0) | 2024.09.29 |
MySQL? PostgerSQL 뭐가 다른거지? (2) | 2024.09.27 |
내가 보고싶어 만드는 Java/Spring Exception 모음! (1) | 2024.09.25 |
VO, BO, DAO, DTO (0) | 2024.09.12 |