Java 17일차..

박상우·2022년 8월 23일
post-thumbnail

제네릭(Generic)

제네릭(Generic)

  • 제네릭은 하나의 타입(클래스, 인터페이스)으로 만 이용해서 동적인 대처를 할 수 있게 하기위해 사용한다.
  • 대표적인 예로는 List<T타입>와 Set<T타입> 등이 있다. 'List'라는 하나의 인터페이스를 이용하여 이가 담을 수 있는 원소의 타입을 무한정으로 이용할 수 있다. 가령 List<Object타입>, List<Integer타입>, List<Long타입>, List<String타입>등....
  • 제네릭 이름의 제한은 없으나 주로 한 자, T, E , V, K 등을 많이 사용한다.
  • 다이나믹 제네릭 타입은 물음표(?) 기호로 나타내며 이는 제네릭에 해당하는 타입에 대한 객체의 제한을 뚜렷하게 두지 않고자 할 때 사용한다. 단, extends 키워드를 통해 제한할 수는 있음.
  • (클래스 이름)<제네릭,....>혹은 (인터페이스 이름) <제네릭,...> 방식으로 사용 할 수 있음.
  • 제네릭 <T extends 타입> 방식으로 제네릭 타입에 대해 부모 클래스 및 구현하는 인터페이스와의 관계를 지정하여 제한할 수 있다.
  • 메서드의 반환타입 앞에 제네릭을 설정하여 메서드 내에서 임의의 타입을 사용할 수 있다.
  • 제네릭 메서드를 호출할 때에는 메서드 이름 앞에 그 타입을 명시한다.

Collections Framework(API)

Collections Framework

  • java.util.Collection의 사용을 쉽고 빠르게 하기위해 존재한다. (Utility)
  • 정적 메서드
    1. <T타입>max(x) : <T타입> 전달된 Collection을 상속 받는 자료 구조이면서 그 제네릭이 Comparable을 상속 받는 객체 x가 가지는 원소들 중 가장 큰 것(Comparable에 의해 비교된)을 반환한다.
    1. <T타입>min(x) : <T타입> 전달된 Collection을 상속 받는 자료 구조이면서 그 제네릭이 Comparable을 상속 받는 객체 x가 가지는 원소들 중 가장 작은 것(Comparable에 의해 비교된)을 반환한다.
    2. sort(x) : 전달된 Collection을 상속 받는 자료 구조이면서 그 제네릭이 Comparable을 상속(구현)받는 객체 x가 가지는 원소를 오름차순으로 정렬한다.
    3. reverse(x) : 전달된 Collection을 상속 받는 자료 구조이면서 그 제네릭이 Comparable을 상속(구현)받는 객체 x가 가지는 원소의 순서를 뒤집는다.
    4. copy(x, y) : 전달된 y Collection 객체가 가지는 원소를 x Collection 객체에 복사한다. 이 때 복사한 값을 붙여넣을 Collection 객체의 크기는 원본 Collection 객체의 크기 이상이어야 한다.
    5. disjoint(x, y) : <boolean타입> 전달된 x와 y Collection 객체의 원소중 겹치는(동일한) 원소가 하나도 없다면 true를, 하나라도 있다면 false를 반환한다.
    6. shuffle(x) : 전달된 x Collection 객체가 가지는 원소의 순서를 무작위로 섞는다.
    7. <T타입>addAll(x,y...) : 전달된 x Collection 객체 v(들)을 추가한다.
    8. <T타입>unmodifiableList(x) : <List<T타입>> 전달 받은 x List를 더 이상 추가/삭제 할 수 없는 리스트로 만들어 반환한다.
      9-1. 그 외 unmodifiable 어쩌고 시리즈가 많다.

      가령, 소수만 들어가야할 primeNumbers에 다른값이 들어가지 못하게 한다. 20이라는 소수가 아닌 수를 추가 할 경우 아래와 같은 오류가 발생하게 된다.
    9. fill(x, y) : 전달된 x List의 원소를 모두 v로 지정한다.

Array Framework(API)

Array Framework

  • java.util.Arrays
  • 자바 배열과 관련된 편의 기능을 제공한다.
  • 정적 메서드
    1. <T타입>asList<T...> : <List<T타입>> 전달된 T타입의 배열을 T타입을 제네릭으로 가지는 List로 반환한다.
    1. sort(x[]) : 전달된 x타입의 배열을 오름차순으로 정렬한다.
    2. <T타입>sort(T[], c) : 전달된 T타입의 배열을 Comparator<T타입> 타입의 객체인 c 형식으로 정렬한다.
    3. toString(x[]) : <String타입> 전달된 x타입의 배열을 [a, b, c,...] 형식의 문자열로 변형하여 반환한다.
    4. copyOf(T[], x) : <T[]> 전달된 T타입의 배열의 원소 중 x개만 뽑아 새로운 배열로 반환한다.
    5. <T타입>stream(T[]) : <Stream<T타입>> 전달된 T타입의 배열에 대해 Stream API를 실행하기 위한 객체를 반환한다.

Stream API

Stream Api

  • 배열과 List에 대한 처리를 쉽고 빠르게 하기위한 편의 기능을 제공한다.
  • 람다(표현)식(Lambda Expression) : (매개변수,...) -> { 구현부 } 방식의 익명 함수(Anonymous Function). 단, 매개 변수가 단 한개일 때에는 매개변수 좌우의 괄호를 생략할 수 있다.
  • 함수형 인터페이스(function Interface) : (추상) 메서드를 한 개만 가지는 인터페이스. 인터페이스에 @FunctionalInterface 어노테이션을 붙인다.
  • Stream API는 Stream<T타입> 타입의 객체에 대해서 사용할 수 있다.
  • 비정적 메서드
  1. <T타입>filter(x) : <Stream<T타입>> 해당 스트림에 대해 전달된 Predicate<T타입> 타입인 x를 만족하는 원소만 남기는 스트림을 반환한다.
  2. <T타입>distinct() : <Stream<T타입>> 해당 스트림에서 중복된 원소를 제거한다.
  3. <R, A>collect(c) : <R타입> Stream<T타입>에 대해 Collector<? super T, A, R> 타입인 c객체의 방식으로 원소를 모아 반환한다.
    3-1. 됐고, .collect(Collectors.toList()) 하면 Stream<T타입>을 List<T타입>로 반환한다.
  4. map(X) : <Stream<T타입>> 해당 스트림에 대해 전달된 Predicate<T타입>인 x에 대해 가지고 있는 모든 원소를 연산한 뒤 이를 원소로 가지는 스트림을 반환한다.(filter랑 다르다. map은 map을 하는 대상과 길이가 반드시 똑같다.)
  5. anyMatch(x) : <boolean타입> 해당 스트림이 가지고 있는 원소 중 전달된 Predicate<T타입> 인 x에 대해 하나라도 참인가에 대한 여부를 반환한다.
  6. allMatch(x) : <boolean타입> 해당 스트림이 가지고 있는 원소 중 전달된 Predicate<T타입> 인 x에 대해 전체가 참인가에 대한 여부를 반환한다.
  7. noneMatch(x) : <boolean타입> 해당 스트림이 가지고 있는 원소 중 전달된 Predicate<T타입> 인 x에 대해 전체가 거짓인가에 대한 여부를 반환한다.
  8. findFirst(x) : <Optional<T타입>> 해당 스트림이 가지고 있는 원소 중 전달된 Predicate<T타입>인 x에 대해 참인 첫번째 원소에 대한 Optional을 반환한다.

Annotation(어노테이션)

Annotation

  • 어노테이션은 변수, 메서드, 클래스 , 인터페이스 등의 속성이나 상태를 알리기 위해 사용한다.
  • @Deprecated : 해당 메서드 혹은 클래스/인터페이스 등이 더 이상 사용되어져서는 안 되며, 앞으로 삭제될 것이라는 점을 알림.
  • @Override : 해당 메서드가 재정의되었음을 알린다. (생략가능, 근데 하면 안 됨)
  • @FunctionalInterface : 해당 인터페이스가 함수형 인터페이스(Functional Interface)임을 알림.

Optional

Optional

  • 값이 null인 어떠한 타입에 대해 유연히 대처할 수 있는 수단을 제공한다.
  • 정적 메서드
  1. <T타입>of(x) : <Optional<T타입>> T타입을 제네릭으로 가지는 Optional 객체를 반환한다. 이 때 Optional이 가지고 있는 값은 T타입의 객체 x이다. 단, 이때 x는 반드시 null이 아니어야함.
  2. <T타입>ofNullable(x) : <Optional<T타입>> 위 <T타입>of(x)와 같으나 x가 null일 수도 있는 상황에 사용한다.
  3. <T타입>empty() : <Optional> 아무런 값도 가지지 않은 T타입을 제네릭으로 가지는 Optional 객체를 반환한다.
  • 비정적 메서드
  1. get() : <T타입>Optional 객체가 가지고 있는 T타입의 객체를 반환한다.
  2. isPresent() : <boolean타입> Optional 객체가 값을 가지고 있는가에 대한 여부를 반환한다.
  3. orElse(x) : <T타입>만약 Optional 객체가 값을 가지고 있다면 그 값을, 값을 가지고 있지 않다면 T타입의 객체 x를 반환한다.
  4. isPresent() : <boolean타입> Optional 객체가 값을 가지고 있는가에 대한 여부를 반환한다.

의존성 관리자 Maven

  • 의존성 관리자(Dependency Manager)는 해당 프로젝트가 어떠한 다른 프로젝트에 의존적인 부분을 관리한다.
  • 의존성 검색은 주로 https://mvnrepository.com 에서 한다. (다른 방법도 많음)
  • 의존성 관리자에는 종류가 여럿 있으나 주로 메이븐(Maven, xml 타입) 혹은 그래들(Gradle, YAML 타입등)을 사용한다.
  • <프로젝트 루트>/pom.xml : 메이븐 의존성 관리자의 파일이고 프로젝트의 이름, 버전 및 의존성 등에대한 정보가 적혀있다.
  • <groupId.> : 프로젝트 소유자 혹은 프로젝트와 긴밀히 관련되어 있는 도메인의 역순인 패키지 경로.
  • <artifactId.> : 의존성 관리자에서 식별 가능한 프로젝트의 이름
  • <version.> : 의존성 관리자에서 사용하는 프로젝트의 버전.
  • <dependencies.> : 해당 프로젝트의 의존

    정말 다양한 메서드가 존재한다.

  • 많이 쓰는 의존성
  1. Apache Commons Lang3(org.apache.commons) : Java 개발시 전역적으로 적용할 수 있는 편의 기능을 제공한다.(문자열, 숫자, 날짜 등과 관련된 것들의 편의기능)
  2. Apache Commons IO(org.apache.commons) : 입출력과 관련된 편의기능을 제공한다. (파일 입/출력 등)
  3. JSON in Java(org.json) : JSON 타입의 데이터 규격과 관련된 타입을 제공한다. (JSON Object, JSON Array 등)
  4. Slf4j (rog.slf4j) : 클래스 엔티티(Entity)와 관련된 어노테이션 및 편의기능을 제공한다.(@Getter, @Setter 등)
  5. Apache Log4j (log4j) : 로그와 관련된 기능을 제공한다. (매우 빠름)
  6. JUnit (junit) : Java 단위 테스트(Unit Test)를 위한 기능을 제공한다.
  7. MySQL Connector/J (mysql) : MySQL DBMS에 JDBC 프로토콜을 이용하여 접속을 제공하기 위한 의존성.
  8. MariaDB Java Client (org.mariadb.jdbc) : MariaDB DBMS에 JDBC 프로토콜을 이용하여 접속을 제공하기 위한 의존성.

단위 테스트

  • 프로젝트 전체를 실행하여 특정 기능을 테스트하는 것이 아닌 그 특정 기능을 분리하여 단위별로 테스트하는 것.
  • 단위 테스트를 하는 방법은 많지만 JUnit 의존성을 추가하여 이를 통해 단위 테스트를 실시한다.
  • 단위 테스트를 위한 클래스는 프로젝트/src/test/java 안에 작성한다.
  • 테스트할 대상이 되는 클래스와 동일한 패키지 구조아래에 '대상 클래스이름 + Test'라는 이름을 가지는 테스트용 클래스를 만든다.
  • 테스트용 클래스내에 메서드의 이름은 'test + 테스트할 대상 메서드이름'으로 짓는다.
  • 테스트 메서드에는 @org.junit.Test 어노테이션을 붙인다. (그래야 실행이 된다.)
  • Assertion (가정 설정)
    1. org.junit.Assert 클래스 활용
    2. 정적 메서드
    - assertEquals(x, y) : 참조 타입 객체 x와 y에 대해 equals 메서드 호출 결과가 참이라고 가정. 거짓일 경우 테스트 실패.
    - assertNotEquals(x, y) : 참조 타입 객체 x와 y에 대해 equals 메서드 호출 결과가 거짓이라고 가정. 참일 경우 테스트 실패.
    - assertSame(x, y) : 참조 타입 객체 x와 y가 동일한 객체임을 가정. 다른 객체인 경우 테스트 실패.(== 비교)
    - assertNotSame(x, y) : 참조 타입 객체 x와 y가 다른 객체임을 가정. 같은 객체인 경우 테스트 실패.(!= 비교)
    - assertArrayEquals(x, y) : 참조 타입 배열 객체 x와 y에 대해 각 원소가 가지는 탐조 타입 객체에 대한 .equals 메서드 결과가 모두 참임을 가정. 거짓일 경우 테스트 실패.
    - assertFalse(x) : 주어진 조건 x가 거짓임을 가정. 참일 경우 테스트 실패.
    - assertTrue(x) : 주어진 조건 x가 참임을 가정. 거짓일 경우 테스트 실패.
    - assertNull(x) : 주어진 값 x가 null이라고 가정. null이 아닌 경우 테스트 실패.
    - assertNotNull(x) : 주어진 값 x가 null이 아니라고 가정. null인 경우 테스트 실패.

M2 로컬 저장소(Local Repository)

  • 다른 프로젝트에서 개발했던 내용을 의존성 으로 사용하기 위해 존재하는 개념이다. (mvnrepository.com의 나만의 , 오프라인버전)
profile
백엔드 개발자가 되기 위한 여정

0개의 댓글