분류 전체보기

디자인 패턴/GOF

Template Method Pattern 적용

좋은 설계는 변하는 것과 변하지 않는 것을 분리하는 것이다. 예를들어, 핵심 기능 부분이 변하고, 부가 기능 부분이 변하지 않는 부분이라면, 이 둘을 분리해서 모듈화해야 한다. 템플릿 메서드 패턴은 이런 문제를 해결하는 디자인 패턴이다. 다음에서 추상 클래스를 활용해서 부모 클래스에 변하지 않는 템플릿 코드를 두고, 변하는 부분은 자식 클래스에 두고 상속과 오버라이딩을 사용해서 처리하는 것을 볼 수 있다. /** * 변하지 않는 부분 */ @Slf4j public abstract class AbstractTemplate { public void execute() { long startTime = System.currentTimeMillis(); call(); long endTime = System.cur..

Language/Java

ThreadLocal 동기화 적용 및 주의사항

ThreadLocal을 사용하여 동기화를 적용하여 개발하기 위해 기존 인스턴스 변수의 참조타입을 ThreadLocal으로 변경할 수 있다. 이를 적용하여 필드 대신에 ThreadLocal을 사용하여 데이터를 동기화하는 ThreadLocalLogTrace 클래스를 만들면 다음과 같다. package hello.advanced.trace.logtrace; import hello.advanced.trace.TraceInfo; import hello.advanced.trace.TraceStatus; import lombok.extern.slf4j.Slf4j; @Slf4j public class ThreadLocalLogTrace implements LogTrace{ private static final Stri..

Language/Java

동시성 문제와 ThreadLocal

동시성 문제를 알아보기 위해 파라미터로 넘어온 name을 클래스 변수 nameStore에 저장하고, 1초간 쉰 다음 nameStore가 참조하는 값을 반환하는 서비스 코드를 다음과 같이 작성한다. @Slf4j public class FieldService { private String nameStore; public String logic(String name) { log.info("저장 name = {} -> nameStore = {}", name, nameStore); nameStore = name; sleep(1000); log.info("조회 nameStore = {}", nameStore); return nameStore; } private void sleep(int millis) { try {..

Language/Java

싱글쓰레드와 멀티쓰레드, 싱글코어와 멀티코어

병행(concurrent)와 병렬(parallel) 싱글 코어에서 하나의 쓰레드로 두 개의 작업을 수행한 시간보다 오히려 두 개의 쓰레드로 작업한 시간이 싱글쓰레드로 작업한 시간보다 더 걸리게 되는데 그 이유는 쓰레드간의 context swtiching에 시간이 걸리기 때문이다. 따라서 싱글 코어에서 단순히 CPU만을 사용하는 계산 작업이라면 오히려 멀티쓰레드보다 싱글쓰레드로 프로그래밍하는 것이 더 효율적이다. 다음은 하나의 쓰레드로 두 가지 작업을 하는 코드와 결과이다. public class ThreadEx4 { public static void main(String[] args) { long startTime = System.currentTimeMillis(); for (int i = 0; i < ..

Language/Java

Context Switching, Thread

Amdahl's Law 암달의 법칙은 컴퓨터 시스템의 일부를 개선할 때, 전체적으로 얼마만큼의 최대 성능 향상이 있는지 계산하는데 사용된다. 병렬 컴퓨팅을 할 경우, 일부 병렬화가 가능한 작업들은 사실상 계산에 참여하는 컴퓨터의 개수에 비례해서 속도가 늘어난다. 하지만 암달의 법칙에 의해 아무리 컴퓨터의 개수가 늘어나더라도 속도의 한계는 정해져있다. 병렬 vs 병행 병행(Concurrent)은 멀티스레드 프로그래밍을 의미한다. 병렬(Parallel)은 멀티코어 프로그래밍을 의미한다. 따라서 여기서는 병행 프로그래밍(동시성 프로그래밍, 멀티스레드 프로그래밍)을 알아본다. Context Switching 그렇다면 어떻게 동시에 프로그램들이 실행될 수 있는 것일까? 컴퓨터는 0초부터 1초까지 시간을 잘게 쪼갠..

Language/Java

I/O - 다양한 IO객체들, 객체 직렬화

DataInputStream, DataOutputStream DataInputStream과 DataOutputStream은 기본형 타입과 문자열을 읽고 쓸 수 있는 객체이다. 다음은 다양한 타입을 파일에 저장하고, 읽어들이는 코드이다. package theory.io; import java.io.DataOutputStream; import java.io.FileOutputStream; public class DataInputExam { public static void main(String[] args) throws Exception { // /tmp/score.dat 파일에 저장한다. String name = "kim"; int kor = 90; int eng = 60; int math = 70; do..

Language/Java

I/O - Decorator Pattern

Composite Pattern 과 Decorator Pattern 폴더와 파일을 다이어그램으로 표현해보자 폴더와 파일의 공통점으로 FileComponent로 뽑아낸다. 여기서 핵심은 폴더는 파일 컴포넌트를 가진다. 즉, 폴더는 파일 컴포넌트를 구현하는 폴더나 파일을 가질 수 있다는 소리이다. (일체화). 이런 형식을 Composite Pattern이라고 한다. 이 내용을 아래 코드로 작성할 수 있다. package theory.composite; public abstract class Node { private String name; // 폴더와 파일의 이름 public Node(String name) { this.name = name; } public String getName() { return n..

Language/Java

Java I/O - IO Stream

I/O Stream이란 byte나 char의 흐름이다. 그리고 byte 단위의 입출력 클래스는 InputStream, OutputStream의 후손이다. 마찬가지로 char 단위의 입출력 클래스는 Reader, Writer의 후손이다. 그리고 이들은 모두 추상 클래스이다. 또한 자바 I/O 객체는 사용하면 꼭 close를 해줘야한다. https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/package-summary.html java.io (Java SE 17 & JDK 17) package java.io Provides for system input and output through data streams, serialization a..

Language/Java

I/O - File 클래스

java.io.File 클래스는 파일의 크기, 파일의 접근 권한, 파일의 삭제, 이름 변경 등의 작업을 할 수 있는 기능을 제공해 준다. (디렉토리도 파일 취급) 하지만, 파일 인스턴스를 만들었다고 해서 실제 폴더에 파일이 생성되는 것은 아니다. https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/File.html File (Java SE 17 & JDK 17) All Implemented Interfaces: Serializable, Comparable An abstract representation of file and directory pathnames. User interfaces and operating systems use..

Language/Java

I/O (Input, Output)

입출력을 뜻하는 것으로, 입력은 키보드, 네트워크, 파일 등으로부터 받을 수 있고, 출력은 화면, 네트워크, 파일 등에 할 수 있다. Java I/O에서 사용되는 객체는 자바에서 사용되는 객체이다. 즉, Java I/O가 제공하는 객체는 어떤 대상으로부터 읽어들여서 어떤 대상에게 쓰는 일을 한다. 또한 Java I/O는 조립되어 사용되도록 만들어졌다. 즉, 아래와 같이 Decorator 패턴으로 만들어졌다. 장식할 대상을 주인공으로 보고 이 주인공을 장식한다고 하자. 케이크의 빵이 주인공이라고 하면, 이 빵에 크림과 딸기 등의 장식을 덧붙일 수 있다. 위 그림에서 보면 ConcreteComponent가 주인공이고, Decorator가 장식인데, Decorator는 Component를 가질 수 있다. 즉 ..

kimjingyu
'분류 전체보기' 카테고리의 글 목록 (9 Page)