개발 공부/Java & Spring 31

21. fork & join 프레임워크

fork & join 프레임워크 : 하나의 작업을 작은 단위로 나눠서 여러 쓰레드가 동시에 처리하는 것을 쉽게 만들어주는 프레임워크이다. jdk1.7부터 추가 되었다. * RecursiveAction과 RecursiveTask 클래스 사용하려면 수행할 작업에 따라 RecursiveAction과 RecursiveTask, 두 클래스 중에서 하나를 상속받아 구현해야한다. RecursiveAction 반환값이 없는 작업을 구현할 때 사용 RecursiveTask 반환값이 있는 작업을 구현할 때 사용 // 두 클래스 모두 compute()라는 추상 메서드를 가지고 있는데, 상속을 통해 이 메서드를 구현하면 된다. public abstract class RecursiveAction extends ForkJoinT..

20. volatile

volatile : 변수의 앞에 붙이면 cpu의 코어가 변수의 값을 읽어올 때 캐시가 아닌 메모리에서 읽어서 캐시와 메모리간의 값의 불일치가 해결된다. * volatile이 필요한 이유 멀티 코어 프로세서에서는 코어마다 별도의 캐시를 가지고 있는데 코어는 메모리에서 읽어온 값을 캐시에 저장하고 캐시에서 값을 읽어서 작업한다. 다시 같은 값을 읽어올 때에는 먼저 캐시에 있는지 확인하고 없을때만 메모리에서 읽어온다. 그러다가 도중에 메모리에 저장된 변수의 값이 변경되어도 캐시에 저장된 값이 갱신되지 않아서 메모리에 저장된 값이 다른 경우가 발생한다. * volatile의 사용방법 //boolean stopped = false; //volatile volatile boolean stopped = false; ..

19. 쓰레드의 동기화

쓰레드의 동기화 : 하나의 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것. * 사전에 알아야할 개념 * 잠금(락,lock) : 모든 객체가 한개씩 갖고 있으며, 어떤 쓰레드가 lock을 가지면 다른 쓰레드들은 lock을 얻을 때까지 기다린다. * 임계영역(critical section) : 공유 데이터를 사용하는 코드 영역, lock을 획득한 하나의 쓰레드가 코드를 수행할 수 있는 영역 synchronized를 이용한 동기화 : 두 가지 방법있는데, 공통점은 lock의 획득과 반납이 모두 자동적으로 이루어진다는 것이다. 그래서 사용자는 임계영역만 설정해주면 된다. 1. 메서드 전체를 임계영역으로 지정 : 쓰레드는 synchronized메서드가 호출된 시점부터 해당 메서드가 포함된 객체..

18. 애너테이션(annotation)

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarings { String[] value(); } 애너테이션 : 자바 개발자들은 소스코드에 대한 문서를 따로 만들기 보다 소스코드의 주석'/** ~ */' 에 소스코드에 대한 정보를 저장하고 그 주석으로 부터 html문서를 생성해내는 프로그램(javadoc.exe)을 만들어서 사용했다. 이와 같은 기능을 응용하여, 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨것이 바로 애너테이션이다. 애너테이션은 주석처럼 프로그래밍 언어에 영향을 ..

17. 열거형(enums)

열거형 : 열거형은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다. JDK1.5부터 새로 추가되었고, 자바의 열거형은 값뿐만 아니라 타입도 관리하기 때문에 논리적인 오류를 줄일 수 있다. 또한 기존에는 상수의 값이 바뀌면 해당 상수를 참조하는 모든 소스를 다시 컴파일 해야했지만 열거형 상수를 사용하면, 다시 컴파일 하지 않아도 된다. * 열거형의 정의 enum 열거형이름 { 상수명1, 상수명2, ...} * 열거형의 사용방법 enum Direction {EAST, SOUTH, WEST, NORTH} public class Unit { int x, y; Direction dir; void init(){ dir = Direction.EAST; } void move..

16. 해싱과 HashMap

해싱(hashing) : 해시함수를 이용하여 데이터를 해시테이블에 저장하고 검색하는 기법 해시함수는 데이터가 저장되어있는 위치를 알려주기 때문에 해싱을 이용하면 다량의 데이터 중에서도 원하는 데이터를 빠르게 찾을 수 있다. * 해싱의 자료구조 - 배열과 링크드 리스트의 조합으로 되어있다. 저장할 데이터의 키를 해시함수에 넣으면 배열의 한 요소를 얻게 되고 , 다시 그 곳에 연결되어 있는 링크드 리스트에 저장하게 된다. * 해싱의 검색 프로세스 1. 검색하고자 하는 값의 키로 해시함수를 호출한다. 2. 해시함수의 계산결과(해시코드)로 해당 값이 저장되어있는 링크드 리스트를 찾는다. 3. 링크드 리스트에서 검색한 키와 일치하는 데이터를 찾는다. * 링크드 리스트는 검색이 불리한 자료구조이기 때문에 링크드 리..

15. 이진 검색 트리와 TreeSet

이진 검색 트리(binary search tree) : 이진트리는 여러개의 노드가 서로 연결된 구조로, 이진 검색 트리는 부모노드의 왼쪽에는 부모노드의 값보다 작은 값의 자식노드를, 오른쪽에는 큰 값의 자식노드를 저장하는 이진 트리이다. 정렬, 검색, 범위검색에 높은 성능을 보이는 자료구조이다. 예시 ) 이진 검색트리에 7,4,9,1,5의 순서로 값을 저장한다고 할 때 첫번째로 저장되는 값(7)은 루트가 되고, 두 번째 값(4)은 트리의 루트부터 시작해서 값의 크기를 비교하면서 트리를 따라 내려간다. 작은 값은 왼쪽에, 큰 값은 오른쪽에 저장되면서 결과적으로 왼쪽 마지막 레벨이 제일 가장 작은 값이 되고 오른쪽 마지막 레벨의 값이 제일 큰 값이 된다. * 이진 검색 트리의 특징 - 모든 노드는 최대 두 ..

14.HashSet

HashSet : Set인터페이스를 구현한 가장 대표적인 컬렉션 * HashSet의 특징 1. 중복을 허용하지 않는다. 2. 저장순서를 유지하지 않으므로 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야한다. 3.add와 contain메소드의 시간복잡도는 O(1), next의 시간복잡도는 O(h/n)이다. * O(h/n)의 이유는 엘리먼트에 비해 해시버킷의 수가 늘어나면 해시버킷으로 사용하는 배열의 대부분은 비어있게 되고, 엘리먼트가 담겨 있는 해시버킷을 찾기 위해 매번 비어있는 해시버킷을 방문해야하기 때문에 h 가 들어갔다. 또한 엘리먼트의 숫자가 늘어나면 해시버킷이 비어있을 가능성이 줄어들게 되고, O(1)에 근접하게 된다. 이런 의미에서 H/N 이라는 시간복잡도를 써 놓은 것 같다. ..

13. Comparator와 Comparable

Comparator, Comparable : 컬렉션을 정렬하는데 필요한 메서드를 정의한 인터페이스, 두 객체를 비교할 수 있는 메소드를 갖고 있다. * Comparable 컬렉션이 기본으로 갖고 있는 정렬기준을 구현하는데 사용. Integer와 같은 wrapper클래스와 String, Date, File과 같은 클래스에서 구현하고 있다. import java.util.*; class ComparatorEx { public static void main(String[] args){ String[] strArr = {"cat", "Dog", "lion", "tiger"}; Arrays.sort(strArr); // String의 기본정렬 System.out.println("strArr="+Arrays.toS..

12. java.time 패키지 파싱과 포맷

DateTimeFormatter 클래스 * 형식화의 예시 LocalDate date = LocalDate.of(2016, 1, 2); // "2026-01-02" String yyyymmdd = DateTimeFormatter.ISO_LOCAL_DATE.format(date); * 형식화에 쓰이는 format() 메소드는 DateTimeFormatter 뿐만아니라 LocalDate나 LocalTime같은 클래스에도 있는데 같은 기능이니 편한쪽을 사용하면 된다. * DateTimeFormatter에 상수로 정의된 형식 1. 로케일에 종속된 형식화 * DateTimeFormatter의 ofLocalizedDate(), ofLocalizedTime(), ofLocalized DateTime()은 로케일(loc..

728x90
반응형