코드의 가독성과 재사용성을 높이기 위해 매우 자주 사용된다.같은 이름의 메서드를 매개변수(Parameter)만 다르게 하여 여러 개 정의하는 것. 즉, 메서드 이름은 같되, 매개변수의 개수나 타입이 다르면 여러 메서드를 정의할 수 있다.같은 기능을 다양한 방식으로 처리
캡슐화란, 객체의 필드(변수)를 외부에서 직접 접근하지 못하도록 막고, 메서드를 통해서만 접근할 수 있도록 제한하는 것.필드를 private으로 선언public getter/setter 메서드로만 접근 허용외부에서 마음대로 필드 값을 변경할 수 있음잘못된 값으로 인
컴파일 에러에 커서를 두고 컨트롤 + 1를 하면 해결책을 제시해 줌.
생성자는 클래스로부터 객체를 생성할 때 호출되는 특별한 메서드.클래스 이름과 동일한 이름을 가지며, 리턴 타입이 없다. 위 코드에서 Person 클래스의 생성자는 객체가 생성될 때 자동으로 호출되어 name과 age 값을 초기화해 준다. 생성자를 하나도 정의하지 않으
char는 문자 하나를 저장할 수 있는 기본 자료형(primitive type).크기: 2바이트(16비트)저장 방식: 유니코드 (Unicode) 기반기본값: \\u0000 (null 문자)참고: 'A'처럼 작은 따옴표(single quote)로 감싸야 한다. 큰따옴표(
IS A 관계가 성립되지 않는 경우 상속은 추천되지 않는다.예를 들어 'Student IS A Person'이라 해서 Student와 Person은 상속 관계가 되지만, 클래스의 속성이 서로 IS A 관계가 성립되지 않을 경우에는 상속은 별로다.
상속이란 부모 클래스의 속성과 메서드를 자식 클래스가 물려받는 기능이다.위 예제에서 Dog 클래스는 Animal 클래스를 상속받아 eat() 메서드를 사용할 수 있다.extends 키워드를 사용해 상속을 구현한다.자식 클래스는 부모 클래스의 필드와 메서드를 그대로 사용
추상화(Abstraction)는 복잡한 시스템에서 핵심적인 부분만을 추려내어 단순화하는 것. 즉, 필요한 기능만 보여주고, 불필요한 구현 세부사항은 숨기는 것.사용자는 어떤 기능이 무엇을 하는지만 알면 되고, 어떻게 동작하는지는 몰라도 된다는 개념이다.전자레인지를 사용
인터페이스(Interface)는 일종의 설계도.어떤 클래스가 꼭 가져야 할 기능의 틀만 정의하고, 실제 동작은 구현하지 않는다.위 코드에서 sound() 메서드는 구현이 없는 껍데기.이 인터페이스를 구현한 클래스는 반드시 sound() 메서드를 정의해야 한다.예시Dog
ArrayList는 자바에서 제공하는 동적 배열(Dynamic Array).기존 배열(Array)과 다르게 크기를 정하지 않아도 되고, 요소를 자유롭게 추가하거나 제거할 수 있다.java.util 패키지에 포함내부적으로 배열을 사용하지만, 자동으로 크기를 조절함순차적
LinkedList는 데이터를 노드(Node)라는 단위로 연결해서 저장하는 연결형 자료구조. Java에서는 java.util.LinkedList 클래스로 제공되며, List, Deque, Queue 인터페이스를 구현한다.✅ 자바의 LinkedList는 이중 연결 리스트
Queue는 먼저 들어온 데이터가 먼저 나가는(First-In-First-Out) 구조.주로 작업 예약, 메시지 처리, 버퍼 등 순차적 처리에 많이 사용ehls다.자바에서는 java.util.Queue 인터페이스로 제공된다.자바에서는 Queue 인터페이스를 직접 사용할
Vector는 자바의 List 인터페이스를 구현한 클래스 중 하나로, 내부적으로 배열을 사용하여 데이터를 저장한다.하지만 ArrayList와는 다르게 동기화(synchronization)를 지원하기 때문에 멀티스레드 환경에서 유용할 수 있다.현실적으로는 거의 사용하지
트리는 계층적으로 데이터를 구성할 수 있는 비선형 자료구조. 노드(Node)들로 이루어져 있고, 노드 간에는 부모-자식 관계가 존재한다.루트(Root): 트리의 가장 위에 있는 노드리프(Leaf): 자식이 없는 노드간선(Edge): 노드를 연결하는 선서브트리(Subtr
Set은 자바의 Collection 인터페이스를 상속받는 중복을 허용하지 않는 집합.순서를 보장하지 않으며, 오직 유일한 값만 저장할 수 있다.Set은 중복을 허용하지 않기 때문에, 객체를 저장할 때는 equals()와 hashCode()를 반드시 재정의해야 한다.정렬
자바에서 Map은 Key와 Value 쌍으로 데이터를 저장하는 자료구조. 배열이나 리스트처럼 순서대로 저장되지 않고, Key를 통해 Value에 접근할 수 있다.가장 자주 쓰이는 Map 구현체로는 HashMap, TreeMap, LinkedHashMap 등이 있다.Ke
제네릭(Generics)은 클래스나 메서드를 정의할 때 데이터 타입을 일반화(파라미터화) 해서 코드의 재사용성과 타입 안정성을 높이는 기능이다.타입 안정성 보장컴파일 시점에 타입을 체크할 수 있어 오류를 줄일 수 있음형변환 제거불필요한 캐스팅을 줄일 수 있음코드 재사용
람다식은 익명 함수(이름 없는 함수)를 간단하게 표현하는 방식이다. 주로 함수형 인터페이스(Functional Interface)의 구현을 간결하게 작성할 때 사용한다.람다식을 사용하려면 인터페이스에 추상 메서드가 하나만 있어야 한다. 이를 함수형 인터페이스라고 한다.
Stream은 자바에서 배열이나 컬렉션(리스트, 셋 등)의 요소들을 함수형 스타일로 처리할 수 있게 해주는 기능이다.즉, for문 대신 filter(), map(), collect() 같은 메서드들을 체인처럼 연결하여 데이터를 선언형으로 처리할 수 있다.기존 방식:St
스트림 연산은 크게 두 가지로 나뉜다:중간 연산 (Intermediate Operation)→ 스트림을 가공하며, 스트림을 반환한다. Lazy(지연 연산) 특성을 가진다.최종 연산 (Terminal Operation)→ 스트림을 소비하며, 결과를 반환하거나 출력한다.설
스트림 파이프라인의 마지막에 위치하며,스트림을 소비하고 결과를 반환하거나 출력하는 연산이다.스트림을 한 번만 소비하고 나면 재사용할 수 없다.결과값을 반환하거나, 출력, 저장, 집계 등의 작업을 수행한다.종단 연산이 호출되기 전까지는 중간 연산도 실제로 실행되지 않는다
Optional은 Java 8부터 추가된 null을 명시적으로 다루기 위한 컨테이너 클래스다.즉, 값이 있을 수도 있고 없을 수도 있는 객체를 감싸서 NullPointerException을 방지하고, 더 읽기 쉬운 코드를 만들 수 있도록 도와준다.값이 절대 null이
Predicate<T>는 하나의 입력을 받아 true 또는 false를 반환하는 함수형 인터페이스다.즉, 특정 조건을 검사하는 용도로 쓰이며, Stream API의 filter 메서드 등과 함께 자주 사용된다.가장 기본적인 메서드. 입력값에 대해 조건을 검사한다.
Function<T, R>은 입력값 T를 받아 결과값 R을 반환하는 함수형 인터페이스다.즉, apply() 메서드 하나만 구현하면 되고, 람다식으로 쉽게 표현할 수 있다.위 예제에서는 String을 입력받아 Integer 길이를 반환하는 함수다.입력값을 받아 결과
Consumer<T>는 제네릭 인터페이스로, 하나의 인자를 받아 어떤 동작을 수행하지만 결과를 반환하지 않는 함수형 인터페이스다.T: 입력 파라미터의 타입accept(T t): 전달받은 값을 소비(consume)하는 메서드컬렉션 요소를 출력하거나 로깅할 때입력값에
함수형 프로그래밍은 순수 함수(Pure Function)를 사용하여 부수 효과(Side Effect)를 최소화하고, 프로그램의 상태 변화를 피하는 프로그래밍 패러다임입니다. 쉽게 말해, 수학 함수처럼 입력이 같으면 항상 같은 출력을 보장하고, 외부의 상태를 변경하지 않
간단히 말하자면 지휘자인 cpu 코어의 지시를 받아 코드를 실행시키는 곳이다.프로그램이 작동될 떄 한 개의 프로세스가 작동되는데, 스레드는 그 프로세스 안의 위치해 스택을 할당받는다.프로세스 안에는 여러 스레드가 있을 수 있는데 프로세스 안에 있는 힙, 데이터, 코드를
사용자 스레드는 핵심을 실행시키는 일반적인 스레드를 말한다.얘네가 다 끝나야지 비로소 실행이 끝난다.사용자 스레드와는 달리, 백그라운드에서 보조적인 역할을 하는 스레드다. 뒤에서 지원해주는 게임 속의 서포터라고도 할 수 있을 것 같다.얘네는 다 실행되지 않더라도 사용자
자바에서도 예상치 못한 문제 상황, 즉 예외가 발생할 수 있는데 이를 처리하는 것을 예외 처리라고 한다.프로그램의 안정성, 오류 분석 및 디버깅 용이, 사용자 경험 개선 등 여러 가지 이유로 반드시 해야 한다.데이터 입/출력, 네트워크 통신, 데이터 통신, 외부 api
스레드 이름을 출력시키면 \[스레드 고유의 id. 이름과 달리 겹칠 수 없다.threadId() 혹은 getId()로 얻을 수 있다.getName()으로 이름을 반환받고, 이건 겹칠 수 있다.스레드를 생성할 때 new Thread(Runable 이름, 스레드 이름) 형
unchecked Exception과는 달리, checked Exception인 경우 부모 클래스에서 예외를 던졌을 때 자식 클래스에서 같은 예외나 하위 예외를 던질 수 있다.만약 아무것도 던져주지 않았을 경우 자식 클래스는 어떠한 체크 예외도 던질 수 없다. 물론 u
스레드1.join()이라 했을 때 이를 호출한 스레드에서 스레드1의 작업이 끝날 떄까지 기다리게 하는 메서드다.때로는 다른 스레드로부터 결과를 받아야 할 때가 있는데 스레드는 실행 순서와 상관없이 결과가 출력되므로 코드들 나중에 작성해도 먼저 출력되기도 한다.따라서 결
sleep과 같은 메서드를 받아서 대기 중인 상태의 스레드를 강제로 깨울 수 있게 하는 것이다.스레드.inturrupt()로 인터럽트를 일으킬 수 있으며, InterruptException을 만나야지만 작동된다.예외 처리가 된 순간 인터럽트는 풀리고 스레드는 runna
급하지 않은 스레드가 다른 스레드에게 우선 순위를 양보하는 메서드다.sleep()으로 양보하게 해버리면 스레드 상태도 바뀌고 양보를 할 필요도 없는 상황에서 양보를 하게 된다. 하지만 yield()를 사용하면 양보를 하지 않아도 될 상황하지 않고 계속 실행될 수 있다.
간단히 말하자면 멀티 스레드일 때 한 스레드에서 자신의 캐시 메모리에만 변경된 값을 저장하고 메인 메모리나 다른 스레드의 캐시 메모리에까지 전달이 안 된 경우다. 즉 메모리에 변경된 값이 보이냐, 안 보이냐의 문제다.이는 cpu 환경이나 체제에 따라 달리 발생하기도 한
자바 메모리 모델을 줄여서 부르는 말이다. 멀티 스레드 환경에서 스레드 간의 상호작용을 부르는 말인데, 핵심은 happens-before 관계에 대한 정의다.한 동작이 다른 동작보다 먼저 보장된다는 것이다.이를 따르면 메모리 가시성이 보장된다. 간단히 얘기하자면 한 스
멀티 스레드일 경우 스레드가 같은 인스턴스를 가지고 거의 동시에 수행하도록 작업을 할 때가 있다. 그렇게 되면 결과가 예상대로 안 나올 수가 있다.예를 들어 잔액에서 출금액이 넘으면 안 되는 계좌에서 2개의 스레드가 동시에 출금을 하려하는데 먼저 스레드 1개가 뽑고 2
이름 그대로 동기화다. 공유 자원에 동시에 접근하게 되는 경쟁 상태를 해결하고 안전한 임계 영역을 만들기 위해 쓰여진다.좀 더 간단히 말하자면 멀티 스레드 상황에서 차례차례 스레드가 한 개씩 작업하게 되어 원하는 결과값이 나오게 된다. (동시에 작업할 경우 중간에 값
동기화의 단점을 해결하기 등장한 cocurent 라이브러리에 들어있느 기본 클래스 중 하나다.구성은 park(), parkNanos(nanos), unpark(thread) 등이 있다.park(): 스레드.park()로 사용하며, 이를 사용하면 스레드가 waiting
자바에서 기존 synchronized 단점을 극복하기 위해 도입하였다.동기화에는 무한 대기, 나중에 들어온 스레드가 먼저 락을 획득하는 공정성 문제가 있었는데 ReentrantLock을 사용하면 락을 더 유연하게 사용할 수 있게 된다.정확히는 Lock 인터페이스를 구
이들은 여러 스레드가 동시에 한정된 공유 자원을 사용할 때 발생하는, 소위 생산자-소비자 문제를 해결하기 위한 메서드들이다.생산자-소비자 문제에 대해서 간단히 설명하지면 데이터를 생산하는 생산자와 소비하는 소비자, 그리고 그 데이터를 일시적으로 저장하는 버퍼가 있다.
스레드 대기 집합을 만들어 내는 객체라 할 수 있다. 객체처럼 private final Condition 컨디션 이름 = ReentrantLock 락 이름.newCondition()으로 만들어 내며, 이렇게 해서 여러 개의 스레드 대기 집합 만들어 낼 수 있다.이렇게
생산자-소비자 문제를 해결하기 위해 도입된 큐. 특정 조건에 따라 스레드를 대기시키거나 boolean을 반환하거나 할 수 있다.생산자가 버퍼에 데이터를 집어넣거나 소비자가 데이터를 소비하는 걸 좀 더 편리하게 만들어 준다.ArrayBlockingQueue: 배열 기반으
멀티 스레드 환경에서 원자적 연산이 아닌 연산을 안전하게 할 수 있도록 해주는 클래스다.Integer 외에도 AtomicLong, AtomicBoolean 등 다양한 Atomic 클래스가 있다.한 마디로 더이상 쪼개질 수 없는 연산이다. ex) i = 1참고로 i++은
compare and set의 줄임말로, 원자적 연산이 아닌 연산을 원자적 연산으로 만들어 준다.정확히는 cpu에서 보낸 cas 명령어를 통해 compareAndSet 메서드의 연산이 원자적 연산이 된다.Atomic연산이름.compareAndSet(expectedVal
동시성 컬렉션 멀티 스레드 환경에서 Collection을 사용할 수 있게 해줍니다. java.util.concurrent 패키지에 있는데 cas 연산, 동기화, 락 등 다양한 방법들을 사용해서 멀티 스레드 환경에 맞게 최적화를 해놓았다. 종류 CopyOnWrite
스레드 관리를 쉽게 하기 위해서 사용하는 프레임워크다. 직접 스레드를 생성하기 보다는 Executor 프레임워크를 통해 스레드를 생성하는 경우가 많다. 정확히는 Executor가 아닌, 이를 구현한 ExecuotrService를 사용한다.이처럼 Executors.new
객체가 특정 클래스 또는 인터페이스의 인스턴스인지 여부를 런타임에 확인하는 데 사용되는 이항 연산자이다.조건문에 주로 사용되어 인터페이스의 인스턴스인지를 확인할 떄 주로 사용된다.자바 14부터 instanceOf 한 줄로 캐스팅이 가능하다.조건문 안에 있어도 캐스팅이
Runnable의 단점을 해결하기 위해 나온 인터페이스다.주로 run() 메서드가 문제다. void라 명시되어 있기 때문에 값을 return은 쓸 수 있지만, 특정 타입 값을 반환할 수 없다.게다가 checkedException을 던질 수가 없다.반면 Callable은
작업의 결과값을 미리 받고 원할 때 꺼낼 수 있게 해준다.Future<Integer> future = es.submit(new ExCallable());으로 생성하며, submit을 통해 Callable을 통해 작업을 받는다. 그러고는 ExecutorService
submit으로 작업 하나씩 집어넣는 대신, 컬렉션을 만들어 한꺼번에 넣을 수 있다.invokeAll()은 작업이 모두 완료되면 반환받는 것이고, invokeAny()는 먼저 완료된 작업을 반환받는 것이다. Timeout과 TimeUnit을 지정해 일정한 시간 동안 기
corePoolSize: 스레드풀에서 기본으로 관리되는 기본 스레드 수다.maximumPoolSize: 스레드풀에서 관리되는 최대 스레드 수다.keepAliveTime, TimeUnit unit: 초과 스레드가 대기 공간에서 작업을 안 하고 살아남을 수 있는 시간이다.
컴퓨터가 문자를 읽을 수 있도록 각 문자를 숫자로 변환시킨다.컴퓨터는 2진수만 받아들이므로 문자를 10진수로 변환해 저장한다.여기서 문자 집한이란 걸 통해 문자를 10진수의 수로 바꾸는데, 문자 집한에는 여러 가지가 있다.참고로 숫자를 다시 문자로 바꾸는 건 디코딩이다
InputStrem/OutputStream으로, 외부에서 데이터를 가져오거나 외부로 데이터를 보내는 것이다. 파일, 네트워크, 콘솔, 저장소 등 다양한 곳에 비슷한 메서드를 통해 데이터를 입출력할 수 있다.스트림을 사용할 때는 byte만 받을 수 있다. 파일로 데이터를
기본적으로 스트림은 바이트 단위만 받기 때문에 문자를 직접 보낼 수는 없다. 따라서 getBytes()로 인코딩하거나 new String(byte\[], 문자 조합)으로 디코딩을 해야한다. 다만, 이러한 작업을 간편하게 해주는 메서드들이 존재한다.Buffered처럼 O
객체를 직렬화하여 객체째로 파일이나 네트워크에 입출력할 수 있게 해준다.객체 직렬화는 객체를 바이트 형태로 바꿔 스트림을 통해 입출력할 수 있게 만들어 주는 것을 말한다.사용하려면 클래스에 Serializable 인터페이스를 구현해주어야 한다. 참고로 빈 인터페이스로
파일과 디렉터리를 만들어 준다. 경로는 Path라는 클래스를 사용한다. 기존의 File를 대체한다.경로를 만들어 준다. 경로와 파일명을 써준다고 해서 파일과 디렉토리가 만들어지진 않는다. 이렇게 만들어진 경로를 creatFile/Directory에 전달해 주어야 한다.
파일의 경로를 모두 다 적는 것. 예를 들어 /..이 있으면 계산하지 않고 그거까지 그대로 나온다. 절대 경로를 반환하는 Files 메서드는 path.toAbsolutePath()이다.경로가 시작된 곳이 기준점이 되는 경로.경로의 계산이 모두 끝난 경로다. 예를 들어
문자일 경우 write/read로 입출력하지 않고 좀 더 간편하게 문자를 보내거나 읽어올 수 있는 방법이 Files에 존재한다.경로, 문자, 문자 조합을 넣어주어 다 한 줄의 코드로 파일에 문자를 보내줄 수 있다.반대로 읽어올 수도 있다. 단 한 줄의 코드로. 파일에서
파일을 복사할 수 있는 방법 중 하나로 Input/OutputStream을 이용해서 읽고 온 것을 그대로 새로운 파일에 써주는 방법이 있다. 이런 방법보다 더욱 빠르게 할 수 있는 방법들이 존재한다.InputStream에서 가져온 걸 그대로 OutputStream에 보
인터넷으로 서로 다른 컴퓨터가 통신하기 위해서 필요한 인터넷 상의 컴퓨터주소다. 복잡한 인터넷망에서 정보가 잘 전달되기 위해서는 자신과 상대 컴퓨터의 주솔르 알아야 한다. 참고로 데이터 전달 단위는 패킷이다.Ip로만 전달하기에는 중간에 데이터가 손실될 수도 있고, 상대
이렇게 소켓을 활용하여 네트워크 프로그램을 만들 수 있다. 소켓은 서버와 데이터를 주고 받기 위한 스트림을 제공한다. 소켓에 ip와 port를 넣어주면 된다. 참고로 localhost는 127.0.0.1이라는 루프백 주소를 사용한다. 그래서 localhost라고 써주
예외 처리할 때 상당히 유용하다. 자동으로 close를 호출해서 자동으로 닫아주니까 말이다. 특히 네트워크 통신할 때 효과적이다.단순히 try-catch로 예외를 처리하면 여러 문제가 생길 수 있다. 작업할 때 터진 핵심 예외를 처리하래더니 닫힐 때 터진 부가 예외를
종료가 되더라도 자원 정리나 로그 기록 같은 종료 작업을 마무리하는 것을 말한다. 정상 종료일때는 셧다운 훅이 작동하고, 강제 종료일 때는 셧다운 훅이 작동하지 않는다. 이렇게 셧다운 훅을 만들어 낼 수 있다. 셧다운 훅이 실행되면 사용자 스레드가 실행이 완료되든 말든
TCP 연결 중에 여러 예외가 있다. 잘못된 ip, port이거나 네트워크 방화벽이 막았다거나 여러 예외가 발생할 수 있다.도메인이나 ip가 잘못됐을 때 발생하는 예외다.연결이 거절됐다는 예외로, 주로 포트가 잘못되었거나 네트워크 방화벽이 연결을 차단했을 때 발생한다.
강제 종료와 달리 절차를 거쳐 클라이언트와 서버가 정상적으로 종료가 된 경우를 말한다.서버측에서 close 호출.서버가 클라이언트 측에다가 fin 패킷을 보냄.그러면 클라이언트가 ack 패킷을 보내 응답.클라이언트가 close를 호출. 서버에다 fin + ack 패킷을
TCP 연결 중에 RCT 패킷을 받은 경우를 말한다. 주로 언제 받냐면 서버에서 close를 호출해서 연결을 끊으라고 FIN 패킷을 전달했지만 클라이언트에서 write나 read를 호출한 경우에 발생한다. 이외에도 방화벽에서 강제 종료할 때, TCP 버퍼에 있는 데이터
웹 환경에서 데이터를 주고받을 때 지켜야 하는 프로토콜이다.http 메세지로 바이트 형태의 모든 데이터를 주고받을 수 있다.메세지의 구조는 시작 라인, 헤더, 공백 라인, 메세지 바디로 이루어져 있다.클라이언트에서 요청할 때 보내는 메세지와 서버가 응답할 때 보내는 메
URl을 비롯한 http 시작 라인, 헤더에는 ASCII 문자만 올 수 있으므로 인코딩이 필수다. 바디에서는 UTF-8이 사용되므로 한국어를 비롯한 ASCII 문자가 아닌 문자도 올 수 있다.URL 인코딩할 때 주로 쓰이는 인코딩 방법은 퍼센트 인코딩이다. UTF-8의
웹 에플리케이션 서버는 클라이언트가 http 프로토콜에 따라 요청을 하면 그에 맞게 응답을 해주는 웹 서버 역할과 프로그램의 코드를 실행시켜주는 애플리케이션 역할을 같이 하는 서버다. url을 치고 들어가면 홈페이지가 나올 수 있게 해준다. 서블릿은 웹 서버의 비서
수정자, 필드, 생성자, 메서드를 포함한 클래스의 모든 메타데이터를 동적으로 분석하고 사용하는 걸 리플렉션이라 한다. 클래스의 메타데이터를 조회하는 방법으로는 세 가지가 있다. 이렇게 세 가지 방법이 있다. 참고로 Class<? extends BasicData>
리플렉션으로 메서드도 조회할 수 있다. Method\[] methods = basicClass.getMethods(); 이런 방식으로 메서드를 담은 배열을 만든 다음 반복문으로 돌려서 출력하거나 사용하면 된다. 메서드를 조회하는 메서드로는 두 가지가 있는 geMeth
리플렉션으로 필드도 탐색할 수 있다. 메서드랑 비슷하게 getFields와 getDeclaredFileds로 필드들을 가져오고 필드 배열 만들어 주면 된다. 필드 값도 변경해줄 수 있는데 이런 방식으로 set을 통해 간편하게 바꿀 수 있다. 여기서도 setAccessi
프로그램 코드처럼 사용할 수 있는 주석이라 이해하면 된다. 앞에 @가 붙어서 사용된다.기존 CamelCase 방식이 아닌 다른 방식으로 메서드나 클래스를 불러야 할 필요가 있을 때 애노테이션을 사용한다.애노테이션은 @interface를 만들어 사용한다. 이렇게 해서 만
자바에는 애노테이션을 만들어 사용하는 것 외에도 일반적으로 사용하는 애노테이션이 있다. @Override, @SuppressWarning, @Deprecated 등이 있다.메서드를 재정의할 때 사용된다. 상속이나 구현할 때 자주 볼 수 있는 에노테이션이다. 재정의할 때
숫자나 문자 같은 구체적인 값을 함수 내에 두는 게 아니라 매개변수로 해서 외부로부터 받는 것을 말한다. 이렇게 하면 재사용성을 높이고 메서드의 동작을 달리할 수 있다. 동작을 함수 내에 두는 게 아니라 외부에서 구현한 동작 로직을 매개변수로 가져오는 것을 말한다. 이
함수와 메서드의 가장 큰 차이점은 클래스(객체)에 속하는지 안 속하는지다. 함수는 클래스(객체)에 속하지 않는 독립적인 것이고, 메서드는 반대로 클래스(객체)에 속하는 것이다. 간단히 말하자면 메서드는 객체 안의 함수라고 할 수 있다.
단일 추상 메서드가 하나만 있는 걸 함수형 인터페이스라고 한다. 람다는 함수형 인터페이스에서만 쓸 수 있다.Mypredicate로 만들어서 람다를 사용할 수 있다. @FunctionalInterface는 단일 추상 메서드를 보장해주는 애노테이션이다. 두 개 이상의 메서
람다는 간결하게 사용해야 한다. 생략할 수 있는 건 생략하는 게 좋다. 단일 표현식이면 return과 중괄호를 생갹해주어야 한다. 매개변수가 1개이면 괄호를 생략할 수 있다. 매개변수 타입은 진작에 생략해 줄 필요가 있다.인터페이스와 시그니처도 일치해야 한다. 이름은
함수형 인터페이스에 제네릭을 넣어 필요한 타입에 맞춰 사용할 수 있다. 그러면 함수형 인터페이스 자체의 재사용성이 높아진다.람다는 인스턴스는 가지고 있지만, 자체에 타겟 타입은 없으므로 참조가 타입이 된다. 따라서 같은 시그니처라도 타입이 다르면 대입해서 사용할 수 없
프로그램이 어떻게 작동할지에 맞춰 정해주는 프로그래밍이다. 수행 절차를 명시하며 하나씩 자세하게 코드를 짠다. 주로 for문, if문으로 짤 때 명령형 프로그래밍이라고 볼 수 있다. 내부가 자세하게 구현되기 때문에 추상화는 낮은 수준이다. 장점은 세밀하게 제어할 수 있
앞에 static이 붙어 인스턴스 생성을 해주는 메서드다. 간단한 건 기본 생성자를 만들어 사용하면 되지만, 이미 생성된 객체가 있다면 그 객체를 반환한다거나 메서드 이름을 명시해야 하는 등 생성하는 과정에서 따로 처리해야할 게 있으면 사용한다. 이렇게 사용할 수 있다
개발자가 직접 for문으로 제어해주는 반복이다. 어떻게 반복할지 세밀하게 제어해줄 수 있다. 주로 break, continue로 세밀하게 제어해주어야 한다든가 간단한 구문일 경우 외부 반복을 쓴다.스트림의 forEach 등을 통해 무엇을 반복할지만 정해주는 반복이다.
가독성 람다는 많을 걸 생략하기 때문에 간결하다. 반면, 익명 클래스는 new 인스턴스명 같은 형식으로 생성해주어야 하는 등 좀 더 장황한 코드를 써야해서 좀 복잡한 면이 있다. this this 키워드에도 차이가 있다. 람다는 자신이 선언된 외부 클래스를 가리키
람다가 단순히 메서드를 호출해야할 경우 메서드 참조로 좀 더 간결하게 코드를 작성할 수 있다. 클래스명::메서드명 형태로 메서드 참조가 이루어진다.람다에서 메서드만 호출하는 경우가 꽤 있어 자주 쓰인다. 대표적으로 System.out::println이 있다.게다가 매개
최종 연산 호출 전까지는 중간 연산이 실행이 되지 않는 걸 말한다. 즉, 필요할 때까지 기다렸다가 중간 연산이 실행되기 때문에 불필요한 연산이 실행되지 않는다. 예를 들어 최종 연산이 없으면은 아에 그 스트림은 실행되지 않는다.하나의 중단 연산이 실행될 때 모든 데이터
스트림을 생성하는 데에는 여러 가지 방법이 있다.리스트나 셋 같은 컬렉션에서 스트림을 생성한다.배열에서 스트림을 생성한다.스트림에 여러 요소를 넣어서 생성한다.조건에 맞춰 무한 스트림을 생성한다. limit(n)을 안 걸어두면 계속 생성된다.Supplierㄹ을 사용해서
int, double 등 기본 자료형에 특화된 스트림이다. 이를 사용하면 유의미한 성능 차이가 있는 건 아니지만, 그래도 성능과 가시성에 있어서 장점을 보인다. 숫자 연산일 경우 사용하면 좋다.스트림의 종류로는 IntStream, LongStream, DoubleStr
스트림을 사용하던 중 통계나 리스트, 컬렉션을 만들고 싶을 때 collect()라는 최종 연산과 함께 쓰인다. 참고로 Collector 인터페이스를 구현한 클래스다.스트림을 리스트로 만든다. 후자는 변경할 수 없는 리스트로 만든다.Set을 만든다. toCollectio
즉시 평가 값을 그 즉시 평가하는 것이다. 메서드 호출하기 전 괄호 안의 값을 먼저 계산하는 것이 즉시 평가라 할 수 있다. 빠르게 값을 전달할 수 있지만, 이러면 필요하지 않았는데도 값이 연산되어 버려져 쓸데없이 cpu만 소모시킨다는 단점이 있다. 그래서 연산되지
옵셔널을 클래스의 필드로 사용하지 않는다. 클래스 필드로 쓰면 거기에 null을 넣을 수도 있기 때문에 안 된다. 옵셔널은 주로 메서드의 반환값으로 쓰고, 변수로 쓰더라도 지역 변수로 써야한다. 만약 필드값을 Optional로 쓰고 싶을 경우 따로 메서드를 만들어 Op
자바에서 하위 호환성을 보장하기 위해 도입한, 인터페이스 추상 메서드에 메서드 구현부를 달아 디폴트 메서드를 구현할 수 있도록 해둔 것이다. 디폴트 메서드를 구현하려고 하는 추상 메서드 앞에 default라는 키워드를 붙이면 된다. 그러면 일반 메서드처럼 로직을 인터페
일을 작은 단위로 분할한 다음 나중에 합치는 패턴을 말한다. 멀티 스레드 환경에서 여러 스레드에서 실행한 결과를 합치는 걸 생각하면 된다. 이런 Fork/Join 패턴을 잘 사용할 수 있게 해주는 프레임워크인 ForkJoinPool이 있다. 다만, 실무에서 직접 다룰
스트림에서도 병렬적으로 작업을 처리할 수 있개 해주는 메서드가 있다. 바로 parallel()이다. 이를 사용하면 ForkJoin 공유풀을 사용해서 작업을 병렬적으로 처리해 준다.parallel()로 선언해주고 그 밑에 로직만 써주면 공유풀에 작업을 제출해 알아서 병렬
함수형 프로그래밍은 선언적 프로그래밍의 일종으로, 함수를 조합해 만드는 방식에 초점을 둔 프로그래밍이다. 어떻게 할 지보다는 무엇을 할 지에 집중한다.함수형 프로그래밍을 구성하는 특성에는 여러 가지가 있다.같은 인자를 주면은 언제나 같은 결과가 출력되는 함수다. 그뿐만