API Documentation
java.base 모듈
- 모든 모듈이 의존하는 기본 모듈
- 모듈 중 유일하게 requires 하지 않아도 사용할 수 있다
- Object 클래스
- System 클래스
- 문자열 클래스
- Wrapper 클래스
- Math 클래스
- 날짜 & 시간 클래스
- 형식 클래스
Object 클래스
1. 개념
- Java의 최상위 클래스
- Java의 모든 클래스는 Object로부터 상속받는다
- extends Object 라고 직접 쓰지 않아도 된다
- Object 안에서는 ==, equals() 가 모두 참조값(reference) 만으로 비교한다
- 단, String만이 equals() 내용(문자열)을 비교한다
2. 종류
- equlas()
public bollean equals(Object obj)
- hashCode()
public int hashCode()
- toString()
obj.toString // 클래스명@16진수
3. 예제
| ObjectMain.java | Object 클래스, toString(), hashCode(), equlas() toString() : 객체를 문자열로 표현하는 방법을 정의 (ArrayList의 toString() : 리스트의 요소를 읽기 쉽게 출력) hashCode() : 객체의 해시 코드 반환 equals() : 객체 내용 비교 (기본적으로 주소 비교) (String 클래스에서는 내용 비교) |
System 클래스
1. 종류
- System.in.read() // 키보드 입력
import java.io.IOException;
int a = System.in.read(); // <error> Unhandled exception type IOException
System.in.read(); // flush
System.in.read(); // flush

- System.exit(int status) // 프로세스 종료
| 정상 종료 (강제종료) | System.exit(0); |
| 비정상 종료 | System.exit(1); or System.exit(-1); |
2. 예제
| Input.java | 사용자가 입력한 문자의 아스키(ASCII) 값을 출력 |
문자열 클래스
String
1. 개념
- 문자열을 저장하고 조작할 때 사용
- 문자열
- literal("") 생성 가능
- 문자열 편집(수정)을 할 수 없다.
- 비교
- == : reference(참조값)을 비교한다
- equals() : 문자열의 내용을 비교한다 // Object 클래스에서는 주소값(참조값) 비교
- literal
- 정수형 literal : 5, 48, -100
- 실수형 literal : 43.8, 12.6
- 문자형 literal : 'ㄹ'
- 문자열 literal : "ㄱㄴㄷㄹ"
2. 예제
| StringMain.java | StringMain 클래스 사용하여 다양한 문자열 연산 | ||
StringBuffer / StringBuilder
1. 개념
- 문자열
- 문자열 편집이 가능
- append(), delete() 존재
2. 예제
| StringBufferMain.java | StringBuffer 클래스를 사용하여 구구단 출력 hasMoreTokens() - 항목 있으면 : T - 항목 없으면 : F |
StringTokenizer(java.util)클래스 & String클래스의 split()
1. 개념
- 문자열을 분리할 때 사용
- Token : 분리된 문자열
- 비교
| StringTokenizer | 비어있는 값 무시 명시적으로 구분자를 지정하여 문자열을 나눌 수 있다 빈 문자열("")도 하나의 토큰으로 처리 즉, 두 구분자 사이에 아무런 문자도 없을 경우 해당 구간은 토큰으로 간주되지 않는다 |
| split() | 비어있는 값도 인식 정규 표현식을 이용하여 문자열을 나눈다 두 구분자 사이에 아무런 문자도 없을 경우 빈 문자열을 토큰으로 간주한다 |
2. 예제
| Token.java | 문자열을 특정 구분자로 분리 1. StringTokenizer 클래스 2. String.split() 메서드 |
Wrapper 클래스
1. 개념
자바는 기본 타입(byte, char, short, int, long, float, double, boolean)의 값을 갖는 객체를 생성할 수 있다
이런 객체를 포장(wrapper)객체라고 한다
| 기본 타입 | wrapper 클래스 |
| byte | Byte |
| char | Character |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| boolean | Boolean |
2. 자동 박싱 (Autoboxing) & 자동 언박싱 (Unboxing)
- Java에서 기본 타입(primitive type)과 그에 대응하는 래퍼 클래스(wrapper class) 간의 변환을 자동으로 처리
- 박싱 - Autoboxing :
- 기본 타입 값 ➡️ 포장 객체 // 기본 타입을 해당하는 wrapper 클래스로 자동으로 변환
- 언박싱 - unAutoboxing
- 포장 객체 ➡️ 기본 타입 값 // wrapper 클래스의 객체를 해당하는 기본 타입으로 자동으로 변환해주는 기능
int num = 10; // 기본 타입; num 변수 - int 타입의 기본 값
// AutoBoxing; num을 numObject에 할당할 때 자동으로 박싱이 일어남
Integer numObject = num; //numObject 변수 - Integer 객체
Integer numObject = 10; // 래퍼 클래스 객체; numObject 변수 - Integer 객체
// unAutoBoxing; numObject를 num에 할당할 때 자동으로 언박싱이 일어남
int num = numObject; // num 변수 - int 타입의 기본 값
- 주의사항
- null값 처리
- 자동 언박싱을 수행할 때 래퍼 클래스 객체가 null이면 NullPointerException이 발생한다
- 성능
- 자동 박싱과 언박싱은 편리하지만, 빈번하게 사용될 경우 성능에 영향을 미칠 수 있다
- 기본 타입을 사용하는 것이 성능면에서 더 유리하다
- null값 처리
3. 예제
| GenericMain.java | 제네릭(Generic) 클래스를 사용하여 다양한 데이터 타입 다루기 제네릭 클래스 : 특정 타입에 대해 정의된 클래스를 인스턴스화할 때 타입을 지정할 수 있게 해줌 |
| GenericMain2.java | 제네릭을 사용하여 다양한 타입의 데이터 처리 AutoBoxing unAutoBoxing |
Math 클래스
1. 개념
- 수학 계산에 사용할 수 있는 메서드 제공
- Math 클래스의 메서드는 모두 정적(static) >> Math 클래스로 바로 사용 가능
| 절대값 | Math.abs() |
| 올림값 | Math.ceil() |
| 버림값 | Math.floor() |
| 최대값 | Math.max() |
| 최소값 | Math.min() |
| 랜덤값 | Math.random() |
| 반올림값 | Math.round() |
| 제곱값 | Math.pow() |
2. 예제
| ImportStatic.java | static import 문법을 사용하여 특정 클래스의 정적 멤버를 직접 사용 클래스 이름 없이 해당 클래스의 정적 메서드와 변수를 사용 가능 //import static java.lang.Math.random; //import static java.lang.Math.pow; import static java.lang.Math.*; // 와일드 카드, 모든 것(all) import static java.util.Arrays.sort; import static java.lang.System.out; |
날짜 & 시간 클래스
1. 종류
Date
- 날짜 정보를 전달하기 위해 사용
- Date() 생성자 : 컴퓨터의 현재 날짜를 읽어 Date 객체로 만듦 // Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); // 시간 포맷
Calendar
- 달력을 표현하는 추상 클래스
Calendar now = Calendar.getInstance();
LocalDateTime
- 날짜와 시간 조작
LocalDateTime now = LocalDateTime.now();
2. 예제
| Today.java | 현재 날짜, 시간 정보 처리 Calendar 객체 사용 |
| Clock.java | Java AWT 사용하여 시계 애플리케이션 구현 Frame 클래스를 상속받아 GUI 창을 생성 Runnable 인터페이스 : 구현하여 시간을 실시간으로 업데이트 |
형식 클래스
1. 종류
NumberFormat
- 숫자를 지역화된 형식으로 포맷팅하고 파싱
- 추상 클래스 >> 직접 인스턴스를 생성할 수 없고, 서브클래스인 DecimalFormat을 사용하여 인스턴스를 생성한다
DecimalFormat
- 숫자를 형식화된 문자열로 변환 (숫자를 특정 형식으로 포맷팅)
SimpleDateFormat
- 날짜를 형식화된 문자열로 변환
2. 예제
| NumberMain.java | NumberFormat 클래스를 사용하여 숫자를 형식화 숫자를 다양한 형식으로 포맷팅하기 |
메모리
1. 개념
물리적인 메모리가 아닌 프로그램에서 말하는 가상 메모리
가상 메모리를 나누는 기준 : 코드 영역, 스태틱 영역[데이터 영역], 스택 영역, 힙 영역
| Code 영역 |
| Static 영역 |
Heap 영역 |
| Stack 영역 |
2. 종류
- Code 영역 [Text 영역] : 실행할 프로그램의 코드를 올려 놓을 공간
- 실행할 명령어들이 저장되는 영역
- 보통 읽기 전용으로 설정되어 있어서 프로그램의 코드를 수정하지 못하게 한다
- Static 영역 [Data 영역] 프로그램이 종료될 때까지 유지해야 할 데이터를 저장할 공간 // != Method 영역(JVM)
- static 선언 1
- 프로그램 종료시 소멸
- 초기화된 전역 변수와 정적 변수 저장
- 프로그램 실행 도중 이 변수들의 값이 변경될 수 있으며, 프로그램이 종료될 때까지 메모리에 남아 있다
- Heap 영역 : 프로그래머가 원하는 방식으로 쓸 수 있는 공간. 긴 생명주기를 가진 데이터들이 저장된다
- new
- 동적 메모리 할당이 이루어지는 영역
- 개발자 메모리 삭제 → JVM
- 변수명 부여 X → 주소로 접근
- 프로그래머가 필요에 따라 메모리를 할당하고 해제할 수 있으며, 주로 malloc, free 같은 함수들을 사용하여 관리
- Stack : 아주 잠깐 사용하고 삭제할 데이터의 저장공간. 변수는 모두 메모리에 저장된다
- 함수 호출과 관련된 지역 변수, 매개변수, 반환 주소 등이 저장되는 영역
- { 구역 } 벗어나면 소멸
- LIFO (Last In, First Out) 방식
- 함수가 호출될 때마다 새로운 스택 프레임이 추가되고, 함수가 종료되면 해당 스택 프레임이 제거된다
# JVM 메모리 영역 (Runtime Data Area)
- Method 영역 : 바이트코드 파일을 읽은 내용 저장되는 영역
- 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 클래스 메타데이터, 메서드 바이트코드, 생성자 코드 등 저장
- 메서드 영역 data : 프로그램 시작부터 종료까지 메모리에 남아있음
- Heap 영역 : 객체 생성되는 영역 - 동적으로 할당된 객체
- 참조형 객체(인스턴스), 배열 등 저장
- 런타임시 동적으로 할당
- 보관되는 메모리가 호출이 끝나더라도 삭제되지 않고 유지
- Stack 영역 : 메서드를 호출할 때마다 생성되는 프레임이 저장되는 영역 - 스레드별 실행 상태
- 기본 자료형 지역변수의 데이터값 저장
- primitive 타입의 데이터(int, double byte, boolean 등)에 해당하는 지역변수, 매개변수 데이터값 저장
- 스택 프레임 안에 메서드를 호출 (호출될 때 메모리에 할당됨
- 메서드 호출이 끝나면 프레임은 자동 제거 (메모리에서 사라짐)
- 후입선출 (LIFO - Last In First Out)
| 스태틱 영역 | 메서드 영역 |
| 주로 C와 같은 언어에서 전역 변수와 정적 변수를 저장하는 메모리 영역 | 자바의 JVM에서 클래스 구조와 메타데이터, 메서드 및 필드 정보 등을 저장하는 메모리 영역 |
| 스태틱 영역과 메서드 영역은 비슷한 개념으로 사용될 수 있지만, 그들이 저장하는 정보와 그 용어가 주로 사용되는 환경이 다르다 스태틱 영역은 주로 프로그램의 전역 변수와 정적 변수를 포함하는 반면, 메서드 영역은 자바에서 클래스 메타데이터와 메서드 바이트코드를 포함한다 |
|
static
1. 개념
: 클래스 변수
- 메모리 static 영역에 1번만 생성된다 → 초기화 1번만 수행
- 모든 객체가 공유된다 (공유변수)
- static 메서드에서는 static 변수만 사용 가능
- static 메서드에서는 this를 참조할 수 없다
- static변수나 메서드는 호출시 클래스명으로 직접 호출할 수 있다
- 객체로도 호출이 가능하다
// Static Method Call
StaticTest.output(); // 클래스명.메서드
aa.output();// 객체명.메서드
2. 예제
| StaticMain.java | 인스턴스 변수, 클래스 변수 |
import static
1. 개념
- 간단하게 static 상수 또는 메소드를 호출할 때 사용
// 슨생님은 추천 안하심
2. 예제
| ImportStatic.java | static import 문법을 사용하여 특정 클래스의 정적 멤버를 직접 사용 클래스 이름 없이 해당 클래스의 정적 메서드와 변수를 사용 가능 //import static java.lang.Math.random; //import static java.lang.Math.pow; import static java.lang.Math.*; // 와일드 카드, 모든 것(all) import static java.util.Arrays.sort; import static java.lang.System.out; |
색
- 32bit (4byte)
- RGB (빛의 3요소)
| R | G | B | |
| 1byte | 1byte | 1byte | |
| 0 ~ 255 | 0 ~ 255 | 0 ~ 255 | |
| 00 ~ FF | 00 ~ FF | 00 ~ FF | |
| 0000 0000 | 0000 0000 | 0000 0000 | 검정색 |
| 1111 1111 | 1111 1111 | 1111 1111 | 흰색 |
Collection
1. 개념
- 객체를 담아주는 저장 창고
- 객체 타입에 상관없이 저장 가능
- 크기 조절 가능
# Enumeration
# Iterator
2. 종류
- List: ArrayList, Vector, LinkedList
- Set: HashSet
- Map: HashMap, Hashtable, Properties
- 검색 컬렉션: TreeSet, TreeMap, Comparable & Comparator
- LIFO & FIFO: Stack, Queue
3. 예제
| CollectionMain.java | 자바 컬렉션 프레임워크 Collection 인터페이스와 ArrayList 클래스를 사용하고, Iterator를 통해 요소를 순회 [java api 8] java.util > Collection is.hasNext() : 현재 위치에 항목이 있으면 true, 없으면 false it.next() : 현재 위치의 항목 꺼내어 버퍼에 기억시킴, 다음 항목으로 이동 |
| CollectionMain2.java | 자바의 제네릭 컬렉션인 ArrayList를 사용하여 문자열 데이터를 저장하고 출력 |
| SetMain.java | Set 인터페이스 & 그 구현체인 HashSet 사용 중복을 허용하지 않는 데이터 집합을 다루기 |
| MapMain.java | Map 인터페이스 & 그 구현체인 HashMap 사용 |
| StackMain.java | Stack 클래스를 사용하여 스택(Stack) 데이터 구조 구현 Stack : Java 컬렉션 프레임워크의 일부 (java.util 패키지에 포함됨) |
| LinkedListMain.java | LinkedList를 사용하여 큐(Queue) 기능을 시연 큐의 기본 동작 요소 추가, 요소 삭제 및 큐의 상태 확인 |
| VectorMain.java | Vector 클래스를 사용하여 Java의 벡터(Vector) 데이터 구조 구현 Vector : Java 컬렉션 프레임워크의 일부 (java.util 패키지에 포함됨) |
IO Stream
1. 개념
- 입출력 처리
- 출력 시 파일 없으면 자동으로 파일 생성
- 입력 시 파일 없으면 Error (FileNotFoundException)
2. 단위
- byte 단위 처리 (숫자, 영문자) - byte 스트림
- InputStream
- OutputStream
- 문자(char~2byte) 단위 처리 (숫자, 영문자, 한글) - 문자 스트림
- Reader
- Writer
BufferedInputStream // 바이트 단위
BufferedReader // 문자 단위
FileInputStream // 바이트 단위
FileReader // 문자 단위
| InputStream | BuffereInputStream DataInputStream : 추상클래스 ; new 불가능 |
|
| OutputStream | BufferedOutputStream DataOutputStream : 추상클래스 ; new 불가능 |
|
| PrintStream | : 훨씬 많이 씀 // overload 되어 있기 때문 (이름이 같음) |
|

3. 예제
| DataStream.java | DataInputStream과 DataOutputStream을 사용하여 데이터를 파일에 쓰고 읽기 |
| ByteStream.java data.txt |
BufferedInputStream을 사용하여 파일의 내용을 한 글자씩 읽어오기 |
| ByteStream2.java data.txt |
파일의 내용을 한 번에 읽어서 문자열로 변환 BufferedInputStream과 FileInputStream을 사용하여 파일을 읽고, 파일의 내용을 바이트 배열에 저장한 후 이를 문자열로 변환하여 출력 |
객체 직렬화
1. 개념
- 객체는 파일이나 네트워크로 전송이 안된다
- 객체를 byte[] 변환시켜서 전송해야한다
- Serializable
2. 예제
| ObjectMain.java PersonDTO.java |
객체를 파일에 직렬화(serialize)하여 저장하고, 저장된 객체를 다시 역직렬화(deserialize)하여 읽어오기 ObjectOutputStream과 ObjectInputStream 클래스 사용 ObjectOutputStream; 객체를 파일에 씀 ObjectInputStream; 파일에서 객체를 읽어옴 |
Thread
1. 개념
- 프로세스 (process)
- 현재 실행 중인 프로그램
- 멀티프로세스 (멀티태스킹)
- 하나의 cpu에 여러 개의 응용프로그램을 동시에 실행
- 시분할 시스템
- Thread
- 단위 프로그램
- main 메서드도 하나의 스레드이다
- 스레드를 종료하려면 run() 을 벗어나야 한다
- ex) 주차장, 식당 주문(계산)
- Multi Thread
- 하나의 프로그램에서 여러 개의 스레드(단위프로그램)을 동시에 수행하는 것을 의미한다
- 생성 방법
- Thread 클래스로 상속
- Runable 인터페이스 사용
- 처리
- 스레드 생성
- 🔽
- 스레드 시작
- 🔽
- 스레드 실행 (운영체제가 알아서 호출 - run(), 콜백메서드(Call Back))

2. 예제
| SnackMain.java | // Thread 실행방법 1 - Thread 클래스로 상속 멀티스레딩 구현 Thread 클래스를 상속하여 스레드를 만들고 실행 |
| JoinMain.java | // Thread 실행방법 2 - Runnable 인터페이스 사용 스레드생성, Runnable 인터페이스를 사용하여 스레드를 실행 |
| Clock.java | Clock이라는 클래스를 정의하여 GUI 창을 만들고, 해당 창에 현재 시간을 표시하는 시계를 구현하는 Java 애플리케이션 AWT (Abstract Window Toolkit) 라이브러리를 사용하여 GUI를 구현 스레드를 사용하여 시간을 주기적으로 업데이트 |
동기화 처리
1. 개념
여러 개의 객체가 동시에 하나의 메서드에 접근하려고 할 때 심각한 부하가 발생된다
이것을 방지하기 위해 Lock을 건다 >> 동기화 처리
2. 형식
| public synchronized returnType 메서드명(인수형 인수, ...) { // 메서드 구현 } |
| public returnType 메서드명(인수형 인수, ...) { syschronized(this){ // 동기화된 블록 구현 } } |
| public returnType 메서드명(){ synchronized(*class){ // 동기화된 블록 구현 } } |
3. 예제
| ATMMain.java | 멀티스레딩 사용 Runnable 인터페이스를 구현하여 여러 스레드가 동일한 ATM 객체를 공유하도록 설정 |
| SynchronizedMain.java | 스레드의 run 메서드를 오버라이드하여 현재 스레드의 정보를 출력하는 Synchronized 클래스를 정의 Thread 클래스를 확장하여 여러 스레드를 생성하고, 각 스레드에 이름과 우선순위를 설정한 후 실행 |
| SingletonMain.java | 싱글톤 패턴(Singleton Pattern)**을 사용하여 클래스의 인스턴스가 애플리케이션 전체에서 하나만 존재하도록 보장하는 예제 이 패턴을 통해 클래스의 인스턴스가 오직 하나만 생성되고, 그 인스턴스에 전역적으로 접근할 수 있도록 한다 |
싱글톤 패턴의 목적
1. 유일성 보장
Singleton 패턴 : 애플리케이션 전체에서 단 하나의 인스턴스만 존재하도록 보장
이 인스턴스는 전역적으로 접근할 수 있어야 하며, 여러 곳에서 공유된다
2. 글로벌 접근 지점
인스턴스를 생성하고 관리하는 책임이 클래스 자체에 있으므로, 애플리케이션의 모든 부분에서 동일한 인스턴스에 접근할 수 있다
new Singleton()을 사용하는 문제점
1. 인스턴스 다중 생성
만약 new Singleton()을 사용하여 인스턴스를 생성하면, 싱글톤 패턴의 목적에 어긋나게 여러 개의 Singleton 인스턴스가 생성될 수 있다
이는 멀티스레드 환경에서도 문제가 된다
예를 들어, 두 개의 스레드가 동시에 new Singleton()을 호출하면 두 개의 인스턴스가 생성될 수 있다
2. 제어의 분리
Singleton 패턴에서는 클래스가 인스턴스 생성과 관리를 책임진다
직접 new Singleton()을 사용하면 클래스 외부에서 인스턴스 생성이 이루어지며, 싱글톤 패턴의 제어를 벗어나게 된다
3. 글로벌 상태 관리
여러 개의 인스턴스가 존재하게 되면 각 인스턴스의 상태가 독립적이 되어, 상태를 공유하고 관리하기가 복잡해진다
싱글톤 패턴은 상태를 전역적으로 공유할 수 있도록 설계되어야 한다
lombok.jar
1. 개념
- Java 코드의 보일러플레이트(반복적으로 작성해야 하는 코드)를 줄여주는 도구
2. 기능
- 자동 생성자: @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor 등을 사용하여 생성자를 자동으로 생성
- 게터/세터: @Getter 및 @Setter를 사용하여 필드에 대한 게터 및 세터 메서드를 자동으로 생성
- toString(), equals(), hashCode(): @ToString, @EqualsAndHashCode 등을 사용하여 toString(), equals(), hashCode() 메서드를 자동으로 생성
- Builder 패턴: @Builder를 사용하여 빌더 패턴을 쉽게 구현
- @Data: 모든 게터, 세터, toString(), equals(), hashCode()를 자동으로 생성하는 편리한 어노테이션
- @Value: 불변(immutable) 객체를 쉽게 만들 수 있는 어노테이션
@Data에 포함되는 것
- @Getter
- @Setter
- @ToString
- @EqualsAndHashCode
- @RequiredArgsConstructor
3. 설치
- elipse 종료
- project lombok
- PS D:\java\lib > java -jar .\lombok.jar
- 확인 eclipse.ini
4. 이클립스 실행
- Java Project 안에서 폴더 (lib) 만들기
- lib에 lombok.jar 를 복사한다
- lombok.jar > 우클릭 > Build Path > Add to Build Path
ojdbc11.jar
1. 개념
- Oracle 데이터베이스와 Java 애플리케이션 간의 연결을 관리
2. 기능
- Oracle 데이터베이스 연결
- ojdbc11.jar는 Oracle 데이터베이스와 Java 애플리케이션 간의 데이터 통신을 가능하게 한다
- 이를 통해 애플리케이션은 SQL 쿼리를 실행하고 데이터베이스의 데이터를 조회하거나 수정 가능
- JDBC API 구현
- JDBC API를 구현하여 Java 애플리케이션이 데이터베이스에 대해 CRUD(Create, Read, Update, Delete) 작업을 수행할 수 있게 한다
- 버전
- ojdbc11.jar는 Oracle 데이터베이스 19c 이상과 호환되는 드라이버
- "11"은 드라이버가 Java 11 이상을 지원한다는 것을 의미
3. 드라이버 종류
- Thin Driver: ojdbc11.jar는 "thin" 드라이버로, 네이티브 라이브러리 없이 네트워크를 통해 Oracle 데이터베이스에 연결 가능
- OCI Driver: Oracle의 "OCI" 드라이버는 Oracle Call Interface를 사용하는 드라이버; 추가적인 Oracle 라이브러리와 설치 필요
4. 버전 호환성
- Oracle Database 버전: ojdbc11.jar는 Oracle 12c 이상에서 사용
- Java 버전: 이 드라이버는 Java 11 이상과 호환; 구버전의 Java와 호환되는 드라이버는 ojdbc8.jar와 같은 버전을 사용 가능
5. 설치
- www.oracle.com 다운로드 or D:\Oracle\sqldeveloper\jdbc\lib
- [eclipse] dbtest Newfloder > lib(생성) > ojdbc11.jar 복사
- ojdbc11.jav > 우클릭 > Build Path > Add to Build Path
- D:\Oracle\sqldeveloper\jdbc\lib

함수형 프로그래밍
- 함수를 정의하고 이 함수를 데이터 처리부로 보내 데이터를 처리하는 기법
- 데이터 처리부는 데이터만 가지고 있을 뿐, 처리 방법이 정해져 있지 않아 외부에서 제공된 함수에 의존한다
- 함수형 인터페이스 : 오직 하나의 추상 메서드를 가지는 인터페이스
람다식
1. 개념
- 자바는 함수형 프로그래밍을 위해 Java 8부터 람다식을 지원한다
- 데이터 처리부는 람다식을 받아 매개변수에 데이터를 대입하고 중괄호를 실행시킨다
- 자바는 람다식을 익명 구현 객체로 변환한다
- 인터페이스의 익명 구현 객체를 람다식으로 표현하려면 반드시 하나의 추상메소드만 가져야 한다
- 인터페이스가 단 하나의 추상메소드를 가질 때, 이를 함수형 인터페이스 라고 한다
- 인터페이스가 함수형 인터페이스임을 보장하기 위해서는 @FunctionalInterface 어노테이션을 붙이면 된다
- 컴파일 시 추상메소드가 하나인지 검색하기 때문에 정확한 함수형 인터페이스를 작성할 수 있다
2. 형식
(매개변수, ...) -> { 처리내용 }
public interface Runnable { // { } : 익명 객체
void run();
}
람다식 => ( ) -> { }
@FunctionalInterface
public interface Calculable { // { } : 익명 객체
void calculate(int x, int y);
}
람다식 => (x, y) -> { }
3. 예제
| ℹ️.Compute.java LambdaMain01.java |
람다 표현식 사용 |
| ℹ️.Workable.java LambdaMain02.java |
람다 표현식을 사용하여 Workable 인터페이스의 work 메서드를 구현하는 예제 |
| ℹ️.InterA.java ℹ️.InterB.java LambdaMain03.java |
람다 표현식을 사용하여 InterA와 InterB 인터페이스의 메서드를 구현하는 예제 |
| ℹ️.Compute02.java LambdaMain04.java |
Compute02라는 함수형 인터페이스를 사용하여 다양한 계산을 수행하고, 그 결과를 문자열로 반환 |
메서드 참조
1. 개념
- 메소드를 참조해서 매개변수의 정보 및 리턴 타입을 알아내 람다식에서 불필요한 매개변수를 제거하는 것을 목적으로 한다
큰수를 리턴하는 람다식
(left, right) -> Math.max(left, right);
위에서 단순히 left, right 값을 매개값으로 전달하는 역할만 하기 때문에 메소드 참조를 이용하면 깔끔하게 처리된다.
Math :: max;
2. 형식
- 정적 메소드
- 클래스 :: 메소드
- 인스턴스 메소드
- 참조변수 :: 메소드
3. 예제
| ℹ️.Compute02.java LambdaMain05.java |
메서드 참조(Method Reference)를 사용하여 Compute02 함수형 인터페이스의 추상 메서드 구현 |
| LambdaMain06.java | 람다식과 메서드 참조를 사용하여 문자열을 비교하고, 그 결과에 따라 출력을 결정 |
생성자 참조
1. 개념
- 생성자를 참조한다는 것은 객체를 생성하는 것
- 생성자 Overload 되어 여러 개가 있을 경우, 함수형 인터페이스의 추상메소드와 동일한 매개변수 타입과 개수를 가진 생성자를 찾아 실행한다
(a, b) -> {
return new 클래스(a, b);
}
=> 생성자 참조 클래스 :: new
2. 예제
| LambdaMain07.java | 함수형 인터페이스와 메서드 참조를 사용하는 예제 메서드 참조를 사용하여 생성자를 호출 |
메서드 참조의 종류
- 정적 메서드 참조: ClassName::staticMethodName
- 특정 객체의 인스턴스 메서드 참조: instance::instanceMethodName
- 임의 객체의 인스턴스 메서드 참조: ClassName::instanceMethodName
- 생성자 참조: ClassName::new
스트림(Stream)
1. 개념
- 람다를 활용해 배열과 컬렉션을 함수형으로 간단하게 처리할 수 있는 기술
- 자바 8 API에 새로 추가된 기능
// .reduce(초기값, (누적변수, 요소) -> 처리문)
// .reduce()는 Stream의 요소들을 하나의 데이터로 만드는 작업을 수행
2. 장점
- 함수형 프로그래밍 스타일을 제공
- 코드가 더 간결하고 읽기 쉬워진다
3. 예제
|
StreamMain01.java
|
문자열을 담은 리스트를 다양한 방식으로 출력 컬렉션 반복 - for 루프, Iterator, Stream API 사용 |
|
StreamMain02.java
|
스트림(Stream) API를 사용하여 컬렉션 처리 Stream API를 사용하여 리스트를 처리하고, 음식의 칼로리를 기준으로 필터링 및 정렬한 후, 최종적으로 합계를 계산 |
'Language > Java' 카테고리의 다른 글
| Java - Network (0) | 2024.08.07 |
|---|---|
| Java - JDBC (0) | 2024.08.07 |
| 문법 - OOP(Object Oriented Programming) (1) | 2024.07.11 |
| 문법 - 배열 (0) | 2024.07.10 |
| 문법 - 반복문 (2) | 2024.07.10 |