오늘은 열거형, 어노테이션 , 람다, 스트림, 파일 입출력을 공부했는데 생각보다 굉장히 어려웠다!!
그래도 주문했던 '자바의 정석' 책이 오늘 도착한 덕에 부족한 부분들까지 채워나갈수있을것같다!!!
오늘부턴 그동안 블로깅했던것과 다른 방식으로 작성할 예정이다.
부디 잘 정리할 수 있길ㅜㅜ
열거형 : 서로 관련된 상수들을 보다 편리하게 선언하기 위한 자바의 문법요소이다.
상수 : 변하지 않는 값. 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) // 컴파일 에러 발생. 타입이 다름.
enum 열거형이름 {상수명1, 상수명2, ...}
위와 같이 정의하면된다.
열거형에 정의된 상수를 사용하는 방법은 열거형이름.상수명
이다.
상수는 관례적으로 대문자로 작성한다.
각각의 상수들에게 값을 지정하지 않아도 0부터 할당되며 각각의 상수를 가리킨다.
enum 을 사용하면 변경되지않는 한정적인 데이터들을 효과적으로 관리할수있다.
Annotation : 주석이라는 의미를 갖고있다.
사람입장에서 코드를 설명하던 주석(Comment) 와는 다른 주석으로, 어노테이션은 특정 코드를 사용하는 '프로그램' 에게 정보를 전달하는 역할이다.
주요역할
어노테이션은 테스트를 수행하는 프로그램 외의 다른 프로그램에게 영향을 주지 않는다.
어노테이션에는 표준 어노테이션, 메타 어노테이션, 사용자 정의 어노테이션이 있다.
표준 어노테이션 : 자바에서 기본으로 제공하는 어노테이션
메타 어노테이션 : 어노테이션에 붙이는 어노테이션으로 어노테이션을 정의하는데 사용한다.
사용자 정의 어노테이션 : 사용자가 직접 정의하는 어노테이션. 될수있다면 표준과 메터 어노테이션 이용하는 것을 권장한다.
어노테이션은 java.lang.annotation 인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속받을 수 없다.
함수형 프로그래밍 기법을 지원하는 자바의 문법요소
메서드를 하나의 식으로 표현
코드를 간결하면서도 명확하게 표현할 수 있다는 장점
반환타입과 이름 생략 가능, 익명함수라고도 부름
실행문이 하나만 존재할 때 중괄호 생략 가능
매개변수 타입 유추 가능할 때 매개변수 타입 생략 가능
람다식 = 객체
이름도 없기에 익명 클래스라 할 수 있음
익명클래스 : 객체의 선언과 생성을 동시에 해서 하나의 객체를 생성하고, 한번만 사용되는 일회용 클래스
람다식은 객체이기 때문에 인터페이스에 정의된 추상메서드 구현 가능
단 함수형 인터페이스는 하나의 추상메서드만 선언.
정적메서드를 참조할 때 클래스 이름 뒤에 :: 을 붙이고 정적메서드이름 기술
인스턴스 메서드를 참조할 때 객체를 먼저 생성 후, 참조변수뒤에 :: 붙이고 인스턴스 메서드 이름 기술
생성자 참조는 클래스 이름 뒤에 :: 붙인 후 new 연산자 기술
스트림은 배열과 컬렉션의 요소를 하나씩 참조하여 람다식으로 처리할 수 있게 도와주는 반복자
스트림을 이용하면 선언형으로 데이터소스를 처리함
람다식 또는 메서드 참조를 이용해서 요소처리내용을 매개값으로 전달 가능
외부반복자 : 개발자가 직접 코드로 컬렉션의 요소를 반복하여 갖고오는 패턴
내부반복자 : 컬렉션의 내부에서 요소를 반복시키고 개발자는 요소당 처리해야할 코드만 제공하는 코드 패턴
스트림은 람다식으로 요소처리내용만 전달하고 반복은 컬렉션의 내부에서만 일어남.
스트림은 컬렉션의 요소에 대해 중간연산과 최종 연산 수행 가능
대량의 데이터를 가공해서 축소하는걸 리덕션(Reduction) 이라 함
위와 같이 여러개의 스트림이 연결되어있는 구조를 의미
최종연산 제외 모두 중간연산 스트림
중간스트림이 시작될때 중간연산이 시작되는 것이 아닌 최종연산이 시작되기 전까지 지연
최종연산이 시작되면 컬렉션의 요소가 중간스트림에서 연산되고 최종연산을 함.
Collection 인터페이스에는 stream()이 정의되어있기에 컬렉션 인터페이스를 구현한 객체들은 모두 스트림을 생성 가능
스트림 사용시 주의