JAVA(247)
-
[Spring][IoC] Spring IoC Container & Bean
1. Spring IoC(Inversion of Control) IoC(Inversion of Control)은 제어의 역전이라는 의미로써 어떤 객체의 필드 멤버(참조 변수)에 직접 인스턴스를 생성하지 않고 생성자와 같은 방법을 통해서 주입받아 사용하는 방법을 의미합니다. 제어권을 갖고 있는 경우 class OwnerController{ private OwnerRepository repository = new OwnerRepository(); } 위 코드를 보면 OwnerController 클래스가 필드멤버인 OwnerRepository 인스턴스를 직접생성하는 것을 볼 수 있습니다. 이 상태는 OwnerController 클래스가 OwnerRepository 인스턴스에 대해서 제어권을 직접 갖는 것을 알..
2022.07.28 -
[Java][Generics] 지네릭스(Generics)
1. 지네릭스란 무엇인가? 지네릭스는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크(comptile-time type check)를 해주는 기능입니다. 지네릭스의 장점 타입 안정성을 제공합니다. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해집니다. 예를 들어 ArrayList 컬렉션 클래스에 타입을 지정하여 해당 클래스 타입의 인스턴스만을 담을 수 있습니다. ArrayList list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); 2. 지네릭 클래스의 선언 어떤 클래스를 지네릭 클래스로 변경하고자 한다면 다음과 같이 선언할 수 있습니다. class Box{ // 지네릭 타입 T를 선언 T item; ..
2022.07.22 -
[Java][Effective Java] item 14. Comparable을 구현할지 고려하라
1. Comparable을 구현할때 무엇을 고려해야 하는가? 알파벳, 숫자, 연대같이 순서가 명확한 값 클래스를 정의한다면 반드시 Comparable 인터페이스를 구현하자. Collection, Set, Map과 같은 인터페이스는 비교를 할때 Object.equals 메서드를 사용하지 않고 Comparable.compareTo 메서드를 사용하기 때문에 컬렉션과 같은 인터페이스에 인스턴스를 넣을때 Comparable을 구현하자. Comparable을 구현하지 않은 필드나 표준이 아닌 순서로 비교해야 한다면 비교자(Comprator)를 대신 사용하자. compareTo 메서드에서 관계 연산자 를 사용하는 이전 방식은 오류를 유발할 가능성이 있습니다. 클래스의 필드 멤버가 여러개 있고 비교해야 한다면..
2022.07.06 -
[Java][Thread] 쓰레드의 동기화 #4 fork & join 프레임워크
fork & join 프레임워크 JDK 1.7 하나의 작업을 작은 단위로 나눠서 여러 쓰레드가 동시에 처리하는 것을 쉽게 만들어줍니다. 1. fork & join 프레임워크 종류 RecursiveAction 반환값이 없는 작업을 구현할 때 사용 RecursiveTask 반환값이 있는 작업을 구현할 때 사용 RecursiveAction 추상 클래스 형식 public abstract class RecursiveAction extends ForkJoinTask{ ... protected abstract void compute(); // 상속을 통해 이 메서드를 구현해야함 ... } RecursiveTask 추상 클래스 형식 public abstract class RecursiveTask extends Fork..
2022.07.05 -
[Java][Thread] 쓰레드의 동기화 #3 volatile
1. volatile의 필요성 멀티 코어 프로세서 환경에서 쓰레드를 사용하는 경우 각각의 코어에는 별도의 캐시를 가지고 있습니다. 그리고 쓰레드를 수행하는 CPU 코어는 메모리에서 읽어온 값을 캐시에 저장하고 캐시에서 값을 읽어서 작업을 수행합니다. 다시 같은 값을 읽어올 때는 먼저 캐시에 있는지 확인을 한 다음에 없을 때만 메모리에서 읽어오게 됩니다. 때문에 메모리에 저장된 변수의 값이 변경이 되었는데도 캐시에 저장된 값이 갱신되지 않아서 메모리에 저장된 값이 다른 경우가 발생합니다. 다음 예제는 쓰레드 3개의 이름을 출력하는 예제입니다. 주목할 점은 쓰레드 인스턴스의 메소드를 사용하지 않고 변수를 이용해서 중지했다가 다시 수행한다는 점입니다. public class Driver { public sta..
2022.07.05 -
[Java][Thread] 쓰레드의 동기화 #2 Lock과 Condition을 이용한 동기화
JDK에서 동기화할 수 있는 방법으로 synchronized 키워드를 제외한 "java.util.concurrent.locks" 패키지를 제공합니다. locks 클래스는 JDK 1.5 이후부터 제공합니다. 1. lock 클래스의 종류 ReentrantLock : 재진입이 가능한 lock, 가장 일반적인 배타 lock ReentrantReadWriteLock : 읽기에는 공유적이고, 쓰기에는 배타적인 lock StampedLock : ReentrantReadWriteLock에 낙관적인 lock의 기능들을 추가 StampedLock 클래스는 JDK 1.8부터 추가됨 Lock 인터페이스를 구현하지 않음 ReentrantLock 클래스 특정 조건에서 lock을 풀고 나중에 다시 lock을 얻고 임계영역으로 들어..
2022.07.05