공부하고 기록하는, 경제학과 출신 개발자의 노트

학습일지/Language 22

[Design Pattern] Observer

Observer 패턴 한 객체의 상태가 바뀌면, 해당 객체에 의존하는 다른 모든 객체에게 notice 전송 + 자동으로 내용이 갱신되는 one to many 방식의 의존성을 정의한 객체. Subject 객체의 bCheck 변수 - 해당 객체가 변경되었는지 여부를 알리는 boolean. bCheck가 false이면, Subject 객체에 의존하는 Observer 객체에게 값 변경이 있음을 알린다. Observer 객체는 update() 메소드로 Subject값이 어떻게 변경되었는지 확인하고, 변경된 값에 대응되는 메소드를 실행한다. 자바의 Observer 내장패턴 사용하기 Push방식, Pull방식 모두 사용가능함. java.util.Observer 인터페이스 구현 후 Observable 객체의 addOb..

[Design Pattern] Builder

Builder 패턴 객체 생성 시 흔히 사용되는 패턴. Dot chain 문법이라고도 부른다. 빌더 패턴을 다루는 두 가지 설명 GoF Design Pattern: 객체의 생성 / 조립 방법을 분리할 목적 Effective Java의 builder Pattern GoF의 패턴보다는 좀 더 코딩위주의 활용법. 코드 가독성 / 유지보수성을 위해 빌더 패턴을 권장함 객체 일관성, 불변성 (변경불가능) 등의 특징을 강조 규칙, 생성자 인자가 많을 경우 builder 패턴을 권장하는 편. effecitve java의 builder pattern은 깔끔하고 유연하게 객체를 생성하기 위한 기법. @Getter @Setter @AllArgsConstructor // 생성자에서 특정 필드만 제거한 채 구현하려면, 그만큼..

[Design Pattern] FlyWeight

FlyWeight 패턴 생성 비용이 큰 객체를 공통으로 사용할 수 있도록 만드는 패턴. 중복 생성될 가능성이 높은 객체 동일한 리소스가 자주 사용될 가능성이 높다는 의미이므로, 공통자원 형태로 관리하는 편이 효율적이다 생성비용은 크지만 사용빈도는 낮은 객체 이런 경우 매리 객체를 생성해두는 건 낭비. 요청이 있을 때에만 생성해서 제공한다. FlyWeight 패턴은 위 두 가지 목적을 위해 존재함. 객체 생성을 담당하는 Factory 역할과 객체 관리 역할을 분리하는 편이 유용한 경우도 있으나, 일반적으로는 역할의 크기가 크게 다르지 않으므로 하나의 클래스 안에 있어도 무방하다. 장점 많은 객체를 생성할 때 생성시간 / 메모리소모를 줄일 수 있음 state pattern과 결합이 용이함 단점 개별 설정이 ..

[Design Pattern] Singleton

SingleTon 객체가 많아지면 리소스 사용이 많아지고, 리소스가 많으면 프로그램 전체 속도가 떨어진다. -> 생성할 수 있는 객체의 최대 개수를 제한할 필요가 생김 Singleton 패턴: 객체 생성을 단 한번만 허용하는 패턴. 객체의 생성개수 제한이라는 조건이, 객체를 활용하려는 쪽에서 일일이 신경쓰지 않아도 되도록 하는 게 핵심. 용례 DB Connection Pool Log Writer ... @Getter public class Database { private static Database singleton; private String name; // getInstance()로 객체 불러오기. // 객체가 없을 경우 singleton 변수에 새 인스턴스를 할당하고, // 있으면 해당 객체를 그..

Spring AOP 요약

www.inflearn.com/course/spring-framework_core# 스프링 프레임워크 핵심 기술 - 인프런 이번 강좌는 스프링 부트를 사용하며 스프링 핵심 기술을 학습합니다 따라서 스프링 부트 기반의 프로젝트를 사용하고 있는 개발자 또는 학생에게 유용한 스프링 강좌입니다. 중급이상 웹 개발 www.inflearn.com Spring 핵심기술의 AOP 부분 정리. Spring AOP 스프링 AOP 구현체 제공, 자바에서 제공하는 구현체 (aspect-j) 와 연동. 스프링 txn, 캐시 등 여러 기능에 적용됨 흩어진 Aspect를 모듈화할 수 있는 프로그래밍 기법을 의미함. OOP의 보완관계. 여러 클래스에 걸쳐서 비슷한 코드를 사용해야 하는 경우 Transaction 처리. setAuto..

Java8 Stream - Optional - Date 정리

인프런 '더 자바- 자바8' 백기선님 강의내용 정리 Stream 정의: 연속된 데이터를 처리하는 Operation 모음. Collection이 데이터를 모아놓은 자료구조라면, Stream은 이걸 토대로 데이터를 원하는 방식으로 처리하는 것. 따라서 데이터 저장소의 개념이 아니다. 특징 Function in Nature. 원본 데이터를 변경하지 않는다. Stream stringStream = names.stream().map(String::toUpperCase); Stream으로 어떤 연산을 수행한 결과는 stream 객체이고, 원본은 바뀌지 않는다. 스트림으로 들어온 데이터는 한 번만 처리 (반복문 개념이 아님) seamless하게 들어오는 데이터 처리 가능. (무제한으로 데이터가 들어오면, 무한히 처리..

Java Reflection 정리

인프런 '더 자바 - 코드를 조작하는 다양한 방법' 백기선님 강의내용 정리 Reflection 코드를 조작하는 다양한 방법 중 하나. 정의된 클래스 / 메소드 / annotation 정보를 확인하고 참조하기 인스턴스를 생성하고, 필드값을 변경하며, 메소드를 실행할 수 있는 방법. 스프링부트 프로젝트 생성. dependency에 스프링 웹 추가. BookService와 BookRepository라는 두 개의 컴포넌트를 생성하고, BookService에 Autowired로 BookRepository를 추가한 뒤 BookServiceTest 코드를 아래처럼 작성한다. package com.inspirit941.thejavaspringreflection; import org.junit.jupite..

Java Concurrent Programming - Executors, Callable, Future, CompletableFuture

백기선님의 인프런 더 자바8 강의 내용 정리. Concurrent Programming 이전까지의 자바 Concurrent Programming을 알아야 한다. 자바의 기본 Concurrent Programming Concurrent 소프트웨어 동시에 여러 작업을 할 수 있는 SW 자바에서는 멀티프로세싱, 멀티쓰레드 둘 다 가능하다. 이 중 멀티쓰레드를 다룸. package com.inspirit941.java8to11; public class testConcurrentProgramming { static class MyThead extends Thread { @Override public void run() { System.out.println("Thread: " + Thread.currentThrea..

Java 함수형 인터페이스 - Lambda 표현식 - 메소드 레퍼런스 정리

함수형 인터페이스 추상 메소드가 하나만 있는 인터페이스 자바8에서부터 @FunctionalInterface Annotation을 지원. static과 default로 선언하고 구현한 함수는 '추상 메소드'가 아니므로 괜찮다. 함수형 프로그래밍을 하기 위해서는 해당 언어에서 함수(메소드)가 First Class Object여야 한다. 해당 함수는 Pure Function이어야 한다. 는 전제조건이 필요하고, 자바는 함수를 First Class Object로 취급하므로 프로그램 언어의 제약은 없다. cf. 함수형 인터페이스와 lambda는 자바에서 지원하는 문법일 뿐, 함수형 프로그래밍을 강제하는 게 아니다. First Class Object? 아래의 조건을 만족하는 객체를 First Class Object..

JVM의 ClassLoader 정리

JVM 구조 JVM은 다섯 가지 컴포넌트로 구성되어 있다. 클래스 로더 시스템 : 컴파일 결과로 만들어진 .class 바이트코드 파일을 읽어들여 메모리에 배치. 로딩, 링크, 초기화 세 가지 과정을 거친다. 메모리 Runtime Engine: 바이트코드를 읽어들이는 인터프리터가 작동하는 영역. 바이트 코드를 기계어로 변환하면서 Line by Line 실행하는 방식. 여기 인터프리터가 기계어 코드를 실행할 때, 한 번 변환한 바이트코드를 또 변환하는 대신 실행한 코드를 저장하는 영역이 있다. 그게 Code Cache (JIT Compiler라고도 부른다). 프로그램 실행속도를 향상시키는 용도. Garbage collection. Native Method interface Native Method libra..