코드스테이츠 백엔드 18일, 19일차 | 자바 심화

hyoreal·2022년 8월 2일
0

CodeStates

목록 보기
21/32

오늘은 열거형, 어노테이션 , 람다, 스트림, 파일 입출력을 공부했는데 생각보다 굉장히 어려웠다!!
그래도 주문했던 '자바의 정석' 책이 오늘 도착한 덕에 부족한 부분들까지 채워나갈수있을것같다!!!
오늘부턴 그동안 블로깅했던것과 다른 방식으로 작성할 예정이다.
부디 잘 정리할 수 있길ㅜㅜ


열거형(enum)

열거형 : 서로 관련된 상수들을 보다 편리하게 선언하기 위한 자바의 문법요소이다.

상수 : 변하지 않는 값. final 키워드 통해 선언가능하다.

class Card {
	static final int CLOVER = 0;
    static Final int HEART = 1;
    static final int DIAMOND = 2;
    static final int SPADE = 3;
    
    static final int TWO = 0;
    static final int THREE = 1;
    static final int FOUR = 2;
    
    final int kind;
    final int num;
}
  • 기존에 상수를 설정할때 위와 같이 설정했는데 이 코드에서 상수값이 바뀌면 해당 상수를 참조하는 모든 소스들을 다시 컴파일 하는 등 굉장히 번거로웠다.

  • 기존에 많은 언어들이 타입은 다르지만 리터럴(값)이 같다면 조건식 결과가 true였기에 타입 안정성이 매우 떨어졌다.

  • 자바의 열거형은 "타입에 안전한 열거형(typesafe enum)" 이기에 실제 값이 같아도 타입이 다르면 컴파일 에러가 발생한다.

class Card {
	enum Kind { CLOVER , HEART , DIAMOND , SPADE }
    enum Value { TWO , THREE , FOUR }
    
    final Kind kind;
    final Value value;
}

if(Card.CLOVER == Card.TWO) // true 출력, 하지만 타입이 다르기에 false가 출력해야 맞다.
if(Card.Kind.CLOVER == Card.Value.TWO) // 컴파일 에러 발생. 타입이 다름.
  • 열거형은 위와 같이 타입 안정성이 보장되고, 여러 상수들을 편리하게 선언 및 관리하며, 상수명의 중복도 피할 수 있고 switch문에서도 작동이 가능하다.

열거형의 정의와 사용

enum 열거형이름 {상수명1, 상수명2, ...}
  • 위와 같이 정의하면된다.

  • 열거형에 정의된 상수를 사용하는 방법은 열거형이름.상수명 이다.

  • 상수는 관례적으로 대문자로 작성한다.

  • 각각의 상수들에게 값을 지정하지 않아도 0부터 할당되며 각각의 상수를 가리킨다.

  • enum 을 사용하면 변경되지않는 한정적인 데이터들을 효과적으로 관리할수있다.


Annotation

  • Annotation : 주석이라는 의미를 갖고있다.

  • 사람입장에서 코드를 설명하던 주석(Comment) 와는 다른 주석으로, 어노테이션은 특정 코드를 사용하는 '프로그램' 에게 정보를 전달하는 역할이다.

  • 주요역할

    • 컴파일러에게 문법에러 체크하도록 정보제공
    • 프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보 제공
    • 런타임에 특정 기능을 실행하도록 정보제공
  • 어노테이션은 테스트를 수행하는 프로그램 외의 다른 프로그램에게 영향을 주지 않는다.

Annotation 종류

  • 어노테이션에는 표준 어노테이션, 메타 어노테이션, 사용자 정의 어노테이션이 있다.

  • 표준 어노테이션 : 자바에서 기본으로 제공하는 어노테이션

    • @Override : 컴파일러에게 메서드를 오버라이딩이라고 알린다.
    • @Deprecated : 이전에 사용하던 필드나 메서드를 새로운 필드나 메서드로 바꿨지만 없애기는 곤란 할 때 앞으로는 새로운 코드로 대체되었으니 이 코드는 사용하지 말라고 알린다.
    • @FunctionalInterface : 함수형 인터페이스가 제대로 정의되었는지 알린다.
    • @SuppressWarning : 컴파일러에게 해당 코드에서의 경고메세지는 무시하라고 알린다.
  • 메타 어노테이션 : 어노테이션에 붙이는 어노테이션으로 어노테이션을 정의하는데 사용한다.

    • @Target : 어노테이션을 정의할 대상을 지정하는데 사용한다.
    • @Documented : 어노테이션 정보를 javadoc 으로 작성된 문서에 포함시킨다.
    • @Inherited : 어노테이션이 하위클래스에 상속되도록 한다.
    • @Retention : 어노테이션이 유지되는 기간을 정하는데 사용한다.
    • @Repeatsble : 어노테이션을 반복하여 적용할 수 있게 한다.
  • 사용자 정의 어노테이션 : 사용자가 직접 정의하는 어노테이션. 될수있다면 표준과 메터 어노테이션 이용하는 것을 권장한다.

  • 어노테이션은 java.lang.annotation 인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속받을 수 없다.

Lambda

  • 함수형 프로그래밍 기법을 지원하는 자바의 문법요소

  • 메서드를 하나의 식으로 표현

  • 코드를 간결하면서도 명확하게 표현할 수 있다는 장점

  • 반환타입과 이름 생략 가능, 익명함수라고도 부름

  • 실행문이 하나만 존재할 때 중괄호 생략 가능

  • 매개변수 타입 유추 가능할 때 매개변수 타입 생략 가능

  • 람다식 = 객체

  • 이름도 없기에 익명 클래스라 할 수 있음

  • 익명클래스 : 객체의 선언과 생성을 동시에 해서 하나의 객체를 생성하고, 한번만 사용되는 일회용 클래스

  • 람다식은 객체이기 때문에 인터페이스에 정의된 추상메서드 구현 가능

  • 단 함수형 인터페이스는 하나의 추상메서드만 선언.

    • 람다식과 인터페이스가 1 : 1로 매칭되기 때문

    함수형 인터페이스

    함수형 인터페이스2

  • 정적메서드를 참조할 때 클래스 이름 뒤에 :: 을 붙이고 정적메서드이름 기술

  • 인스턴스 메서드를 참조할 때 객체를 먼저 생성 후, 참조변수뒤에 :: 붙이고 인스턴스 메서드 이름 기술

  • 생성자 참조는 클래스 이름 뒤에 :: 붙인 후 new 연산자 기술

    • 생성자가 오버로딩되어 여러개가 있는 경우, 함수형 인터페이스의 추상메서드와 동일한 매개변수 타입과 개수를 가지고 있는 생성자를 찾아 실행.

Stream

  • 스트림은 배열과 컬렉션의 요소를 하나씩 참조하여 람다식으로 처리할 수 있게 도와주는 반복자

  • 스트림을 이용하면 선언형으로 데이터소스를 처리함

  • 람다식 또는 메서드 참조를 이용해서 요소처리내용을 매개값으로 전달 가능

  • 외부반복자 : 개발자가 직접 코드로 컬렉션의 요소를 반복하여 갖고오는 패턴

  • 내부반복자 : 컬렉션의 내부에서 요소를 반복시키고 개발자는 요소당 처리해야할 코드만 제공하는 코드 패턴

  • 스트림은 람다식으로 요소처리내용만 전달하고 반복은 컬렉션의 내부에서만 일어남.

  • 스트림은 컬렉션의 요소에 대해 중간연산과 최종 연산 수행 가능

  • 대량의 데이터를 가공해서 축소하는걸 리덕션(Reduction) 이라 함

  • 위와 같이 여러개의 스트림이 연결되어있는 구조를 의미

  • 최종연산 제외 모두 중간연산 스트림

  • 중간스트림이 시작될때 중간연산이 시작되는 것이 아닌 최종연산이 시작되기 전까지 지연

  • 최종연산이 시작되면 컬렉션의 요소가 중간스트림에서 연산되고 최종연산을 함.

  • Collection 인터페이스에는 stream()이 정의되어있기에 컬렉션 인터페이스를 구현한 객체들은 모두 스트림을 생성 가능

  • 스트림 사용시 주의

    • 스트림은 데이터 소스로부터 데이터를 읽을 뿐 변경X
    • 스트림은 일회용. 한번 사용하면 끝. 또 사용해야한다면 새로운 스트림 생성해야함
profile
좌충우돌 코린이 성장기

0개의 댓글