Java 강의
null 을 안전하게 처리하기 위해서 활용되는 객체
-Optional을 사용하면 NullPointerException 을 방지할 수 있음
-Optional 객체를 메서드 반환 자료형에 선언해서 해당 메서드가 null 이 반환될 가능성을 명확하게 전달할 수 있음
isPresent() // Optional 내부의 값이 존재할 경우에 true 반환, null이면 false 반환
순서가 있는 자료구조, 중복 허용
-요소의 저장 순서 유지
-중복된 요소 저장 가능
-인덱스를 사용하여 요소 접근 가능
-ArrayList: 배열 기반, 조회 속도 빠름, 추가/삭제 성능 낮음
-LinkedList: 연결 시스트 기반, 추가/삭제 빠름, 조회 성능 낮음
-Vector : 동기화 지원, ArrayList와 유사
-add(E e): 요소 추가
-get(int index): 특정 인덱스 요소 조회
-remove(int index): 특정 인덱스 요소 삭제
-set(int index, E e): 특정 인덱스 요소 변경
-size(): 저장된 요소 개수 반환
순서가 없는 자료구조, 중복 x
-저장 순서를 유지x
-중복 요소 저장x
-HashSet : 해시 기반, 빠른 검색
-LinkedHashSet : 저장 순서를 유지하는 HashSet
-TreeSet : 정렬된 상태로 저장
-add(E e): 요소 추가
-remove(Object o): 특정 요소 삭제
-contains(Object o): 특정 요소 존재 여부 확인
-size(): 저장된 요소 개수 반환
key-value 쌍으로 저장, 키는 중복x
-키(key)와 값(value)으로 구성
-키는 중복x, 값은 중복o
-HashMap : 해시 기반, 빠른 검색, 순서 유지 안됨
-LinkedHashMap : 입력 순서를 유지하는 HashMap
-TreeMap : 키를 기준으로 정렬
-put(K key, V value): 키-값 추가
-get(Object key): 키에 해당하는 값 조회
-remove(Object key): 특정 키-값 삭제
-containsKey(Object key): 특정 키 존재 여부 확인
-containsValue(Object value): 특정 값 존재 여부 확인
-size(): 저장된 요소 개수 반환
-keySet(): 전체 키를 Set으로 반환
-values(): 전체 값을 Collection으로 반환
-클래스, 메서드 등에 사용되는 <T>타입 매개변수를 의미
-타입을 미리 지정하지 않고 사용 시점에 유연하게 결정할 수 있는 문법
-코드 재사용성과 타입 안정성 보장
-자동 형변환
-과도하게 사용시 복잡해질 수 있음
-클래스 선언부에 <T>가 선언된 클래스
-클래스 선언시 타입 매개변수를 사용해 다양한 데이터 타입을 안전하게 처리할 수
있는 구조
ex)
class Box<T> { // T는 타입 매개변수 (Type Parameter)
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
main
Box<String> strBox = new Box<>();
strBox.setValue("Hello");
String value = strBox.getValue(); // 형변환 없이 사용 가능
Box<Integer> intBox = new Box<>();
intBox.setValue(10);
Integer value1 = intBox.getValue();
컴파일 시점에 제네릭 타입 정보를 제거하고 적절한 실제 타입으로 변환되는 과정
-타입 매개변수 부분이 실제 타입(Object 또는 상위 클래스)로 변경
-필요한 경우 컴파일러가 자동으로 형변환을 추가
-런타임에는 타입 정보 존재x
-인스턴스 생성 불가
-instanceof와 같은 타입 체크 불가
-배열 생성 불가
메서드 내부에서 사용할 타입을 외부에서 유연하게 지정하는 기능
-반환 타입 앞에 처럼 타입 매개변수를 선언해야 함
-메서드 호출 시 타입이 결정되므로, 여러 타입 처리 가능
-정적 메서드에서도 사용 가능
-제네릭 클래스와 독립적으로 동작 가능
ex)
class Box {
public static <T> void print(T item) { // 제네릭 메서드
System.out.println(item);
}
}
main
Box.print("Hello"); // String 타입
Box.print(100); // Integer 타입
어떤 타입이든 될 수 있다라는 뜻을 가진 <?>를 사용
<?> : 비한정적 와일드 카드, 제한 없음
<? extends U> : 상한 경계 와일드 카드, 상위 클래스 제한(U와 그 자손들만 가능)
<? super U> : 하한 경계 와일드 카드, 하위 클래스 제한 (U와 그 조상들만 가능)
와일드 카드는 설계가 아닌 사용을 위한 것. 정확히 말하면 설계를 해서 만드는 것이 아닌 이미 만들어진 제네릭 클래스나 메서드를 사용할 때 범위 한정을 정할 때 사용하는 것이다.
오늘은 집중이 잘 된 것 같다. 물론 강의 처음 배우는 부분이라서 오래 걸리긴 했지만 나름대로 코드가 읽히는 것 같아서 만족이다. 내일은 lv2 계산기를 만들어보는 걸로.