데이터의 집합(순서나 집합적인 저장공간)
데이터들을 효율적으로 관리할 수 있는 자료구조
중복되는 데이터들을 저장해야할 때, 배열에 들어간 순서를 유지하고 싶을 때 사용(중복 O, 순서 O)
ArrayList
단방향 포인터 구조 데이터 순차적 접근(조회)이 빠름
LinkedList
양방향 포인터 구조 데이터 삽입, 삭제가 빠름
순서가 필요없고, set에 저장될 데이터가 중복이 되면 안될 때 사용(중복 X, 순서 X)
HashSet
입력 순서 보장하지 않으며, 데이터 중복 허용하지 않음
LinkedHashSet
입력 순서 보장하며, 데이터 중복 허용하지 않음
TreeSet
입력한 데이터의 크기가 비교 가능한 경우 오름차순 정렬되며, 데이터 중복하지 않음
입력하는 데이터가 사용자 정의 객체인 경우 Comparable을 구현해, 정렬 기준 설정 가능
데이터를 저장할 때, key-value를 쌍으로 저장하고 싶을 때, 그리고 key를 중복 저장하고 싶지 않을 때 사용(key 중복 X, value 중복 O, 순서 X)
Hashtable
null 값 입력 불가
TreeMap
정렬된 순서대로 key-value를 저장하여 검색이 빠름
index 번호 대신 key-value로 찾는 Map 형태의 자료구조도 iterator 클래스를 이용해 key-value를 순서대로 iterator에 저장해두면 순서대로 추출이 가능하다
중복울 허용하지 않으며 null 값이 올 수 있다
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("1","Hello1");
hashMap.put("2","Hello2");
hashMap.put("1","Bye1");
hashMap.put(null,"Null");
for(Map.Entry<String, String> e : hashMap.entrySet()){
System.out.println("Key : "+e.getKey()+", Value : "+e.getValue());
}
Iterator<Map.Entry<String,String>> iter = hashMap.entrySet().iterator();
while (iter.hasNext()){
Map.Entry<String, String> entry = iter.next();
System.out.println("Key : "+entry.getKey()+", Value : "+entry.getValue());
}
Iterator<String> iter2 = hashMap.keySet().iterator();
while (iter2.hasNext()){
String key = iter2.next();
System.out.println("Key : "+key+", Value : "+hashMap.get(key));
}
----------출력값--------------
Key : null, Value : Null
Key : 1, Value : Bye1
Key : 2, Value : Hello2
💡 List, Set은 Collection 인터페이스를 상속받고 Map은 구조상의 차이로 별도로 정의한다.
스프링에서 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할이다.
자바 객체는 스프링에서 빈(Bean)이라고 부른다.
왜 Spring에서 컨테이너 기능을 제공할까??
객체를 생성하기 위해서는 new 생성자를 사용해야 한다.
하나의 어플리케이션에는 수많은 객체가 존재하고 서로 참조하고 있다.
참조의 정도가 심할 수록 의존성이 높다고 표현한다.
낮은 결합도와 높은 캡슐화로 대표되는 OOP에서 높은 의존성은 그 특징을 잘 살렸다고 보기 힘들다.
의존성 제어. 즉, 객체간의 의존성을 낮추기(느슨한 결합) 위해서 Spring 컨테이너가 사용된다.
✏️ IoC란?
제어의 역전. 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것이다.
✏️ Bean의 생명주기
스프링 IoC 컨테이너 생성 -> 스프링 Bean 생성 -> 의존관계 주입(DI) -> 초기화 콜백 메소드 호출 -> 사용 -> 소멸전 콜백 메소드 호출 -> 스프링 종료
Bean을 등록, 생성, 조회 등 Bean을 관리하는 역할을 하며, getBean() 메소드를 통해 Bean을 인스턴스화할 수 있다.BeanFacotory를 포함한 여러 인터페이스들을 상속받은 인터페이스(스프링 컨테이너하면 주로 ApplicationContext를 말함)MessageSource : 메세지 다국화를 위한 인터페이스
EnvironmentCapable : 개발, 운영 등 환경을 분리해서 처리하고, 애플리케이션 구동에 필요한 정보들을 관리하기 위한 인터페이스
ApplicationEventPublisher : 이벤트를 발행하고 구독하는 모델을 편리하게 지원하는 인테페이스
ResourceLoader : 파일, 클래스패스, 외부 등 리소스를 읽어오기 위한 인터페이스
Bean을 관리하고 검색하는 기능을 BeanFactory가 제공하고, 그외의 부가 기능을 제공한다.Bean의 인스턴스화, 구성, 생명 주기 및 제거까지 관리Bean을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공Component를 관리할 수 있음Bean을 연결하여 애플리케이션 Bean을 연결하는 역할@Configuration
public class Config{
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
}
@Controller, @Servcie, @Repository와 같은 어노테이션은 아래와 같이 인터페이스로 @Component 어노테이션을 받기 때문에 Component 등록 가능...
@Component
public @interface Service{
...
}