내배캠 TIL 9일차

오병택·2025년 2월 27일

내배캠

목록 보기
31/73

9일차 요약

Java 강의

Java

Optional

null 을 안전하게 처리하기 위해서 활용되는 객체

-Optional을 사용하면 NullPointerException 을 방지할 수 있음
-Optional 객체를 메서드 반환 자료형에 선언해서 해당 메서드가 null 이 반환될 가능성을 명확하게 전달할 수 있음

메서드

isPresent() // Optional 내부의 값이 존재할 경우에 true 반환, null이면 false 반환

컬렉션 종류와 특징

List

순서가 있는 자료구조, 중복 허용

특징

-요소의 저장 순서 유지
-중복된 요소 저장 가능
-인덱스를 사용하여 요소 접근 가능

구현 클래스

-ArrayList: 배열 기반, 조회 속도 빠름, 추가/삭제 성능 낮음
-LinkedList: 연결 시스트 기반, 추가/삭제 빠름, 조회 성능 낮음
-Vector : 동기화 지원, ArrayList와 유사

주요 메서드

-add(E e): 요소 추가
-get(int index): 특정 인덱스 요소 조회
-remove(int index): 특정 인덱스 요소 삭제
-set(int index, E e): 특정 인덱스 요소 변경
-size(): 저장된 요소 개수 반환

Set

순서가 없는 자료구조, 중복 x

특징

-저장 순서를 유지x
-중복 요소 저장x

구현 클래스

-HashSet : 해시 기반, 빠른 검색
-LinkedHashSet : 저장 순서를 유지하는 HashSet
-TreeSet : 정렬된 상태로 저장

주요 메서드

-add(E e): 요소 추가
-remove(Object o): 특정 요소 삭제
-contains(Object o): 특정 요소 존재 여부 확인
-size(): 저장된 요소 개수 반환

Map

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으로 반환

제네릭(Generic)

-클래스, 메서드 등에 사용되는 <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 계산기를 만들어보는 걸로.

profile
걱정하지 말고 일단 해봐!

0개의 댓글