실수를 방지하도록 도와주는 제네릭
정확히는 타입의 형 변환의 실수를 사전에 방지하도록 만들어졌다
즉, 런타임이 아닌 컴파일 단계에서 잘못되었음을 알 수 있다.
@Getter
@Setter
@Builder
@ToString
public class TestDTO {
private String name;
private int age;
}
public class GenericTest{
public GenericTest(){
List<TestDTO> list = List.of(TestDTO.builder().name("이름").age(10).build());
System.out.println(list.toString());
}
}
Generic 타입의 이름 정하기 규칙
- E : 요소
- K : 키
- N : 숫자
- T : 타입
- V : 값
- S.U.V : 두 번째, 세 번째, 네 번째에 선언된 타입
만약 어떤 타입의 데이터가 넘어오는지 모른다면?
- wildcard 타입으로 처리 해준다 :
클래스이름<?>
- wildcard로 받은 데이터는 Object로 처리해주어야 한다.
- wildcard는 메소드의 매개변수로만 받아주는 것이 좋다
public class Test{
public void method(TestDTO<?> test){
}
}
상속받은 클래스 객체와 연관된 제네릭만 사용 가능하도록 하려면?
bounded wildcards를 사용하면 부모 클래스와 자식 클래스 등등 관련 있는 객체들의 값만 받을 수 있다.
class Car{}
class Bus extends Car{}
class WildcardGeneric<Car>{}
class Test{
public void boundedWildcard(WildcardGeneric<? extends Car> c){
System.out.println(c);
System.out.println(c.toString());
}
public void test(){
WildcardGeneric<Bus> wildcard = new WildcardGeneric<Bus>();
boundedWildcard(wildcard);
WildcardGeneric<Car> wildcard2 = new WildcardGeneric<Car>();
boundedWildcard(wildcard2);
}
public static void main(String[] args){
Test test = new Test();
test.test();
}
}
메소드를 제네릭하게 선언하기
메소드의 타입을 제네릭하게 지정하고, 매개변수를 wildcard와 generic 변수를 이용해 선언 및 사용한다
class Test{
public <T> void genericMethod(WildcardGeneric<T> c, T addValue){
c.setWildcard(addValue);
T value = c.getWildcard();
System.out.println(value);
}
public void callGenericMethod(){
WildcardGeneric<String> wildcard = new WildcardGeneric<>();
genericMethod(wildcard, "테스트");
}
public static void main(String[] args){
Test test = new Test();
test.callGenericMethod();
}
}
Collection
배열과 비슷한 역할을 하는 3개의 인터페이스를 구현 List, Set, Queue
ArrayList
정해진 공간을 만드는 배열과 달리 추가 삭제가 가능한 목록을 순서대로 저장한다.
공간의 크기를 지정하지 않을 경우 기본 10으로 지정되며, 이후 추가될 경우 확장하는 과정을 거치기 때문에 성능에 영향을 줄 수 있다.
Thread - non safe
- 상속관계
java.lang.Object
→ java.util.AbstractCollection
—> java.util.AbstractList
— —> java.util.ArrayList
- 주요 메소드
- add() : 목록에 추가
- get() : 인덱스 위치에 있는 데이터를 가져온다
- size() : 목록으로 등록되어 있는 개수를 구한다.
- toArray() : 목록을 배열로 변환한다
- clear() : 모든 데이터를 삭제한다
- remove() : 지정한 위치에 있는 데이터를 삭제, 매개변수와 동일한 데이터를 삭제
- set() : 데이터의 변경
Stack
후입선출(LIFO : Last In First Out)을 개념으로 데이터 로직이 순서대로 진행하며 데이터를 넣을 때는 아래부터 한개씩 데이터를 쌓아 올라가고 꺼낼 때는 위에서 부터 꺼낸다.
Thread - safe
- 상속관계
java.lang.Object
→ java.util.AbstractCollection
—> java.util.AbstractList
— —> java.util.Vector
— — —> java.util.Stack
- 주요 메소드
- empty() : 비어있는지 확인
- peek() : 객체의 가장 위에 있는 데이터를 리턴
- pop() : 객체의 가장 위에 있는 데이터를 지우고 리턴
- push() : 매개 변수로 넘어온 데이터를 가장 위에 저장
- search() : 매개 변수로 넘어온 데이터의 위치를 리턴
Set과 Queue
Set
ArrayList와 마찬가지로 저장공간이 늘어날 경우 재정리 작업을 해야만 하기에 성능에 영향이 발생한다.
- 순서에 상관없이 저장되며
- 중복된 데이터가 없도록 방지하고
- 원하는 값이 있는지 확인할 수 있다.
- Set의 종류
- HashSet : 순서가 전혀 필요 없는 데이터를 해시 테이블에 저장
- TreeSet : 저장된 데이터의 값에 따라서 정렬 (2진 트리 형태)
- LinkedHashSet : 연결된 목록 타입으로 구현된 해시 테이블에 데이터를 저장
- 상속관계
java.lang.Object
→ java.util.AbstractCollection
—> java.util.AbstractSet
— —> java.util.HashSet
- 주요 메소드
- add() : 데이터를 추가한다.
- clear() : 모든 데이터를 삭제한다
- contains() : 지정한 객체가 존재하는지 확인
- iterator() : 데이터를 꺼내기 위한 iterator 객체를 리턴
- remove() : 매개변수로 넘어온 객체 삭제
- size() : 데이터의 개수를 리턴
Queue
큐의 설명에 앞서 LinkedList의 설명을 먼저 한다.
LinkedList는 List의 인터페이스와 Queue와 Deque 인터페이스도 구현하고 있다.
- LinkedList의 개념
- (A) 객체에 (B) 객체의 주소 값을 기억
- (B) 객체에 (C) 객체의 주소 값을 기억ArrayList는 데이터가 중간에 추가 삭제될 경우 모든 공간을 재배치를 하는데, LinkedList는 참조하고 있는 주소 값 만을 수정해주면 되기에 메모리 관리에 더욱 효율적이다.
- 위와 같은 방식으로 이루어져 있다.
- 예를 들어 (A) - (B) - (C)가 있다고 가정을 하면 목록을 나열해서 순서대로 저장 한다는 개념만이 아닌 앞 뒤의 주소 값을 기억 한다.
- 상속 관계
java.lang.Object
→ java.util.AbstractCollection
—> java.util.AbstractList
— —> java.util.AbstractSequentialList
— — —> java.util.LinkedList
- 그래서 큐란? 왜 사용하는가?
- 큐 : FIFO(First In First Out)의 개념을 사용한다
- 서버를 예로 들어 사람들이 접속하여 먼저 사용을 요청하였는데 다른 요청들이 다 쌓일 때 까지 Stack을 쌓아 놓고 마지막에 들어온 사람의 요청 먼저 해준다면 문제가 되기 때문에, 이를 먼저 들어온 요청 순서대로 조치해주는 것이다.
- 주요 메소드
- addFirst() : 객체의 가장 앞에 값을 추가한다
- add() : 객체의 가장 뒤에 값을 추가한다
- set() : 데이터를 변경한다.
- getFirst() : 가장 앞의 데이터를 리턴한다.
- getLast() : 가장 뒤의 데이터를 리턴한다
- get() : 지정한 위치의 데이터를 리턴한다
- contains() : 매개 변수로 넘긴 데이터가 있을 경우 true를 리턴한다
- indexOf() : 데이터의 위치를 검색한다
- remove() : 가장 앞에 있는 데이터를 삭제한다
- removeLast() : 가장 뒤에 있는 데이터를 삭제한다.
Map
- 키(Key)와 값(Value)로 이루어져 있다.
- 키 또는 값이 null이면 안된다
- 키는 중복값이 없어야 한다.
- 값은 중복이어도 무방하다
- 주요 메소드
- put() : 키와 값을 저장한다
- get() : 매개변수로 넘어온 키에 해당하는 값을 리턴한다
- remove() : 매개변수로 넘어온 키를 통해 키와 값을 삭제한다
- keySet() : 키의 목록을 Set 타입으로 리턴한다
- values() : 값의 목록을 Collection 타입으로 리턴한다
- entrySet() : Map 안에 Entry라는 타입의 Set을 리턴한다
- Map의 종류
- HashMap
- TreeMap : 정렬된 키 목록을 불러온다 ( 숫자 > 알파벳 대문자 > 알파벳 소문자 > 한글 )
- LinkedHashMap
- Hashtable
- 상속 관계
java.lang.Object
→ java.util.AbstractMap<K,V>
—> java.util.HashMap<K,V>
'Programming > Backend' 카테고리의 다른 글
자바 기초 다지기 -7 (네트워크, Java7, Java8) (0) | 2021.09.26 |
---|---|
자바 기초 다지기 - 6 (Thread, Syncronized, Serializable, IO, NIO) (0) | 2021.09.13 |
자바 기초 다지기 - 4 (내부 클래스, 어노테이션, 자바) (0) | 2021.08.29 |
자바 기초 다지기 - 3 (API, Object, 추상, final, Enum, 예외, String) (0) | 2021.08.23 |
자바 기초 다지기 - 2 (조건문, 반복문, 배열, 참조자료형, DTO, 상속, 오버라이딩, 오버로딩, 다형성) (0) | 2021.08.16 |