아래 블로그 참조
동기(Synchronous)는 정확히 무엇을 의미하는걸까?
동기
비동기
동기와 비동기는 프로세스의 수행 순서 보장에 대한 매커니즘
blocking과 non-blocking은 프로세스의 유휴 상태에 대한 개념
시험날의 학생과 선생 (비동기의 예시)
자바의 정석 11장 학습
Vector나 ArrayList같이 배열을 이용한 자료구조는 용량을 변경할 때 새로운 배열을 생성하고, 기존의 배열로부터 새로 생성된 배열로 데이터를 복사해야돼서 효율이 떨어진다.
데이터를 읽어오고 저장하는데는 효율이 좋다.
처음에 인스턴스 생성시, 저자할 데이터의 개수를 잘 생각해서 충분한 용량의 인스턴스를 생성한다.
public class ArrayListEx2 {
public static void main(String[] args) {
final int LIMIT = 10; // 자르고자 하는 글자의 개수
String soure = "0123456789abcdefghijABCDEFGHIJ!@#$%^&*()ZZZ";
int lenght = soure.length();
List list = new ArrayList(lenght/LIMIT + 10); // 크기를 여유있게 잡는다.
for(int i =0; i < lenght; i+=LIMIT){
if(i+LIMIT < lenght)
list.add(soure.substring(i,i+LIMIT));
else
list.add(soure.substring(i));
}
for(int i = 0; i <list.size(); i++){
System.out.println(list.get(i));
}
}
}
substring()에 인자가 하나만 들어가면 그 인덱스이후의 문자열을 리턴하는 것
Vector 예제(588p)
public class VectorEx1 {
public static void main(String[] args) {
Vector v = new Vector(5);
v.add("1");
v.add("2");
v.add("3");
print(v);
// 빈 공간을 없앤다.
v.trimToSize();
System.out.println("=== After trimToSize() ===");
print(v);
v.ensureCapacity(6);
System.out.println("=== After ensureCapacity ===");
print(v);
v.setSize(7);
System.out.println("=== After setSize ===");
print(v);
v.clear();
System.out.println("=== After clear ===");
print(v);
}
public static void print(Vector v){
System.out.println(v);
System.out.println("size : " + v.size());
System.out.println("capacity : " + v.capacity() );
}
}
</> 실행 결과
[1, 2, 3]
size : 3
capacity : 5
=== After trimToSize() ===
[1, 2, 3]
size : 3
capacity : 3
=== After ensureCapacity ===
[1, 2, 3]
size : 3
capacity : 6
=== After setSize ===
[1, 2, 3, null, null, null, null]
size : 7
capacity : 12
=== After clear ===
[]
size : 0
capacity : 12
배열의 단점을 보완한 자료구조이다.
불연속적으로 존재하는 데이터를 서로 연결한 형태
이동 방향이 단방향이기 때문에 다음 요소의 접근은 쉽지만, 이전 요소의 접근은 어렵다. → 이를 보완한것이 더블 링크드 리스트
배열의 장점
배열은 연속적인 특성을 가지고 있음
배열의 단점
크기를 변경할 수 없다.
→ 새로운 배열을 생성해서 데이터를 복사해야 한다.
→ 크기의 변경을 피하기 위해 여유로운 크기의 배열을 생성하면 메모리가 낭비된다.
중간에 데이터를 추가하거나 삭제할 때 시간이 많이 거린다.
링크드 리스트의 장점
링크드 리스트의 단점
더블 링크드 리스트(이중 연결 리스트, doubly linked list)
더블 써큘러 링크드 리스트(이중 원형 연결리스트, doubly circular linked list)
ArrayList vs LinkedList?(601p)
Stack
Queue
Stack의 메서드(604p)
boolean empty()
추출
Object peek()
: 맨위에 있는 객체를 보기만 하고, 꺼내지는 않는다.
Object pop()
: 맨위에 저장된 객체를 꺼낸다.
추가
위치 찾기
int search(Object o)
: 위치 반환, 배열과 달리 0이 아닌 1부터 시작, 배열의 indexOf 와 비슷한 메서드
Queue의 메서드(605p)
추가
boolean add(Objcet o)
: 저장공간이 부족하면 예외 발생
boolean offer(Object o)
: 예외 발생하지 않음
추출과 삭제
Object poll()
: 객체를 꺼내서 반환, 비어있으면 null 반환
Object peek()
: 삭제 없이 요소를 읽어온다, 비어있으면 null 반환
Object remove()
: 객체를 꺼내서 반환, 비어있을 시 예외 발생
Stack과 Queue 예제
public class StackQueueExam {
public static void main(String[] args) {
Stack st = new Stack();
Queue q = new LinkedList();
st.push("0");
st.push("1");
st.push("2");
q.offer("0");
q.offer("1");
q.offer("2");
System.out.println("== Stack ==");
while(!st.empty()){
System.out.println(st.pop());
}
System.out.println("== Queue ==");
while ((!q.isEmpty())){
System.out.println(q.poll());
}
}
}
스택활용 예 - 수식계산, 수식괄호검사, undo/redo, 웹브라우저의 뒤로/앞으로
큐의 활용 예 - 최근 사용문서, 작업 대기목록, 버퍼(buffer)
public class QueueEx1 {
static Queue q = new LinkedList<>();
static final int MAX_SIZE = 5; // Queue에 최대 5개까지만 저장되도록
public static void main(String[] args) {
System.out.println("help를 입력하면 도움말을 볼 수 있습니다.");
while (true) {
System.out.print(">> ");
Scanner s = new Scanner(System.in);
String input = s.nextLine().trim();
if ("".equals(input)) continue;
if (input.equalsIgnoreCase("q")) {
System.exit(0);
} else if (input.equalsIgnoreCase("help")) {
System.out.println(" help - 도움말을 보여줍니다.");
System.out.println(" q - 프로그램을 종료합니다.");
System.out.println(" history - 최근에 입력한 명령어를 " + MAX_SIZE + "개 보여줍니다.");
} else if(input.equalsIgnoreCase("history")){
int i = 0;
// 입력받은 명령어 저장
save(input);
LinkedList tmp = (LinkedList) q;
ListIterator it = tmp.listIterator();
while (it.hasNext())
System.out.println(++i +"." +it.next());
} else {
save(input);
System.out.println(input);
}
}
}
public static void save(String input){
// queue에 저장
if(!"".equals(input))
q.offer(input);
// queue의 최대 크기를 넘으면 제일 처음 요소 삭제
if(q.size() > MAX_SIZE)
q.remove();
}
}