Linked list
기존 배열의 연속적인 특성을 띄는 단점을 보완해서 비순차적인 연결 기반의 배열을 생성하는 컬렉션
배열의 장점
- 배열은 구조가 간단하고 데이터를 읽는데 걸리는 시간이 짧다. (접근시간 access time)
배열의 단점
- 크기를 변경할 수 없다. 크기를 변경해야 하는 경우 새로운 배열 생성 후 데이터를 복사해야 함. 크기가 큰 배열을 생성할 경우 메모리가 낭비된다.
- 비순차적인 데이터의 추가,삭제에 시간이 많이 걸린다. 데이터를 추가하거나 삭제하기 위해, 다른 데이터를 옮겨야 함.
Comparator 와 Comparable
Comparable - 기본 정렬기준을 구현하는데 사용 (오름차순, 내림차순 등)
Comparable - 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용
TreeSet
- 이진 탐색 트리(binary search tree)로 구현. 범위 탐색과 정렬에 유리
- 이진 트리는 모든 노드가 최대 2개의 하위 노드를 갖음
- 부모보다 작은 값은 왼쪽, 큰 값은 오른쪽에 저장
- 데이터가 많아질수록 추가, 삭제에 시간이 더 소요됨 (비교횟수가 증가함에 따라)
와일드카드 <?>
- 하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능
- 메소드의 매개변수에도 와일드카드를 사용
<? extends T> - 와일드카드의 상한 제한 T와 그 자손들만 가능
<? super T> - 와일드카드의 하한 제한 T와 그 조상들만 가능
<?> - 제한없음. 모든 타입이가능. <? extends Object>와 동일
thread 쓰레드
쓰레드의 종류는 일반쓰레드와 데몬쓰레드 두가지가 존재하고 쓰레드는 프로세스내에서 실제 작업을 수행하며 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다. 프로세스는 작업환경(공장), 쓰레드는 실제수행(인력) 으로 생각하면 이해하기 쉽다.
싱글쓰레드는 다소 비용문제가 발생하기 때문에 대다수의 프로그램은 멀티쓰레드를 사용한다.
데몬쓰레드
- 일반쓰레드의 작업을 돕는 보조적인 역할을 수행
- 일반쓰레드가 종료되면 자동으로 종료된다.
- 가비지컬렉터, 자동저장, 화면 자동갱신 등에 사용된다.
- 사용방법은 무한루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.
쓰레드의 상태
NEW - 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태
RUNNABLE - 실행중 또는 실행 가능한 상태
BLOCKED - 동기화 블럭에 의해서 일시정지된 상태(lock가 풀릴때까지 대기 상태)
WATING,TIMED_WATING - 쓰레드의 작업이 종료되지는 않았지만, 실행가능하지 않은 일시정지 상태. TIME_WATING은 일시정지시간이 지정된 경우를 의미
TERMINATED - 쓰레드의 작업이 종료된 상태
thread 실행제어
[ static이 필요한 자기자신에게 적용되는 2가지 ]
sleep() - 현재 쓰레드를 지정된 시간동안 멈추게 한다. 특정쓰레드를 지정해서 멈추게 하는 것은 불가능하다. (예외처리를 해야한다)
yield() - 남은 시간을 다음 쓰레드에게 양보하고, 자신은(현재 쓰레드) 실행대기한다.
interrupt() - 대기상태인 쓰레드를 실행대기 상태로 만든다.
쓰레드의 실행을 (일시정지 suspend, 재개 resume, 완전정지 stop) 중지하는 3가지 제어문
join() - 지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다. (sleep과 같이 예외필요)
쓰레드의 동기화
한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하게 막는 것
멀티 쓰레드 프로세서에서는 다른 쓰레드의 작업에 영향을 미칠 수 있으므로 진행중인 작업이 다른 쓰레드에게 간섭받지 않게 하려면 '동기화'가 필요하다. 동기화하려면 간섭받지 않아야 하는 문장들을 '임계영역'으로 설정하고 그 영역은 '락'을 얻은 단 하나의 쓰레드만 출입가능 (객체1개에 락1개)
synchronized를 이용한 동기화
synchornized로 임계영역(lock이 걸리는 영역)을 설정하는 방법 2가지
동기화의 효율을 높이기위해 wait(), notify()를 사용한다. Object 클래스에 정의되어 있으며, 동기화 블럭내에서만 사용할 수 있다.
wait() - 객체의 lock을 풀고 쓰레드를 해당 객체의 wating pool에 넣는다.
notify() - waiting pool 에서 대기중인 쓰레드 중의 하나를 깨운다.
notifyAll() - wating pool 에서 대기중인 모든 쓰레드를 깨운다.
람다식
람다식이란 - 함수를 간단한 식으로 표현하는 방법. 익명 함수라고도 한다.
함수와 메소드의 차이
- 근본적으로는 동일. 함수는 일반적 용어 메소드는 객체지향개념 용어
- 함수는 클래스의 독립적, 메소드는 클래스의 종속적
람다식 작성하는 방법
1. 메소드의 이름과 반환타입을 제거하고 '->'를 블록 {} 앞에 추가한다.
2. 반환값이 있는 경우, 식이나 값을 적고 리턴문 생략가능 (끝에 세미콜론 안 붙임)
3. 매개변수의 타입이 추론 가능하면 생략가능 (위의경우 int, 대부분의 생략 가능)
함수형 인터페이스 - 단 하나의 추상 메소드만 선언된 인터페이스
함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있음.
(단, 함수형 인터페이스의 메소드와 람다식의 매개변수 개수와 반환타입이 일치해야 함)
UnaryOperator - 단항 연산자
BinaryOperator - 이항 연산자
Predicate의 결합
and(), or(), negate() 로 두 predicate를 하나로 결합
생활코딩님의 기초강의는 정주행 한번 하였고 부족한 부분들이 있을거 같아 남궁성님의 자바의 정석이란 강의도 유명하다고 해서 듣고 있는중이다. 학원 수강전에 남은 기간안에 들으려고 중복된 것들은 조금 스킵해가면서 듣는중인데 요것도 이제 거의 얼마 남지않았다.
종종 백준문제를 같이 풀면서 수강중인데 요즘 드는 생각은 지금까지 많은걸 배운거 같지만 이러한 것들은 대체 언제,어떻게 쓸까라는 의문점이 든다 ㅠㅠ 하염없이 광범위하기도 하고 배우는 것도 끝이 없다는 생각에 드는 느낌일까.. 약간 허공에 노젓는 그런기분이다..
배운걸 쓰려고 해보면 까먹고 또 진도는 나가야하고 열심히 이해하고 머릿속에 구겨 넣어도 절반은 뱉어내는 느낌이랄까..?
그리고 백준문제를 풀면서 머릿속에서는 어떻게 해야하고 막 그런 구조,설계 같은건 느낌이 오는데 막상 코드를 짜보면은 모니터 앞에서 멍만 때리고 있다... 문제를 풀때마다 쉬워 보이는 것들도 막상 구조를 짜보려면 쉽지 않다는게 느껴진다..
'Java' 카테고리의 다른 글
쌍용강북교육센터 국비 학원 Day 1일차 Java (Class, instance) (0) | 2023.01.02 |
---|---|
Java 기초 입문 12일차 (메소드 참조, Stream) (0) | 2023.01.02 |
Java 자주사용하는 String Class의 생성자와 메소드 (0) | 2022.12.16 |
Java 기초 입문 10일차 (Collections Framework, Iterator, Map) (0) | 2022.12.07 |
Java 이클립스 (eclipse) 단축키 모음 (0) | 2022.12.07 |