Proxy Pattern

Proxy Pattern 에 대해 정리한다.

Proxy Server

프록시 패턴에 대해 정리하기 전에, 프록시 서버가 무엇인지 보자.

프록시의 사전적 의미는 “대리, 대리권, 대리 투표, 대리인” 이다.
프록시 서버는, 위키에 따르면 다음과 같다.

프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다.
서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 가리켜 ‘프록시’, 그 중계 기능을 하는 것을 ‘프록시 서버’ 라고 부른다.

정리하면 프로시 서버는,

  1. 클라이언트의 요청을 서버에게 대신 전달하고
  2. 서버의 응답을 클라이언트에게 대신 전달한다.

Proxy Pattern

그렇다면, 프록시 패턴은 무엇일까 ? 위키에 따르면 다음과 같다.

Read more

Collection Framework - TreeSet

Collection Framework 의 인터페이스 구조는 다음과 같다.

여기서, Set 인터페이스를 구현하는 클래스로는 HashSet, TreeSet 이 있다.
TreeSet 클래스를 정리해보자.

1. Set 인터페이스

Set 인터페이스를 구현하는 클래스는 다음 특징을 가진다.

  1. 데이터 저장 순서를 유지하지 않음
  2. 데이터의 중복 저장을 허용하지 않음

2. TreeSet - 예시 01

TreeSet 은 Set 의 위 두 가지 특성을 모두 만족한다. 그리고, 다음 특성도 만족한다.
3. 데이터를 정렬된 상태로 유지
다음 코드로, 확인해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
void tree_set() {
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(30);
treeSet.add(20);
treeSet.add(30);
treeSet.add(10);
treeSet.add(40);

Iterator<Integer> iterator = treeSet.iterator();
while (iterator.hasNext()){
Integer currentInteger = iterator.next();
System.out.println(currentInteger);
}
}

출력 결과는 아래와 같이, 30 을 중복으로 저장하지 않고 정렬 상태를 유지한다.

Read more

Collection Framework - HashSet

Collection Framework 의 인터페이스 구조는 다음과 같다.

여기서, Set 인터페이스를 구현하는 클래스로는 HashSet, TreeSet 이 있다.
HashSet 클래스를 정리해보자.

1. Set 인터페이스

Set 인터페이스를 구현하는 클래스는 다음 특징을 가진다.

  1. 데이터 저장 순서를 유지하지 않음
  2. 데이터의 중복 저장을 허용하지 않음

2. HashSet - 예시 01

HashSet 은 다음과 같이 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test_hash_set() {
HashSet<String> hashSet = new HashSet<>();
hashSet.add("E");
hashSet.add("C");
hashSet.add("B");
hashSet.add("A");
hashSet.add("E");

Iterator<String> iterator = hashSet.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}

출려 결과는 다음과 같다.

Read more

Collection Framework - Iterable

Collection 인터페이스는 아래과 같이 Iterable 인터페이스를 상속하고 있다.

Iterable 인터페이스가 무엇인지 정리해보자.

1. Iterator

Iterable 인터페이스에는 다음 세개의 메서드가 정의되어 있다.

여기서 iterator 메서드가 정의되어 있는데, Iterator 인터페이스를 반환한다.
즉, iterator 메서드를 호출하면 Iterator 인터페이스를 구현한 클래스의 인스턴스 참조 값을 반환한다.
그리고 Iterator 인터페이스에는 다음 네 개의 메서드가 정의되어 있다.

Iterator 의 사용법은 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class IteratorExample {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);

Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer currentInteger = iterator.next();
System.out.println(currentInteger);
}
}
}
Read more

Collection Framework - List

Java Collection Framework 의 List 를 정리한다.

1. Collection Framework

우선, Collection Framework 가 무엇일까.
공식 문서 (https://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.html)
에 따르면 다음과 같이 정의되어 있다.

컬렉션 프레임 워크는 컬렉션을 표현하고 조작하기위한 통합 아키텍처로, 구현 세부 사항과 독립적으로 컬렉션을 조작 할 수 있습니다.

컬렉션 프레임워크를 사용하면, 내부 구현을 몰라도 컬렉션을 일관된 방식으로 조작할 수 있다는 것을 알 수 있다.
그렇다면, 컬렉션이란 무엇일까 ? 공식 문서에 따르면,

컬렉션은 객체 그룹 (예 : 클래식 Vector 클래스)을 나타내는 객체입니다.

조금 더 구체적으로 정리하면, 컬렉션은 자료구조 (데이터 저장) 와 알고리즘 (데이터 연산) 을 클래스로 구현해 놓은 것이다.

2. Architecture

컬랙션 프레임워크의 인터페이스 구조는 아래와 같다.
List, Set, Queue 인터페이스가 Collection 인터페이스를 상속하고 있다.

Read more

Shallow Copy, Deep Copy

Clone

Object 클래스에는 인스턴스 복사를 위한 clone 메서드가 정의되어 있다.
이 메서드가 호출되면, 호출된 인스턴스의 복사본이 생성되고 이 복사본의 참조값이 반환된다.

다음과 같이 Point 클래스가 있다고 하자. Cloneable 인터페이스를 구현하고 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Point implements Cloneable {
private int x;
private int y;

public Point(int x, int y) {
this.x = x;
this.y = y;
}

public void showPositions() {
System.out.println(x + " " + y);
}

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

clone 메서드는 다음과 같이 호출해서 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void test_clone() {
Point origin = new Point(1, 2);
try {
Point copy = (Point) origin.clone();

origin.showPositions();
copy.showPositions();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}

결과는 다음과 같다.

지금까지의 상황을 그림으로 그려 보면 다음과 같다.

Read more

Sync/Async, Blocking/Non-Blocking

Sync 와 Async 의 차이, Blocking 과 Non-Blocking 의 차이를 정리한다.

Sync 와 Async

메서드의 결과를 제공하는 Server 를 기준으로 생각해야한다.
Sync 는 다음 그림과 같이, 메서드의 결과과 결정되고 나서야 반환을 한다.

Async 는 다음 그림과 같이, 메서드의 결과가 결정되기 전에 반환을 한다.

Blocking 과 Non-Blocking

메서드를 호출하는 Client 를 기준으로 생각해야한다.
Blocking 은 다음 그림과 같이, 메서드를 호출하고 메서드의 결과를 return 받을 때 까지 다른 작업을 못한다.

Non-Blocking 은 메서드를 호출하고 다른 작업을 할 수 있다. 이는 call-back 을 통해 가능하다. 즉, 메서드의 결과를 제공하는 서버에서 결과가 완성되면 클라이언트에게 call-back 을 하는 것이다. 다음 그림과 같다.

Read more