Language/Java

Language/Java

제네릭 메서드가 필요한 이유

public T genericMethod(T o) {// 제네릭 메소드 ... } [접근 제어자] [반환타입] [메소드명]([제네릭타입] [파라미터]) { // 텍스트 } 제네릭 메서드는 클래스와 다르게 반환타입 이전에 제네릭 타입을 선언한다. 그러면 genericMethod는 파라미터 타입에 따라 T 타입이 결정된다. 즉, 클래스에서 지정한 제네릭 유형과 별도로 메서드에서 독립적으로 제네릭 유형을 선언하여 쓸 수 있다. 여기서에 제네릭 메서드가 필요한 이유에 대한 힌트를 얻을 수 있다. 바로 정적 메서드로 선언할 때 필요하기 때문이다. 즉, 객체 생성과 관계 없이 독립적으로 static 메서드에서 사용할 제네릭 타입이 필요한 것이다.

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
'Language/Java' 카테고리의 글 목록