[JAVA] 람다표현식
·
JAVA
람다표현식 (Lambda) 개념 함수형 인터페이스를 구현한 클래스 즉, 익명 클래스의 메소드를 하나의 식으로 표현 함수형 인터페이스의 메서드를 람다표현식으로 작성해서 다른 메서드의 파라미터로 전달할 수 있음 매개변수, 화살표, 몸통 구조 함수형 인터페이스를 통해서만 사용이 가능함, 즉 람다 표현식 전체를 해당 함수형 인터페이스를 구현한 클래스의 인스턴스로 취급함 함수형 인터페이스 인터페이스 내에 한개의 추상 메소드만 정의 외부 메소드에서 호출 시 람다식이나 메소드 참조 가능 자바에서 함수를 일급객체로 사용할 수 없는 단점 보완 Lambda 특징 장점 단점 코드가 축약이 됨 (익명함수로 된 코드 줄임) 남용시 이해하기 어려움 가독성 증가 까다로운 디버깅 병렬 프로그래밍 Lambda 컴파일 처리 invoke..
[JAVA] 제네릭
·
JAVA
제네릭 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법 외부에서 사용자에 의해 타입이 지정되는 것을 의미 제네릭 장점 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지함 타입을 외부에서 지정하기 때문에 반환값에 대한 타입 체크와 타입을 따로 검사해줄 필요가 없음 코드의 재사용성을 증대 시킴 제네릭 타입 종류 타입 설명 Type Element Key Value Number 제네릭 변성 타입이 있는 언어에는 변성이라는 개념이 있음, 제네릭은 변성에 관련된 3가지 성질을 제공 공변 : A가 B의 하위 타입일 때, T 가 T의 하위 타입이면 T가 공변 성질을 가지고 있음 반공변 : A가 B의 하위 타입일 때, T가 T의 하위타입이면 T가 반공변 성질을 가지고 있음 무공변 :..
[JAVA] 리플렉션
·
JAVA
리플렉션 정의 이미 로딩이 완료된 클래스에서 또 다른 클래스를 동적으로 로딩하여 생성자, 멤버필드, 멤버 메서드 등을 사용할 수 있게 하는 기능 클래스의 패키지 정보, 접근 지정자, 수퍼클래스, 어노테이션 등을 얻을 수 있음 컴파일 타임이 아니라 런타임에 동적으로 특정 클래스 의 정보를 객체화를 통해 분석 및 추출해줌 사용하는 이유 클래스와 메서드의 메타정보를 사용해서 어플리케이션을 동적으로 유연하게 만들 수 있음 private 멤버도 Field.setAccessible() 메서드를 true로 지정하면 접근과 조작이 가능하게 만듬 리플렉션 시작 리플렉션의 시작은 Class Class로 통한 접근방법 모든 클래스는 로딩한 다음에 Class 인스턴스가 생기며, 모든 인스턴스는 getClass() 메소드를 ..
[JAVA] 데코레이터 패턴
·
JAVA
데코레이터 패턴 정의 기능을 동적으로 유연하게 확장할 수 있게 해주는 패턴 추가 기능을 Decorator 클래스로 정의한 후 조합함으로써 추가기능 조합을 설계하는 패턴 용도에 따라 객체의 기능을 계속 추가(데코레이트) 할 수 있게 해줌 데코레이터 패턴 특징 객체에 동적으로 기능을 추가할 수 있게 해줌 기능이 많아질수록 데코레이터 클래스들이 계속 추가 되어야 하기 때문에 클래스가 많아져서 복잡성이 높아짐 겹겹으로 애워싸기 때문에 객체의 정체를 알기가 힘듬 데코레이터 패턴 용도 요소들을 계속 수정하면서 사용하는 구조 인 경우 오소들을 조합해서 사용하는 경우 데코레이터 예시 public interface Box { void wrap(); } public class GiftBox implements Box { ..
[JAVA] 프록시패턴
·
JAVA
정의 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴 실제 기능을 수행하는 객체 대신 가상의 객체를 사용해 로직의 흐름을 제어하는 패턴 사용하는 용도 초기화 지연, 접근제어, 로깅, 캐싱 등 다양하게 응용해서 사용함 접근제어 (권한에 따른 접근 차단 / 캐싱 / 지연 로딩) 부가기능 추가 (원래 제공하는 기능에 더해서 부가 기능을 수행) 예시 //인터페이스 정의 public interface Subject { String operation(); } //인터페이스 상속한 실제 객체 @Slf4j public class RealSubject implements Subject { @Override public String operation() { log.info("실제 객체 호출"); sleep..
[JAVA] ThreadLocal
·
JAVA
동시성 문제 여러 쓰레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제 여러 쓰레드가 같은 인스턴스의 필드에 접근해야 하기 때문에 트래픽 적은 상황에서는 확률상 잘 발생하지 않아서 해당 문제를 찾기가 힘듬 동시성 문제가 발생하는 곳은 주로 같은 인스턴스의 필드(주로 싱글톤인 인스턴스)나 static 같은 공용 필드에서 접근시 발생하며 이러한 문제를 해결해 주는것이 ThreadLocal임 ThreadLocal 해당 쓰레드만 접근할 수 있는 특별한 저장소를 지칭함 각 쓰레드마다 별도의 내부 저장소를 제공하여 데이터를 안전하게 보관하여 동시성 문제를 해결해줌 JAVA는 ThreadLocal을 지원하기 위해 java.lang.ThreadLocal 클래스를 제공함 ThreadLocal 사용법 Thr..
[JAVA] 템플릿 메소드 패턴
·
JAVA
정의 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체 일을 수행하는 구조를 바꾸지 않으면서 특정 단계를 수행하는 내역을 바꾸는 패턴 GoF 디자인 패턴의 분류에 행위 패턴에 포함 abstract, final 키워드를 사용해서 구현하며, final 메소드와 abstract 메소드로 로직의 흐름만을 정의하고 구체적인 구현은 하위클래스에 위임함 구현별로 달라질수 있는 메소드들은 구현 클래스에서 선언 후 호출하는 방식으로 함 변하는 것과 변하지 않는 부분을 분리해주는 것을 해결하는 디자인패턴 (EX. 비즈니스 로직 기능은 변함, 로깅 기능은 변하지 않는 부분이며 둘을 모듈화가 가능하게 해줌) 템플릿 메서드 패턴은 템플릿이라는 기준이 되는 틀에서 변하지 않는부분을 몰아두고, 일부 변하는 부분을 별도로..
[JAVA] 전략패턴
·
JAVA
정의 행위를 클래스로 캡슐화하여 동적으로 행위를 자유롭게 바꿀수 있게 해주는 패턴 객체들이 할 수 있는 행위를 각각 전략으로 만들어, 동적으로 전략을 바꿔 행위를 수정하는 패턴 기존코드의 변경없이 실제 로직 변경을 할 수있는 패턴 GoF 디자인 패턴의 분류 중 행위패턴에 해당함 사용하는 용도 클래스들의 동작이 다른 경우 로직 변경이 필요할 때 사용 예시 public interface Skill { void use(); } public class Sett { private Skill skill; public void useSkill() { skill.use(); } public void setSkill(Skill skill) { this.skill = skill; } } public class Haymak..
[JAVA] TreeMap
·
JAVA
TreeMap 레드-블랙 트리 기반으로한 Map 컬렉션 내부 값들을 Key값을 기준으로 정렬하여 가지고 있음 HashMap보다 추가 삭제시 오래걸리나, 정렬된 데이터를 조회해야하는 범위 검색이 필요한 경우에는 효율적임 레드-블랙 트리 이진탐색트리의 문제점을 보완한 자료구조 이진탐색트리 같은 경우 한쪽으로 데이터의 값이 편향되게 들어갈 경우 굉장히 비효율적인 퍼포먼스를 냄 레드와 블랙으로 노드 색깔을 칠하고 부모노드보다 작은 값을 왼쪽, 큰 값을 가지면 오른쪽으로 배치하여 데이터 삽입과 삭제시 한쪽으로 치우치지 않도록 재배치와 다시칠하기 과정을 통해 균형을 맞춰줌 TreeMap 예제 TreeMap map = new TreeMap(); map.put(3, "value"); map.put(7, "value")..