데브코스 W2D4~5 TIL

백엔드 데브 코스 중 중요한 개념을 정리하거나 과제 개발 일지를 정리한 공간입니다.

Collection

여러 개의 데이터를 효과적으로 처리할 수 있는 방법을 제공하는 클래스의 집합이다.

  • List 인터페이스
    Vector, ArrayList, LinkedList, Stack, Queue
  • Set 인터페이스
    HashSet, TreeSet
  • Map 인터페이스 (List, Set과 다르게 별도로 정의함)
    HashMap, TreeMap, Hashtable, Properties

Generic

데이터 타입을 일반화하는 것을 의미하고 클래스나 인터페이스, 메소드에서 사용할 데이터 타입을 파라미터로 사용할 수 있다. 컴파일 시에 미리 타입 검사를 수행하기 때문에 객체의 타입 안정성을 높일 수 있고 반환값에 대한 타입 검사와 타입 변환에 들어가는 노력을 줄일 수 있다는 장점을 가졌다. 아래 예제 코드에서 T는 임의의 참조형 타입 변수이다. 해당 클래스를 생성할 때는 타입 변수에 실제 사용할 객체의 타입을 명시해야 된다.

Class MyArray<T> {
	T element;
    
    void setElement(T element) {
    	this.element = element;
    }
    
    T getElement() {
    	return element;
    }
}

+ 주로 사용되는 타입 표현

<T>: Type
<E>: Element
<K>: Key
<N>: Number
<V>: Value
<R>: Result

+ Generic Wild Card

<?> : 모든 클래스나 인터페이스 타입이 파라미터로 가능
<? extends 클래스> : 특정 객체의 자식 클래스만 파라미터로 가능
<? super 클래스> : 특정 객체의 부모 클래스만 파라미터로 가능

Method Chaining

여러 메소드 호출을 연결해 하나의 실행문으로 표현하는 문법 형태를 말한다. 오른쪽의 메소드부터 차례대로 호출되고 각 반환이 호출할 수 있는 메소드를 이어서 호출해야 메소드 체이닝이 정상적으로 작동한다.

+ Builder Pattern

메소드 체이닝 방식을 사용한 인스턴스 생성 디자인 패턴이고 메소드의 return을 꼭 this로 해서 클래스의 여러 개의 메소드 호출을 한 줄로 표현할 수 있도록 했다. 빌더 패턴은 필수적인 생성자 매개변수와 선택적인 매개변수에 대한 생성자 호출 방식을 간단하게 힐 수 있는 장점을 가지고 있어서 속성이 많은 클래스 생성에서 주로 사용한다.

public class User {
    private String name;    // 필수
    private int age;    	// 필수 
    private String email;   // 선택
	private String address;   // 선택
   
   //User의 생성자 매개변수 전달 역할을 한다.
   public static class Builder {
       private String name = "홍길동";
       private int age = 0;
       private String email = "[email protected]";
       private String address = "없음";
	   //필수 매개변수에 대한 생성자
       public Builder(String name, int age) {
           this.name = name;
           this.age = age;
       }

       public Builder age(int age) {
           this.age = age;
           return this;
       }

       public Builder email(String email) {
           this.email = email;
           return this;
       }

       public User build() {
           return new User(this);
       }
   }

   public User(Builder builder) {
       this.name = builder.name;
       this.age = builder.age;
       this.email = builder.email;
       this.address = builder.address;
   }

    public static void main(String[] args) {
        User user = new Builder("김코딩", 24)
                .email("[email protected]")
                .build();
    }
}
 

Stream

Java 8에서 추가된 스트림은 람다를 활용할 수 있는 데이터의 흐름을 말한다. 여러 개의 함수를 조합해서 데이터의 연속을 원하는 결과로 필터링하고 가공할 수 있는 장점을 가진 특징이다. 또한 병렬처리 역시 가능해서 많은 요소들을 빠르게 처리할 수 있는 장점을 가졌다. Collection 객체 역시 stream이 제공되어있다.

//스트림 생성 메소드
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> listStream = list.stream();
Stream<String> stream = Stream.of("a", "b", "c"); 
Stream<String> stream = Stream.of(new String[] {"a", "b", "c"}); 
Stream<String> stream = Arrays.stream(new String[] {"a", "b", "c"});

//조건을 만족하는 stream으로 가공
Stream<T> filter(Predicate<? super T> predicate)
//데이터가 변환된 stream으로 가공 
<R> Stream<R> map(Function<? super T,? extends R> mapper)
//유일한 element만 stream으로 가공
Stream<T> distinct()
//데이터가 정렬된 stream으로 가공
Stream<T> sorted()
Stream<T> sorted(Comparator<? super T> comparator)
//maxSize만큼의 stream으로 가공 
Stream<T> limit(long maxSize)
//stream의 있는 모든 데이터에 대한 처리
void forEach(Consumer<? super T> action)

참고링크

Optional

개발 중 발생하는 NPE(Null Pointer Exception) 문제를 해결하기 위해 NULL을 return하지 않고 빈 객체값을 보내자는 통용적인 규칙이 있지만 빈 객체값 자체가 하나의 데이터로 판단되는 애매함이 존재하는 경우가 생기기 때문에 등장한 Java의 기능이다. Optional<T>의 기능은 NULL이 올 수 있는 값을 감싸는 Wrapper 클래스로 static 변수로 empty 객체를 가지고 있어 메모리를 절약할 수 있다. (여기서 empty인스턴스 생성에 대한 싱글톤 패턴이 사용된다.)

//Optional 클래스 구성
public final class Optional<T> {
    //빈 객체 
    private static final Optional<?> EMPTY = new Optional<>();
    private final T value;
    
    private Optional() {
        this.value = null;
    }
    ...
}
//빈 객체 생성 메소드
Optional<String> optional = Optional.empty();
//값이 있는 객체 생성 메소드
Optional<String> optional = Optional.of("MyName");
// 비거나 값이 있는 객체에 대한 생성 메소드
Optional<String> optional = Optional.ofNullable(getString());

//없는 경우를 고려한 메소드 처리
String name = optional.orElse("no name");
String name = optional.orElseGet(()->"no name");
String name = optional.orElseThrow(noSuchElementException::new);

//stream과 같은 메소드가 지원되고 
//이를 활용한 method chaining이 가능하다.


Annotation

  • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
  • 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공
  • 실행시(런타임시)특정 기능을 실행하도록 정보를 제공

@Override
선언한 메서드가 오버라이드 되었다는 것을 나타내고 만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생한다.

@FunctionalInterface
Java8 부터 지원하며, 함수형 인터페이스를 지정하는 어노테이션으로 만약 메서드가 존재하지 않거나, 1개 이상의 메서드(default 메서드 제외)가 존재할 경우 컴파일 오류를 발생한다.

lombok

클래스 메소드 자동 생성과 관련해서 편리한 코드 작성을 지원해주는 어노테이션이다.

  1. build.gradle 파일 작성을 통한 세팅
repositories {
	mavenCentral()
}

dependencies {
	compileOnly 'org.projectlombok:lombok:1.18.22'
	annotationProcessor 'org.projectlombok:lombok:1.18.22'
	
	testCompileOnly 'org.projectlombok:lombok:1.18.22'
	testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
}
  1. Inteilij에서 setting>plugins>lombok 설치

@NoArgsConstructor
기본 생성자 자동생성
@RequiredArgsConstructor
필수 매개변수를 받는 생성자 자동생성(필수 매개변수는 final이나 @NonNull인 변수에 대해서 생성)
@AllArgsConstructor
모든 매개변수를 받는 생성자 자동 생성
@Getter
특정 필드 값을 가져오는 메소드 자동 생성
@Setter
특정 필드 값 수정 메소드 자동 생성
@ToString(exclude = "password")
특정 필드를 제외한 string 반환 메소드 자동 생성

좋은 웹페이지 즐겨찾기