스트림(Stream) -스트림(Stream)은 자바 8에서 소개된 기능으로, 컬렉션, 배열 등의 데이터 소스를 추상화하여 다양한 데이터 처리 작업을 쉽고 간결하게 할 수 있도록 도와준다. 스트림은 데이터 소스에서 데이터를 읽어 처리하는 파이프라인을 구성하며, 주로 람다 표현식과 함께 사용된다. - 3가지로 구성 1. 스트림 생성 (Stream Creation): 데이터 소스로부터 스트림을 생성한다. 데이터 소스는 배열, 컬렉션, I/O 채널 등이 될 수 있다. 2. 중개 연산 (Intermediate Operations): 스트림을 변환하는 연산으로, 하나 이상의 중개 연산이 체이닝될 수 있다. 중요한 점은 중개 연산이 느리게 실행(lazy execution)된다는 것으로, 최종 연산이 호출될 때까지 실..
JAVA
람다 표현식 - 람다 표현식은 자바 8에서 도입된 기능으로, 메서드를 하나의 식(expression)으로 간결하게 표현하는 방법이다. 이는 "익명 함수(anonymous function)"라고도 불리며, 주로 함수형 인터페이스(functional interface)에 사용된다. 람다 표현식 장/단점 장점 - 간결성: 람다 표현식을 사용하면 복잡한 익명 클래스를 짧고 명료한 형태로 표현할 수 있다. - 가독성 향상: 람다 표현식은 코드의 양을 줄이고, 의도를 명확하게 전달하여 코드의 가독성을 높인다. - 생산성 향상: 간결한 코드는 작성과 유지보수에 드는 시간을 줄여주어 생산성을 높일 수 있다. 단점 - 재사용성 부족: 람다는 익명이므로 재사용하기 어렵다. - 디버깅 어려움: 람다 표현식의 디버깅은 일반 ..

컬렉션 프레임워크 - 자바에서 다양한 데이터 집합을 효율적으로 관리하기 위해 제공하는 일련의 클래스와 인터페이스의 모음이다. 이 프레임워크는 데이터를 저장, 검색, 정렬, 조작하는데 필요한 다양한 자료구조와 알고리즘을 제공합니다. - 대표 인터페이스: List, Set, Map 인터페이스 List 인터페이스 - 순서가 있는 데이터의 집합 - 데이터 중복 허용 - 데이터를 저장, 검색, 정렬, 조작하는데 필요한 다양한 자료구조와 알고리즘을 제공 - 대표 구현 클래스: ArrayList, LinkedList, Vector ArrayList: 배열 기반의 리스트로, 인덱스를 통한 빠른 요소 접근이 가능하다. 하지만 크기 조정이 필요할 때 비용이 많이 든다. LinkedList: 연결 리스트 기반의 리스트로, ..
예외(Exception) - 정상적이지 않은 case 예외 처리(Exception handling) - 정상적이지 않은 case에 대한 적절한 처리 방법 - try-catch: 예외가 발생할 수 있는 코드를 try 블록 안에 넣고, 예외가 발생했을 때 실행할 코드를 catch 블록에 작성한다. finally - 예외 발생 여부와 관계없이 항상 실행되는 코드 블록이다. 주로 리소스를 해제하거나 정리하는 데 사용된다. throw, throws - throw: 예외를 발생시킴 - throws: 메서드 선언부에 사용되며, 해당 메서드 내에서 처리되지 않고 호출한 곳으로 예외를 전가시킨다. import java.io.BufferedReader; import java.io.FileReader; import java..
콘솔 입력 - 입출력 방식 중 콘솔 입력 방법 - 자바에서 콘솔 입력은 주로 Scanner 클래스를 사용하여 처리한다. Scanner 클래스는 java.util 패키지에 있으며, 다양한 종류의 입력(문자열, 정수, 실수 등)을 처리할 수 있다. import java.util.Scanner; public class ConsoleInputExample { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter your name: "); String name = scanner.nextLine(); // 문자열 입력 System.out.print("Enter your age: ..
내부 클래스(Inner Class) - 내부 클래스(Inner Class)는 클래스 내부에 선언된 클래스로, 다양한 형태와 용도로 사용된다. - 내부 클래스는 주로 외부 클래스의 멤버에 대한 접근을 용이하게 하고, 코드의 논리적 그룹화를 도와 코드를 더 읽기 쉽고 관리하기 쉽게 만든다. 내부 클래스 특징 - 내부 클래스에서 외부 클래스 멤버에 접근 가능 - 외부에서는 내부 클래스에 접근 불가 내부 클래스 종류 - 인스턴스 클래스(instance class) 외부 클래스의 인스턴스와 연결된 클래스 외부 클래스의 인스턴스 메서드와 멤버 변수에 접근할 수 있다. class Outer { private String outerField = "Outer field"; class Inner { void display..
인터페이스 - 다중 상속을 지원 - 추상 메소드와 상수만으로 이루어짐(메서드의 선언만 포함, 구현은 인터페이스를 구현하는 클래스에서 이루어짐) interface Flyable { void fly(); } class Bird implements Flyable { public void fly() { System.out.println("Bird is flying"); } } public class Test { public static void main(String[] args) { Bird myBird = new Bird(); myBird.fly(); // "Bird is flying" 출력 } } 상속과 인터페이스 동시 사용 - 동시 사용으로 다중 상속과 같은 효과 class Animal { void eat..
추상 메소드(Abstract Method) - 자식클래스에서 반드시 오버라이딩해야 하는 메소드 - 선언만 하고 구현은 없음 추상 클래스(Abstract Class) - 하나 이상의 추상 메소드를 포함하는 클래스 - 반드시 구현해야 하는 부분에 대해 명시적으로 표현 - 추상 클래스 자체는 객체 생성 불가(완전히 구현되지 않은 불완전한 클래스이기 때문) 1. 불완전한 구현: 추상 클래스는 불완전할 수 있다. 즉, 모든 메서드가 구현되어 있지 않을 수 있다. 인스턴스를 생성하려면 모든 메서드에 대한 구현이 필요하다. 그렇지 않으면 프로그램이 올바르게 작동하지 않을 수 있다. 2. 설계 의도: 추상 클래스는 상속을 통해 사용되도록 설계되었다. 개발자는 추상 클래스를 정의함으로써 특정 메서드를 반드시 구현하도록 ..
다형성(Polymorphism) - 한 객체가 여러가지 타입을 가질 수 있는 것(객체 지향 프로그래밍에서 한 클래스가 여러 타입으로 인식될 수 있는 능력) - 부모 클래스 타입의 참조 변수로 자식클래스 인스턴스 참조 참조변수와 다형성 - 서로 상속관계에 있는 클래스 사이에서만 형변환이 가능 - 메서드 매개변수가 같은 부모 클래스라면 부모 클래스 타입을 매개변수 타입으로 선언 가능 - 배열 혹은 자료구조에 부모 클래스로 데이터 타입을 지정하면 여러 자식 클래스를 저장 가능 - instanceof 연산자로 참조변수가 참조하는 인스턴스의 실제 타입을 확인하는데 사용 가능 instanceof - 실제 참조하고 있는 인스턴스의 타입 확인 - 특정 객체가 특정 클래스의 인스턴스인지 확인하는 데 사용 class An..
상속(Inheritance) - 클래스 간에 코드를 재사용하고 계층적 구조를 만들기 위한 중요한 객체 지향 프로그래밍의 특징 중 하나 - 기존 클래스에 기능 추가 및 재정의하여 새로운 클래스를 정의 - 새로운 클래스 뒤에 extends와 확장할 클래스를 적어서 표현 ex) class laptop extends computer 부모 클래스: 상속 대상이 되는 기존 클래스 = 상위 클래스, 기초 클래스 자식 클래스: 기존 클래스를 상속하는 클래스 = 하위 클래스, 파생 클래스 - 부모 클래스의 필드와 메소드가 상속됨(생성자, 초기화 블록은 상속되지 않음) - 같은 내용의 코드를 한 곳에서 관리함으로써 코드의 중복이 줄어듦 - 다중 상속은 불가능 - private, default 멤버는 자식 클래스에서 접근 ..