[우아한테크코스 백엔드 4기] 레벨1 - Java 문법특강 : 문자열, List, Generic 필기 정리

헌치·2022년 2월 25일
0

우아한테크코스

목록 보기
10/30

문자열

1) String

  • 같은 문자가 들어있으면 같은 객체로 봄
  • 하드코딩은 컴파일 시 최적화
  • 동등성 vs 동일성 : 문자열은 equals()로 비교하자!
public class A {
    public static void main(String[] args) {
        String a = "a";
        String b = "b";
        String c = "c";

        System.out.println(a + b + c);
    }
}
  • + 하나마다 메모리 할당, 해제 반복됨
    • 새 객체가 생성되기 때문
  • final을 통해 메모리 최적화 될 때도 있음
    • 불변(immutable)객체이기 때문

2) StringBuilder

  • 기존 데이터에 새로운 데이터를 더하는 방식
  • 사실 JVM 내에서 StringBuilder 로 자동 변환해줄 때도 있지만, 아닌 경우도 있음
  • 변환하더라도, 계속 toString()으로 변경 (생각보다는 멍청한 JVM)
  • 긴 문자열을 더할 땐 StringBuilder!

3) StringBuffer

  • 멀티쓰레딩 때 사용
  • 우리는 쓸 일 없음

결론

  • StringBuilder 쓰자

List

  • 선형 데이터를 관리하는 인터페이스

1) ArrayList

  • 순서대로 저장됨, 인덱스를 통해 바로 값 접근

2) LinkedList

  • 노드를 통해 연결되어 있음, 값 추가가 편함

결론

  • 보통 ArrayList 사용
  • 직접 자료구조 구현 X

Generic

  • 데이터의 타입을 특정 타입으로 고정
  • ArrayList<String>...<> 사용

1) 특징

  • 특정 타입으로 제한함으로써 타입 안정성을 제공
  • 타입 체크와 형변환을 생략할 수 있으므로 코드가 간결
  • 다른 타입을 저장하면 컴파일 에러

2) Non-Generic

  • 다양한 종류의 객체의 타입을 추가할 수 있다.(특정 Type => Object)
  • 추가한 객체 타입을 사용하려면 다시 형변환을 해야 한다.(Object => 특정 Type)

결론

  • 특별히 예외적인 상황이 아니라면 Generic을 사용한다.
  • List<String> list = new ArrayList(); 형식으로 사용하자

와일드카드

  • 제네릭 클래스의 객체를 메소드의 매개변수로 받을 때, 그 객체의 타입 변수를 제한하는 것

<? extends T> vs < ? super T>

super is a lower bound(최하단 제한)

  • T와 그 조상들을 구현한 객체들만 매개변수로 가능
class A { } 
class B extends A { } 
class C extends B { }

|-------------------------|-------------------|-------------------------------------------|
|         wildcard        |        add        |                   assign                  |
|-------------------------|-------------------|-------------------------------------------|
|     List<? super C>     |              C    |  List<Object>  List<A>  List<B>  List<C>  |
|-------------------------|-------------------|-------------------------------------------|
|     List<? super B>     |         B    C    |  List<Object>  List<A>  List<B>           |
|-------------------------|-------------------|-------------------------------------------|
|     List<? super A>     |    A    B    C    |  List<Object>  List<A>                    |
|-------------------------|-------------------|-------------------------------------------|

extends is an upper bound(최상단 제한)

  • T와 그 자손들을 구현한 객체들만 매개변수로 가능
|-------------------------|-------------------|---------------------------------|
|         wildcard        |        get        |              assign             |
|-------------------------|-------------------|---------------------------------|
|    List<? extends C>    |    A    B    C    |                       List<C>   |
|-------------------------|-------------------|---------------------------------|
|    List<? extends B>    |    A    B         |             List<B>   List<C>   |
|-------------------------|-------------------|---------------------------------|
|    List<? extends A>    |    A              |   List<A>   List<B>   List<C>   |
|-------------------------|-------------------|---------------------------------|

예시 코드

public class A {
    public static void main(String[] args) {
        final Box<? extends Animal> extendsAnimalBox = new Box<>();
        Animal animal = extendsAnimalBox.get();

        final Box<? super Animal> superAnimalBox = new Box<>();
        Object animal = superAnimalBox.get();
    }
}

public class Box<T> {
    private T value;

    public T get() {
        return value;
    }
}

결론 : PECS

  • producer 생성 : extends
  • consumer 소비 : super

참고자료

profile
🌱 함께 자라는 중입니다 🚀 rerub0831@gmail.com

0개의 댓글