SlideShare a Scribd company logo
Java(4/4)
taesoo.kim87@gmail.com 김태수
Part1. Collection F/W
1) 개요와 구분
1 컬렉션 프레임 워크
개요
객체들을 추가/검색/삭제 할 수 있도록 java.util패키지에 컬렉션과 관련된
인터페이스와 클래스들을 포함시켜놓은 것을 컬렉션 프레임워크라고 부름.
인터페이스분류(대) 인터페이스분류(소) 특징 구현 클래스
Collection
List
순서를 유지하고 저장
중복저장가능
ArrayList, Vector,LinkedList
Set
순서를 유지하지 않고
저장
중복 저장 안됨
HashSet, TreeSet
Map
키와 값의 쌍으로 저
장
키는 중복 저장이 안
됨
HashMap, HashTable,
TreeMap, Properties
2) List 컬렉션(1)
1 컬렉션 프레임 워크
개요
List는 객체를 일렬로 늘어 놓은 구조. 인덱스로 관리. 객체의 번지를 참조하여 저장.
동일 객체를 중복저장하면 같은 번지를 참조.
null을 저장할 경우 해당 인덱스는 객체를 참조하지 않음.
기능 메소드 설명
객체추가
boolean add(E e) 주어진 객체를 맨 끝에 추가
void add(int index, E element) 주어진 인덱스에 객체를 추가
void set(int index, E element) 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈
객체검색
boolean contains(Object o) 주어진 객체가 저장되어 있는지 여부
E get(int index) 주어진 인덱스에 저장된 객체를 리턴
boolean isEmpty() 커렉션이 비어있는지 조사
int size() 저장되어 있는 전체 객체 수를 리턴
객체삭제
void clear() 저장된 모든 객체를 삭제
E remove(int index) 주어진 인덱스에 저장된 객체를 삭제
boolean remove(Object o) 주어진 객체를 삭제
3) List 컬렉션(2)
1 컬렉션 프레임 워크
ArrayList
ArrayList는 List인터페이스의 구현클래스. 배열은 불변 크기, ArrayList는 가변크기.
특정 인덱스 삭제/삽입시 이후의 인덱스가 쉬프트된다.
Vector
Vector는 ArrayList와 달리, 동기화된 메소드로 구성되어있어서 멀티스레드가 동시에 메소드를 실행
할 수 없고 하나의 스레드가 실행을 완료해야 다른 스레드를 실해알 수 있다. 때문에 thread-safe하다.
LinkedList
List의 구현클래스이지만, 인접참조를 이용해서 링크를 관리하는 점이 ArrayList와 다르다.
삽입/삭제가 빈번하다면 ArrayList보다 훨씬 더 좋은 성능을 보장한다.
4) Set 컬렉션
1 컬렉션 프레임 워크
개요 집합순서와 무관하며 중복을 허용하지 않는다.
기능 메소드 설명
객체추가 boolean add(E e) 주어진 객체를 저장. 저장의 성패를 반환
객체검색
boolean contains(Object o) 주어진 객체가 저장 되었는지 여부
Iterator<E> iterator() 저장된 객체를 한번씩 가져오는 반복자 리턴
boolean isEmpty() 커렉션이 비어있는지 조사
int size() 저장되어 있는 전체 객체 수를 리턴
객체삭제
void clear() 저장된 모든 객체를 삭제
boolean remove(Object o) 주어진 객체를 삭제
Iterator 인터페이스 메소드
boolean hasNext() - 가져올 객체가 있는지 여부 반환
E next() - 컬렉션에서 하나의 객체를 반환
void remove() - Set컬렉션에서 객체 제거
HashSet
객체를 무순서로 저장하고, 중복저장하지 않음. hashCode()메소드로 해시코드를 얻어 낸 후
저장하고, 이미 저장된 동일 해쉬코드가 있다면 equals()메소드로 객체를 비교 후 true인
경우 저장하지 않는다.
5) Map 컬렉션
1 컬렉션 프레임 워크
개요
키와 값으로 구성된 Entry객체를 저장하는 구조를 가짐.
키는 유니크하지만, 값은 중복가능.기존 키로 저장하면 그 키에 해당하는 값을 갱신.
기능 메소드 설명
객체추가 V put(K Key, V value) 주어진 키와 값을 추가, 저장되면 값을 반환
객체검색
boolean containsKey(Object key) 주어진 키가 있는지 여부
boolean containsValue(Object value) 주어진 값이 있는지 여부
Set<Map.Entry<K,V>> entrySet()
키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아 반
환
V Get(Object key) 주어진 키의 값을 반환
boolean isEmpty() 컬렉션이 비었는지 여부
Set<K> keySet() 모든 키를 Set 객체에 담아 반환
int size() 저장된 키의 총 수를 반환
Collection<V> values() 저장된 모든 값을 Collection에 담아 반환
객체삭제
void clear() 모든 Map.Entry를 삭제
V remove(Object key) 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 반환
HashMap key타입은 주로 String을 사용.
HashTable HashMap과달리 Thread-safe
Properties
HashTable의 하위클래스, Entry구성요소를 String으로만 저장가능. 애플리케이션 옵션정보/DB연결정보/다
국어정보가 저장된 Properties파일을 읽을때 주로 사용.
6) 검색기능강화 컬렉션(1)
1 컬렉션 프레임 워크
개요
TreeSet과 TreeMap을 제공. 이진트리는 그루핑과 정렬이 잘 되어있으며,
각각 Set과 Map컬렉션이며, 계층적 구조를 갖음.
TreeSet의 메소드
리턴타입
메소드 설명
E first() 제일 낮은 객체 반환
E last 제일 높은 객체 반환
E lower(E e) 객체 바로 아래를 반환
E higher(E e) 객체 바로 위를 반환
E floor(E e) 동등한 객체가 있으면 반환, 없으면 바로 아래객체 반환
E ceiling(E e) 동등한 객체가 있으면 반환, 없으면 바로 위 객체 반환
E pollFirst() 제일 낮은 객체를 꺼내고 컬렉션에서 제거
E pollLast() 제일 높은 객체를 꺼내고 컬렉션에서 제거
Iterator<E> descendingIterator() 내림차순 정렬된 Iterator 반환
NavigableSet<E> descendingSet() 내림차순 정렬된 Set 반환
NavigableSet<E> headSet(E toElement, boolean inclusive)
주어진 객체보다 낮은 객체들을 NavigableSet으로 반환,
주어진 객체 여부 포함은 두번째 파라미터로 제어
NavigableSet<E> tailSet(E fromElement, boolean inclusive)
주어진 객체보다 높은 객체들을 NavigableSet으로 반환,
주어진 객체 여부 포함은 두번째 파라미터로 제어
NavigableSet<E>
subSet(E fromElement,
boolean fromInclusive, E toElement,
boolean toInclusive)
시작과 끝으로 주어진 객체 사이의 객체들을
NavigableSet으로 반환.
경계 포함 여부는 boolean 값으로 제어
7) 검색기능강화 컬렉션(2)
1 컬렉션 프레임 워크
TreeSet의 메소드
리턴타입
메소드 설명
Map.Entry(K,V) firstEntry() 제일 낮은 Map.Entry를 반환
Map.Entry(K,V) lastEntry() 제일 높은 Map.Entry를 반환
Map.Entry(K,V) lowerEntry(K key) 바로 아래 Map.Entry반환
Map.Entry(K,V) higherEntry(K key) 바로 위 Map.Entry반환
Map.Entry(K,V) floorEntry(K key)
동등한 Map.Entry가 있으면 반환, 없으면 바로 아래
Map.Entry 반환
Map.Entry(K,V) ceilingEnrty(K key)
동등한 Map.Entry가 있으면 반환, 없으면 바로 위
Map.Entry 반환
Map.Entry(K,V) pollFirstEntry() 제일 낮은 Map.Entry를 꺼내고 컬렉션에서 제거
Map.Entry(K,V) pollLastEntry() 제일 높은 Map.Entry를 꺼내고 컬렉션에서 제거
NaviableSet<K> descendingKeySet() 내림차순 정렬된 NaviableSet을 반환
NavigableMap<K,V> descendingMap() 내림차순 정렬된 NaviableMap을 반환
8) 검색기능강화 컬렉션(3)
1 컬렉션 프레임 워크
NavigableSet<E>
headSet(E toElement, boolean incl
usive)
주어진 Map.Entry보다 낮은 Map.Entry들을
NavigableSet으로 반환,
주어진 Map.Entry 여부 포함은 두번째 파라미터로 제어
NavigableSet<E>
tailSet(E fromElement, boolean in
clusive)
주어진 Map.Entry보다 높은 Map.Entry들을
NavigableSet으로 반환,
주어진 Map.Entry 여부 포함은 두번째 파라미터로 제어
NavigableSet<E>
subSet(E fromElement, boolean fr
omInclusive,
E toElement, boolean toInclus
ive)
시작과 끝으로 주어진 Map.Entry 사이의 Map.Entry들을
NavigableSet으로 반환.
경계 포함 여부는 boolean 값으로 제어
int compareTo<T o>
정렬 전에 비교를 위해 사용. 오버라이딩 해야함.
오버라이딩방식(주어진 객체와 같으면 0,더 작으면 음수 반환,
더 크면 양수 반환)
int compareTo<T o1, T o2>
정렬을 위해 사용. 오버라이딩 해야함.
오버라이딩방식(두 객체가 같으면 0,
o1이 o2보다 앞에 오게 하려면 음수,
o1이 o2보다 뒤에 오게 하려면 양수 반환)
TreeSet의 메소드
리턴타입
메소드 설명
9) LIFO, FIFO 컬렉션
1 컬렉션 프레임 워크
개요 스택과 큐를 위한 자료구조.
Stack의 메소드 반환 타입 메소드 설명
E push(E item) 주어진 객체를 삽입
E peek() 맨위 객체를 반환(삭제하지않음)
E pop() 맨위 객체를 반환(삭제함)
Queue의 메소드 리턴타입 메소드 설명
boolean offer(E e) 객체 삽입
E peek() 하나를 가져옴(제거하지 않음)
E poll() 객체 하나를 가져옴(제거)
10) 동기화된 컬렉션, 병렬처리를 위한 컬렉션
1 컬렉션 프레임 워크
동기화된 컬렉션
개요 Vector와 Hashtable은 동기화된 메소드로 구성되어서 Thread-safe하다.
동기화 메소드의 반환 타입 메소드 설명
List<T> synchronizedList(List<T> list) List를 동기화된 List로 반환
Map<K,V> synchronizedMap(Map<K,V> m) Map을 동기화된 Map으로 반환
Set<T> synchronizedSet(Set<T> s) Set을 동기화된 Set으로 반환
병렬 처리를 위한 컬렉션
개요
전체 요소를 빠르게 처리하려면 병렬 처리가 필요.
이를 위해 java.util.concurrent패키지의 ConcurrentHashMap와 ConcurrentLinkedQueue 클래
스를 제공.
각각 Map과 Queue의 구현 클래스. ConcurrentHashMap은 thread-safe하면서, 멀티스레드요소
를 병렬처리.
Part2. Stream
2 Stream
1) Stream(1)
개요
자바8부터 추가된 컬렉션(배열포함)의 저장요소를 하나씩 참조해서 람다식으로 처리할 수 있도록
해주는 반복자.
반복자 스트림
List<String> 컬렉션을 순차적 처리하려면 아래와 같이 작성
List<String< list = arrays.asList("B","D","K");
Stream<String< stream = list.stream();
stream.forEach(name->System.out.println(name) );
스트림 특징
Iterator과 유사한 반복자이만, [람다식 요소처리 제공/내부반복자 사용으로 쉬운 병렬처리/중간처리
와 최종처리 작업 수행]의 차이.
람다식 요소 처리 제공
Stream의 요소처리 메소드는 대부분 함수적 매개타입을 가지기 때문에 람다식/메소드 참조를 이용해
서 요소처리 내용을
매개값으로 전달 할 수 있음
내부반복자사용으로
쉬운 병렬처리
외부반복자(개발자가 직접 코드로 컬렉션의 요소를 반복해서 가져옴)와 달리 내부반복자(컬렉션 내부
에서 요소들을 반복시키고
개발자는 요소당 처리할 코드만 작성)는 개발자가 요소처리코드에 집중할 수 있고, 멀티코어CPU를 최
대한 활용해서 요소들을
분배시켜 병렬 작업을 할 수 있어서 효율적으로 요소를 반복시킬 수 있음.
중간처리/최종처리 가능 중간처리시 매핑/필터링/정렬을 수행하고, 최종처리시 반복/카운팅/평균/총합 등 집계처리 수행
스트림 종류
java.util.stream패키지 내 BaseStream인터페이스를 상속한
Stream/IntStream/LongStream/LongStream 인터페이스.
Stream은 객체 요소 처리 스트림, 나머지 스트림들을 각각 기본타입 int/long/double요소 처리
스트림. 다음과 같이 소스로부터 스트림 구현 객체 획득 가능.
2 Stream
2) Stream(2)
반환 타입 메소드 소스
Stream<T>
java.util.Collection.stream()
java.util.Collection.parallelStream()
컬렉션
Stream<T> Array.stream(T[]), Stream.of(T[])
배열
IntStream Array.stream(int[]), Stream.of(int[])
LongStream Array.stream(long[]), Stream.of(long[])
DoubleStream Array.stream(double[]), Stream.of(double[])
IntStream
IntStream.range(int,int)
IntStream.rangeClose(int,int)
int범위
LongStream
LongStream.range(long,long)
LongStream.rangeClose(long,long)
long 범위
Stream<Path>
Files.find(Path, int, BiPredicate, FileVisitOption)
Files.list(Path)
디렉토리
Stream<String>
Files.lines(Path, Charset)
BufferedReader.lines()
파일
DoubleStream Random.doubles(…)
랜덤수IntStream Random.ints()
LongStream Random.longs()
2 Stream
3) Stream Pipe Line(1)
개요
대량의 데이터를 가공해서 축소하는것을 Reduction이라고 하는데, 데이터의 합계/카운팅/최대값/최
소값 등이 리덕션의 예이다.
컬렉션요소를 리덕션의 결과물로 집계하기위해 중간처리와 최종처리가 필요하다.
파이프라인
스트림은 파이프라인을 통해 최종처리를 해결한다. 파이프라인은 최종처리를 제외하고 모두 중간처리
스트림이다.
중간 스트림이 생성될때부터 최종처리가 시작되기 전 까지는 중간처리는 지연(lazy)된다. 최종처리가
시작되면 중간 스트림에서 하나씩 컬렉션 요소가 처리되고 최종처리까지 오게된다.
Stream 인터페이스에는 필터링/매킹/정렬 등 중간처리 메소드가 많이있는데, 이 메소드들은 중간처리
된 스트림을 반환한다.
그리고 스트림에서 다시 중간처리 메소드를 호출해서 파이프라인을 형성한다.
double ageAvg = list.stream()//오리지널 스트림
.filter(m->m.getGender()==Member.MALE)//중간처리스트림
.mapToInt(Member::getAge)
.average()//최종처리
.getAsDouble();
2 Stream
4) Stream Pipe Line(2)
중간처리메소드 종류 반환타입 메소드 소속된 인터페이스
필터링
Stream
IntStream
LongStream
DoubleStream
distinct() 공통
filter(…) 공통
매핑
flatMap(…) 공통
flatMapToDouble(…) Stream
flatMapToInt(…) Stream
flatMapToLong(…) Stream
map(…) 공통
mapToDouble(…)
Stream.IntStream,LongStre
am
mapToInt(…)
Stream,LongStream,Doubl
eStream
mapToLong(…)
Stream,IntStream,DoubleSt
ream
mapToObj(…)
IntStream,LongStream,Dou
bleStream
asDoubleStream() IntStream,LongStream
asLongStream() IntStream
boxed()
IntStream,LongStream,Dou
bleStream
정렬 sorted(…) 공통
루핑 peek(…) 공통
2 Stream
5) Stream Pipe Line(3)
최종처리메소드 종류 반환타입 메소드 소속된 인터페이스
매칭
boolean allMatch(…) 공통
booldean anyMatch(…) 공통
boolean noneMatch(…) 공통
집계
long count() 공통
OptionalXXX findFirst() 공통
OptionalXXX max(…) 공통
OptionalXXX min(…) 공통
OptionalDouble average()
IntStream,LongStream, D
oubleStream
OptionalXXX reduce(…) 공통
int, long, double sum()
IntStream,LongStream, D
oubleStream
루핑 void forEach(…) 공통
수집 R collect(…) 공통
개요 Parallel Operation은 멀티코어 CPU환경에서 하나의 작업을 분할해서 각각 코어가 병렬처리하는 것
동시성과 병렬성 멀티스레들은 동시성 또는 병렬성으로 실행됨. 병렬성은 데이터병렬성/작업병렬성으로 구분
데이터병렬성
데이터를 쪼개어 서브데이터로 만들고 각 데이터를 병렬 처리. 자바8의 병렬스트림은 데이터병렬성을
구현.
CPU수 만큼의 서브요소로 나누어 CPU수만큼의 스레드가 각각 서브요소들을 병렬 처리함.
작업병렬성 서로다른 작업을 병렬 처리. 예시 : 웹서버처럼 각 브라우저 요청 내용을 개별 스레드에서 병렬처리.
포크조인 프레임워크
병렬스트림은 요소들을 병렬로 처리하기 위해 포크조인 프레임워크를 사용.
병렬 스트림을 이용하면 런타임시에 포크조인 프레임워크가 동작, 포크단계에서 전체 데이터를 서브데
이터로 분리하고
서브데이터를 멀티코어에서 병렬처리한 후에 조인단계에서 서브결과를 결합해서 최종결과를 만들어냄.
포크조인 프레임워크는 포크와 조인긴으이외에 스레드풀 ForkJoinPool을 제공. 작업스레드는
ExecutorService의 구현객체인 ForkJoinPool을 사용.
병렬 스트림 생성
병렬처리를 위해 병렬스트림을 이용할때, 병렬스트림을 다음 두가지 메소드로 얻을 수 있다.
parallelStream()메소드는 컬렉션으로부터 병렬스트림을 바로 반환하고,
parallel()메소드는 순차처리 스트림을 병렬 처리 스트림으로 변환해서 반환한다.
인터페이스 반환 타입 메소드
java.util.Collection Stream parallelStream()
java.util.Stream.Stream
java.util.Stream.IntStre
am
java.util.Stream.LongSt
ream
java.util.Stream.Double
Stream
Stream
IntStream
LongStream
DoubleStream
parallel()
2 Stream
6) 병렬처리
2 Stream
7) 병렬처리 성능
개요
병렬처리가 순차처리보다 항상 실행성능이 좋지 않다.
요소의 수와 요소당 처리시간/스트림소스의종류/Core의 수를 고려해야 한다.
요소의 수와 요소당 처리시
간
컬렉션에 요소의 수가 적고 요소당 처리시간이 짧으면 순차처리가 더 빠를 수 있다.
병렬처리는 스레드풀생성,스레드생성이라는 추가비용이 발생하기 때문이다.
스트림소스의종류
ArrayList, 배열의 경우는 인덱스로 요소를 관리하기 때문에 분리가 쉬워 병렬처리시간이 절약되며,
HashSet, TreeSet는 요소분리가 어려우며, LinkedList는 링크를 따라가야하므로 요소분리가 어렵다.
때문에 이 소스들은 ArrayList, 배열보다 병렬처리가 늦다.
Core의 수 싱글코어는 순차처리가 빠르다. 코어의 수가 많을수록 병렬 처리속도가 빠르다.
Part3. RegExpression
3 Regular Expression
1) 정규표현식 규칙(1)
^ 형식의 시작
$ 형식의 끝
s 공백 /,.?! 등 기호는 앞에 |를 붙여 줌
d 숫자 [0-9]와 동일
D 숫자가 아닌 문자
w 알파벳, 숫자, _(밑줄)
 알파벳이나 숫자를 제외한 문자
[0-9] 숫자 1개
[a-z] 문자 1개
[A-Z] 문자 1개
[A-Za-z] 파벳 대소문자 1개
[^~~~] ~~ 을 제외한 것
. 든 범위의 한 문자
* 의 문자가 0개 이상
+ 의 문자가 1개 이상 반복
3 Regular Expression
2) 정규표현식 규칙(2)
? 문자가 없거나 하나있음을 나타냄
{숫자} 의 문자가 숫자만큼 반복
{} 행문자가 나타나는 횟수 또는 범위를 나타냄
a{3} a 가 3번 반복된 경우
a{3,} a 가 3번 이상 반복인 경우
a{3,5} a 가 3번 이상 5번 이하 반복된 경우
| 또는 의 의미 (괄호를 이용해 여러개 가능 => ex (1| 2| 3))
[형식] 안에 있는 형식
[] 문자 클래스를 지정할 때 사용함,
문자의 집합이나 범위는 "-" 기호로 범위를 나타냄
[]내에서 ^가 선행하여 나타나면 not 를 나타냄
3 Regular Expression
3) 기본적인 문장 검증 정규표현식
숫자만 ^[0-9]*$
영문자 ^[a-zA-Z]*$
한글만 ^[가-힣]*$
영문자와 숫자만 ^[a-zA-Z0-9]*$
이메일
^[a-zA-Z0-9]+@[a-zA-Z0-9]+$ 또는 ^[_0-9a-zA-Z-]+@[0-9a-zA-Z-]+(.[_0-9a-
zA-Z-]+)*$
휴대폰 ^01(?:0|1[6-9])-(?:d{3}|d{4})-d{4}$
일반전화 ^d{2,3}-d{3,4}-d{4}$
주민등록 d{6}-[1-4]d{6}
IP 주소 ([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})
3 Regular Expression
4) 예시
<0개 이상의 공백>
<소문자>
pattern
"^s*[a-z]$" 은 시작 공백이 0개 이상 소문자 한개 끝
private static void pmatch(String input) {
Pattern pattern = Pattern.compile("^s*[a-z]$");
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) System.out.println("true");
else System.out.println("false");
}
<0개 이상의 공백><소문자>
<1개 이상의 공백>
<대소문자>
<숫자> pattern
"^s*[a-z]s+[A-Za-z][0-9]$" 은 시작 공백이 0개 이상 소문자 1개 공백이 1개 이상 대소
문자 숫자 끝
private static void pmatch(String input) {
Pattern pattern = Pattern.compile("^s*[a-z]s+[A-Za-z][0-9]$");
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) System.out.println("true");
else System.out.println("false");
}
3 Regular Expression
5) 패턴/매쳐 클래스(1)
개요 java.util.regex 패키지에 포함
패턴 클래스
Pattern 객체는 Perl 문법과 비슷한 형태로 정의된 정규표현식을 나타냅니다. 문자열로 정의한 정규표현식은 사용되
기 전에 반드시 Pattern 클래스의 인스턴스로 컴파일되어야 합니다. 컴파일된 패턴은 Matcher 객체를 만드는 데 사용
되며, Matcher 객체는 임의의 입력 문자열이 패턴에 부합되는 지 여부를 판가름하는 기능을 담당하합니다. 또한
Pattern 객체들은 비상태유지 객체들이기 때문에 여러 개의 Matcher 객체들이 공유할 수 있습니다.
매쳐 클래스
Matcher 객체는 특정한 문자열이 주어진 패턴과 일치하는가를 알아보는데 이용됩니다. Matcher 클래스의 입력값으
로는 CharSequence라는 새로운 인터페이스가 사용되는데 이를 통해 다양한 형태의 입력 데이터로부터 문자 단위의
매칭 기능을 지원 받을 수 있습니다. 기본적으로 제공되는 CharSequence 객체들은 CharBuffer, String,
StringBuffer 클래스가 있습니다.
Matcher 객체는 Pattern 객체의 matcher 메소드를 통해 얻어진다. Matcher 객체가 일단 만들어지면 주로 세 가지
목적으로 사용됩다.
주어진 문자열 전체가 특정 패턴과 일치하는 가를 판단(matches).
주어진 문자열이 특정 패턴으로 시작하는가를 판단(lookingAt).
주어진 문자열에서 특정 패턴을 찾아낸다(find).
이들 메소드는 성공 시 true를 실패 시 false 를 반환합니다.
또한 특정 문자열을 찾아 새로운 문자열로 교체하는 기능도 제공됩니다. appendRepalcement 메소드는 일치하는 패
턴이 나타날 때까지의 모든 문자들을 버퍼로 옮기고 찾아진 문자열 대신 교체 문자열로 채워 넣습니다. 또한
appendTail 메소드는 캐릭터 시퀀스의 현재 위치 이후의 문자들을 버퍼에 복사해 넣습니다. 다음 절에 나오는 예제 코
드를 참고하도록 합시다.
CharSequence 인터페이스
CharSequence 인터페이스는 다양한 형태의 캐릭터 시퀀스에 대해 일관적인 접근 방법을 제공하기 위해 새로 생겨났
으며, java.lang 패키지에 존재합니다. 기본적으로 String, StringBuffer, CharBuffer 클래스가 이를 구현하고 있으
므로 적절한 것을 골라 사용하면 되며, 인터페이스가 간단하므로 필요하면 직접 이를 구현해 새로 하나 만들어도 됩니
다.
3 Regular Expression
6) 패턴/매쳐 클래스(2)
예시(금지어 필터링하기)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExTest06 {
public static String filterText(String sText) {
Pattern p = Pattern.compile("fuck|shit|개새끼", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(sText);
StringBuffer sb = new StringBuffer();
while (m.find()) m.appendReplacement(sb, maskWord(m.group()));
m.appendTail(sb);
return sb.toString();
}
public static String maskWord(String word) {
StringBuffer buff = new StringBuffer();
char[] ch = word.toCharArray();
for (int i = 0; i < ch.length; i++) {
if (i < 1) buff.append(ch[i]);
else buff.append("*");
}
return buff.toString();}
public static void main(String[] args) {
String sText = "Shit! Read the fucking manual. 개새끼야.";
System.out.println(filterText(sText)); }}
예시 출력결과 S***! Read the f***ing manual. 개**야.
Part4. OPenSW License
4 Open S/W License
1) 공개소프트웨어 라이선스(1)
GPL 전문(한국어 번역본) http://korea.gnu.org/documents/copyleft/gpl.ko.html
GPL FAQ(한국어 번역본) http://www.gnu.org/licenses/gpl-faq.ko.htm
LGPL 전문(한국어 번역본) http://korea.gnu.org/people/chsong/copyleft/lgpl.ko.html
KLDP 오픈소스 SW 라이센
스 가이드
http://wiki.kldp.org/wiki.php/OpenSourceLicenseGuide
라이센스구분 제약사항 제한범위
GNU GPL(General Public
License)
기본적으로 어떤 프로그램을 개발할 때, GPL 코드를 일부
라도 사용하게 되면 그 프로그램은 GPL이 된다. GPL을
가진 프로그램을 유료로 판매하는 것은 가능하지만, 반드
시 전체 소스코드는 무료로 공개해야 한다.
GPL 코드를 사용한 SW를 내부적인(개인, 기관, 단체 등)
목적으로만 사용할 때에는 소스코드를 공개할 필요가 없
지만 어떤 형태로든(유료든 무료든) 외부에 공표/배포할
때에는 전체 소스코드를 공개해야 한다.
GPL과 관련되지 아니한 부분만 독립적으로 팔거나 배포
하는 경우는 관계가 없다. 하지만 GPL 코드를 일부라도
사용한 프로그램 전체를 배포할 때에는 GPL을 적용(즉,
프로그램의 전체 소스코드 공개)해야 한다
만일 배포하고자 하는 프로그램의 특정 부
분이 GPL 코드로부터 파생된 것이 아닌 독
립적인 저작물일 경우에는 독립 저작물 모
듈의 개별적인 배포에는 GPL이 적용되지
아니한다 (즉, 코드를 공개할 필요가 없다).
하지만 프로그램을 전체(GPL코드에서 파
생된 모듈 + 독립 저작물 모듈)적으로 배포
할 때에는 GLP을 따라야 한다
4 Open S/W License
2) 공개소프트웨어 라이선스(2)
GNU LGPL
(Lesser General Public Li
cense)
LGPL은 GPL보다는 훨씬 완화된
(lesser) 조건의 공개 소프트웨어 라이
선스.
LGPL 코드를 사용했음을 명시만 하면
된다.
LGPL 코드를 단순히 이용하는 것이 아
니라 이를 수정한 또는 이로부터 파생된
라이브러리를 개발하여 배포하는 경우
에는 전체 코드를 공개해야 한다.
LGPL 코드를 정적(static) 또는 동적(dynamic) 라이브러리
로 사용한 프로그램을 개발하여 판매/배포할 경우에 프로그램
의 소스코드를 공개하지 않아도 된다
BSD
(Berkeley Software Distri
bution)
제한이 없는 라이선스(OpenCV도 여
기에 속함.)
소스코드 공개의 의무가 없으며 상용(상업적) 소프트웨어에서
도 무제한 사용 가능한 라이선스
Final-Part5. I/O Package
5 I/O Package
1) IO패키지(1)
개요 자바에서는 스트림을 통해 파일/네트워크 입출력을 처리한다.
입력스트림과 출력스트림
프로그램이 데이터를 입력받을 때에는 입력스트림(InputStream)이라 부르고,
프로그램이 데이터를 보낼 때에는 출력 스트림(OutputStream)이라 부른다.
입력스트림 시작은 키보드/파일/네트워크이며
출력 스트림 목적지는 모니터/파일/네트워크이다.
java.io 패키지 클래스 설명
File 파일 시스템의 파일 정보를 얻기 위한 클래스
Console 콘솔로부터 문자를 입출력하기 위한 클래스
InputStream/OutputStream 바이트 단위입출력을 위한 최상위 입출력 스트림 클래스
5 I/O Package
2) IO패키지(2)
java.io 패키지 클래스 설명
FileInputStream/FileOutputStream
DataInputStream/DataOutputStream
ObjectStream/ObjectOutputStream
PrintStream
BufferedInputStream/BufferedOutputStrea
m
바이트 단위입출력을 위한 하위 입출력 스트림 클래스
Reader/Writer 문자 단위 입출력을 위한 최상위 입출력 스트림 클래스
5 I/O Package
3) IO패키지(3)
스트림 클래스 종류
스트림 클래스는 바이트기반, 문자 기반 스트림으로 나뉜다.
바이트 기반 스트림은 그림/멀티미디어/문자 등 모든 종류의 데이터를 보낼 수 있다.
문자 기반 스트림은 문자만 보낼 수 있도록 특화 되어 있다.
구분
바이트기반 스트림 문자기반 스트림
입력스트림 출력스트림 입력스트림 출력스트림
최상위클래스 InputStream OutputStream Reader Writer
하위클래스
(예시)
XXXInputStream
(FileInputStream)
XXXOutputStream
(FileOutputStream)
XXXReader
(FileReader)
XXXWriter
(FileWriter)
5 I/O Package
4) InputStream(1)
개요
바이트 기반 입력 스트림의 최상위 추상 클래스.
FileInputStream/BufferedInputStream/DataInputStream 의 부모 클래스.
바이트 기반 입력스트림의 메소드를 지님.
리턴 타입 메소드 설명
int read() 입력 스트림으로부터 1 바이트를 읽고 읽은 바이트를 반환
int read(byte[] b)
입력 스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열b에 저장
하고 읽은 바이트수 반환
int
read(byte[] b, int off,
int len)
입력 스트림으로부터 len개의 바이트를 읽고 byte배열 b[off]부터 len개까지
저장.
실제 읽은 바이트 수 len개를 반환.
len개를 다 읽지못하면 읽은 바이트 수를 반환.
void close() 사용한 시스템 자원을 반납하고 입력 스트림을 닫음.
5 I/O Package
5) InputStream(2)
read()메소드
입력스트림으로부터 1바이트를 읽고 4바이트 int타입으로 반환
더 이상 입력 스트림으로부터 읽을 수 없다면 -1을 반환.
read(byte[] b)메소드
배열 길이 만큼 읽고 배열에 저장한 후, 읽은 바이트 수를 반환.
더 이상 읽을 수 없을때 -1을 반환
read(byte[] b, int off, int len)
메소드
off를 0으로 len을 배열의 길이로 준다면 read(byte[] b)와 같다.
close()메소드 사용한 시스템 자원을 반납하고 입력스트림을 종료.
5 I/O Package
6) OutputStream
개요
바이트 기반 출력 스트림의 최상위 추상 클래스.
FileOutputStream/PrintStream/BufferedOutputStream/DataOutputStream 의 부모 클래스.
바이트 기반 출력 스트림의 메소드를 지님.
리턴 타입 메소드 설명
void write(int b) 출력 스트림으로부터 1 바이트를 읽고 읽은 바이트를 반환
void write(byte[] b)
출력 스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열b에 저장
하고 읽은 바이트수 반환
void
write(byte[] b, int off
, int len)
출력스트림으로 주어진 바이트배열 b[off]부터 len개의 바이트를 보냄
void flush() 버퍼에 있는 내용을 출력해서 비움
void close() 사용한 시스템 자원을 반납하고 출력 스트림을 닫음.
write(int b) 메소드 매개변수로 주어진 int값에서 끝에있는 1바이트만 출력 스트림으로 보낸다.
5 I/O Package
7) Reader
개요
문자 기반 입력 스트림의 최상위 추상 클래스.
FileReader/BufferedReader/InputStreamReader 의 부모 클래스.
문자 기반 입력 스트림의 메소드를 지님.
반환형 메소드 설명
int read() 입력 스트림으로부터 한 개의 문자를 읽고 반환
int read(char[] cbuf)
입력 스트림으로부터 한 개의 문자를 읽고 cbuf배열에 저장하고 실제로 읽은 문
자수 반환
int
read(char[] cbuf, int
off, int len)
입력스트림으로부터 len개의 문자를 읽고 cbuf[off]에서부터 len개까지 저장
한후 실제로 읽은 문자수 반환
void close() 입력 스트림을 닫고 시스템 자원 반납
read()메소드
한개의문자(2바이트)를 읽고 4byte int타입으로 반환. 이 반환값을 char형태로 캐스팅하면 읽은 문자
를 얻을 수 있음.
더 이상 읽을 수 없으면 -1을 반환
read()메소드
한개의문자(2바이트)를 읽고 4byte int타입으로 반환. 이 반환값을 char형태로 캐스팅하면 읽은 문자
를 얻을 수 있음.
더 이상 읽을 수 없으면 -1을 반환
5 I/O Package
8) Writer
개요
문자 기반 출력 스트림의 최상위 추상 클래스.
FileWriter/BufferedWriter/PrintWriter/OutputStreamWriter 의 부모 클래스.
문자 기반 출력 스트림의 메소드를 지님.
반환형 메소드 설명
void write(int c) 출력 스트림으로 주어진 한 문자를 보냄(c의 끝 2바이트)
void write(char[] cbuf) 출력 스트림으로 주어진 문자 배열 cbuf의 모든 문자를 출력
void
write(char[] cbuf, int
off, int len)
cbuf[off]부터 len개의 문자를 출력
void write(String str) str을 모두 출력
void
write(String str, int o
ff, int len)
str의 off인덱스부터 len개의 문자를 출력
void flush() 버퍼에 남은 모든 문자를 출력하고 버퍼를 비움
void close() 출력 스트림을 닫고 시스템자원을 반납
5 I/O Package
9) 콘솔 입/출력(1)
개요
콘솔로 입력받을때 System.in을 사용하고, 콘솔에 데이터를 출력할때 System.out을 사용한다. 에러출
력은 System.err를 사용한다.
System.in필드
InputStream의 read() 메소드로 한바이트를 읽으면 키보드로 입력된 키를 확인할 수 있음.
리턴된 int값에는 12진수 아스키코드가 들어있음.
InputStream. is=System.in;
int ascCode=is.read();
char InputChar=(char)is.read();//문자를 얻을수 있으록 캐스팅
System.out필드
out은 PrintStream타입의 필드.
out필드를 OutputTream타입으로 변환해서 사용가능.
콘솔로 1개 바이트를 출력할때는 OutputSteam의 write(int b)메소드 사용.
바이트 값은 아스키코드이며, write()메소드는 아스키 코드를 문자로 콘솔에 출력.
OutputStream os = System.out;
byte b= 97;
os.write(b);
os.flush();
Consol 클래스
java.io.Console 클래스로 콘솔에서 입력받은 문자열을 읽을 수 있음.
Console console=System.console();
System.console() 메소드는 null을 반환하기 때문에 명령 프롬프트에서 실행해야함.
5 I/O Package
10) 콘솔 입/출력(2)
Consol클래스 메소드 반환형 메소드 설명
String readLine() 엔터를 입력하기 전까지 모든 문자열을 읽음
char[] readPassword() 키보드 입력문자를 콘솔에 보여주지 않고 읽음
Scanner 클래스
콘솔클래스는 문자열만 읽을 수 있음. Scanner클래스를 이용하면 기본타입의 값을 읽을 수 있음.
Scanner sc=new Scanner(System.in);
Scanner클래스 메소드 반환형 메소드 설명(읽어들이는 변수형)
boolean nextBoolean() boolean
byte nextByte() 바이트
short nextShort() 쇼트
int nextInt() 인트
long nextLong() 롱
float nextFloat() 플로트
double nextDouble() 더블
String nextLine() 스트링
5 I/O Package
11) File 클래스(1)
개요
java.io패키지에서 제공하는 File클래스는 파일크기/속성/이름 등 정보를 얻고, 파일 생성/삭제 기능을
제공.
파일 데이터를 읽고 쓰는 기능은 없기때문에 파일 입출력은 스트림을 사용.
File file=new file("c:txt.txt");
boolean isExist=file.exists();
메소드반환형 메소드 설명
boolean createNewFile() 파일 생성
boolean mkdir() 새로운 디렉토리 생성(단일하위디렉토리생성)
boolean mkdirs() 경로상에 없는 모든 디렉토리 생성(계층형태의 경로를 생성)
boolean delete() 파일/디렉토리삭제
boolean canExecute() 파일 실행 가능 여부
boolean canRead() 읽기 가능 여부
5 I/O Package
12) File 클래스(2)
boolean canWrite() 수정/저장 가능여부
String getName() 파일 이름 반환
String getParent() 부모디렉토리 반환
File getParentFile() 부모 디렉토리를 File객체로 생성후 반환
String getPath() 전체 경로를 반환
boolean isDirectory() 디렉토리 여부
boolean isFile() 파일 여부
boolean isHidden() 숨김파일 여부
long lastModified() 최종 수정일+시간 반환
long length() 파일 크기 반환
String[] list() 디렉토리 내 파일 및 서브디렉토리 목록을 String[]형태로 반환
String[] list(FilenameFilter filer) 필터에 매칭되는것만 String[]형태로 반환
File[] listFiles() 디렉토리 내 파일 및 서브디렉토리 목록을 File배열로 반환
File[] listFiles(FilenameFile filter)
디렉토리 내 파일 및 서브디렉토리 목록중 필터에 매칭되는 것만
File배열로 반환
메소드반환형 메소드 설명
5 I/O Package
13) File 클래스(3)
성능향상 보조 스트림
프로그램 성능은 입출력에 달려있다. HDD의 경우 메모리 버퍼와 작업해서 쓰기속도를 향상 시킨다.
이와 같이 버퍼를 제공하여 프로그램 성능을 향상시키는 스트림이 있다.
바이트 기반 스트림- BufferedInputStream, BufferedOutputStream
문자 기반 스트림-BufferedReader, BufferedWrite
외부입력을 직접 읽지 않고, 버퍼로부터 읽어서 읽기 성능을 향상 시킨다.
기본 타입 입출력
보조 스트림
바이트 스트림은 바이트 단위의 입출력이기에 기본데이터타입의 단위로 입출력이 불가하다.
DataInputStream과 DataOutputStream보조 스트림을 연결하면 기본데이터 타입으로 입출력이
가능하다.
DataInputStream dis=new DataInputStream(바이트 입력 스트림);
DataOutputStream dos=new DataOutputStream(바이트 출력 스트림);
아래 메소드로 입출력할때에는 입출력 순서가 같아야한다
(ex) int-double-char로 입력하면 int-double-char순으로 출력해야한다.
5 I/O Package
14) File 클래스(4)
DataInputStream DataOutputStream
boolean readBoolean() void writeBoolean(boolean v)
byte readByte() void writeByte(int v)
char readChar() void writeChar(int v)
double readDouble() void writeDouble(double v)
float readFloat() void writeFloat(float v)
int readInt() void writeInt(int v)
long readLong() void writeLong(long v)
short readShort() void writeShort(short v)
String readUTF() void writeUTF(String str)
프린터 보조 스트림
PrintStream과 PrintWriter는 print(), println()을 가지고 있는 보조 스트림.
각각 바이트 입력 스트림, 문자 출력 스트림과 연결된다.
PrintStream ps=new PrintStream(바이트출력스트림);
PrintWriter pw=new PrintWriter(바이트 출력 스트림);
5 I/O Package
15) File 클래스(5)
객체 입출력 보조 스트림
객체에 생성된 객체를 파일/네트워크로 출력할 수 있다.
바이트 기반 스트림으로 출력한다.
객체 직렬화를 해야 출력이 가능하며, 직렬화믄 데이터(필드값)을 일렬로 늘어선 연속적 바이트형태이다.
받는 쪽에서는 이를 복원하며, 이를 역직렬화 라고 한다.
ObjectInputStream, ObjectOutputStream으로 객체를 입출력할 수 있으며,
ObjectOutputStream은 바이트 출력 스트림과 연결되어
직렬화를, ObjectOutputStream은 바이트 입력 스트림과 연결되어 객체로 역직렬화를 수행한다.
ObjectInputStream ios = new ObjectInputStream(바이트입력스트림);
ObjectOutputStream oos = new ObjectOutputStream(바이트입력스트림);
직렬화가능한 클래스
(Serializable)
Serializable 인터페이스를 구현한 클래스만 직렬화 할 수 있고, 이 인터페이스는 필드나 메소드가 없지
만 객체를 직렬화 할때 private 필드를 포함한 모든 필드를 변환해도 좋다는 표시 역할을 수행한다.
public class XXX implements Serializable()
writeObject()/
readObject()메소드
두 클래스가 상속관계일때, 부모클래스가 Serializable인터페이스를 구현하고 있으면 자식클래스는
Serializable인터페이스를 구현하지 않아도 자식 객체를 직렬화 하면 부모필드&자식 모두 직렬화 된다.
반대로 자식만 Serializeable인터페이스를 구현한 경우에는 부모의 필드는 직렬화에서 제외된다.
이경우 부모클래스 필드를 직렬화 하고 싶다면
부모클래스도 인터페이스를 구현하거나, 자식클래스에서 writeObject()와 readObject()메소드를 선
언해서 부모객체의 필드에서 직접출력하는 방법을 선택해야 한다.
이때, 접근제한자가 priavte가 아니면 자동호출되지 않는다.
defaultWriteObject()와 defaultReadObject()는 자식클래스에 정의된 필드들을 모두 직렬화 하고
역직렬화 한다.
5 I/O Package
16) 네트워크(1)
서버/클라이언트
서비스제공프로그램을 서버, 서비스를 받는 프로그램을 클라이언트라고 하며,
서버는 클라이언트가 요청하는 내용을 처리하고 응답을 클라이언트로 보낸다.
포트별 구분명 범위 설명
웰노운포트 0~1023 국제 인터넷주소관리기구가 특정 애플리케이션용으로 미리 예약한 포트
등록된 포트 1024~49151 회사에서 등록해서 사용할 수 있는 포트
동적/사적 포트 49152~65535 운영체제가 부여하는 동적 또는 개인적 목적으로 사용할 수 있는 포트
InetAdress로 IP얻기
java.net.InetAddress 객체로 IP주소를 표현.
InetAddress ia=InetAddress.getLocalHost();
도메인 네임 획득
InetAddress ia=InetAddress.getByName(String host);
InetAddress[] iaArr = InetAddress.getAllByName(String host);
문자열로 된 IP주소 획득
String ip=InetAddress.getHostAddress();
5 I/O Package
17) 네트워크(2)
TCP 네트워킹
TCP는 정확하고 안정적으로 전달(연결지향적 프로토콜).
연결수립-데이터통신-연결종료 로 진행하며,
네트워크 길이가 짧지 않을 경우, UDP보다 느릴 수 있다.
java.net.ServerSocket과 java.netSocket클래스로 TCP네트워킹 사용할 수 있다.
ServerSocket과
Socket용도
클라이언트의 요청을 기다리면서 연결수락을 담당하는것이 java.net.ServerSocket클래스,
연결된 클라이언트와 통신을 담당하는 것이 java.net.Socket클래스.
클라이언트가 연결요청을 해오면 ServerSocket을 수락하고, 통신용 Socket을 만든다.
ServerSocket생성/
연결수락
ServerSocket serverSocket = new ServerSocket(5001);//5001번 포트에 바인딩
처럼 서버를 개발하려면 ServerSocket객체를 얻어야 한다. 또는
ServerSocket serverSocket new ServerSocket();
serverSocket.bind(net InetSocketAddress(5001));
처럼 디폴트 생성자로 객체 생성 후, 포트 바인딩을 위해 bind()메소드를 호출한다.
사용중인 포트라면 Bind익셉션이 발생하고,
바인딩이 끝나고 연결 수락을 하려면 accept()메소드를 호출한다.
accept()메소드는 클라이언트가 연결 요청 전까지는 블로킹(스레드 대기상태)된다.
때문에 UI생성이나 이벤트 처리하는 스레드에서 이 메소드를 호출하면 안된다.
클라이언트가 연결요청을하면 accept()는 클라이언트와 통신할 소켓을 만들고 반환한다(연결수립)
블로킹되어있을때 close()메소드를 호출하면 소켓익셉션이 발생한다.
5 I/O Package
18) 네트워크(3)
InetSocketAddress
메소드 반환형
메소드명 설명
String getHostName() 클라이언트IP반환
int getPort() 클라이언트 포트번호 반환
String toString() "IP:포트번호"형태 문자열 반환
close() 소켓 클로즈 메소드롤 호출해서 언바인딩 시켜야 다른 프로그램에서 해당 포트를 사용 할 수 있다.
소켓 생성과 연결요청
클라이언트가 서버연결 요청을 하려면 java.net.Socket을 이용.
아래와 같이 서버아이피와 포트를 바인딩한다.
Socket socket=new Socket("localhost", 5001);//방법1
Socket socket new Socket(new InetSocketAddress("localhost",5001) );//방법2
socket=new Socket();//생성따로
socket.connect( new InetSocketAddress("localhost", 5001) );//연결요청따로
socket.close();//연결 강제 종료
5 I/O Package
19) 네트워크(4)
소켓 데이터 통신
connetc()->accept()가 수립되면, InputStream과 OutputStream을 얻을 수 있다.
InputStream is=socket.getInputStrea();
OutputStream os=socket.getOutputStrea();
전송
String data="스트링";
byte[] byteArr=data.getBytes("UTF-8");
os.write(byteArr);
os.flush();
수신
byte[] byteArr=new byte[100];
int readByteCount=is.read(byteArr);
String data = new String(byteArr, 0, readByteCount, "UTF-8");
스레드 병렬 처리
서버에서 accept(), connect(), read(), write()는 별도의 작업 스레드를 생성해서 병렬로 처리하면
여러 클라이언트와 작업이 가능하다.
UDP 네트워킹
User Datagram Protocol은 비연결 지향적 프로토콜.
연결절차를 생략하기 때문에 안정성은 TCP보다 떨어지지만 빠른전송이 가능하다.
java.net.DatagramSocket 과 java.net.DatagramPacket클래스를 이용해서 UDP네트워킹이 가능
하다.
5 I/O Package
20) 네트워크(5)
발신자 구현
DatagramSocket sgS=new DatagramSocket(); //객체생성
byte[] byteArr=data.getBytes("UTF-8");//인코딩
DatagramPacket packet=new datagramPacket(byteArr, byteArr.length, new InetSocketAd
dress("localhost", 5001) );//소켓생성
dgS.send(packet);//전송
dgs.close();//소켓종료
수신자 구현
수신자는 데이터그램소켓 객체를 바인딩할 포트와 번호를 지정하고 생성.
DatagramSocket dgS=new DatagramSocket(5001);//소켓생성 후 대기
dgs.receive(dgP);//블로킹 된 후 패킷을 받으면 패킷을 DataGramPacket에 저장
//패킷내용을 저장할 패킷 생성
DatagramPacket dgP = new DatagramPacket(new byte[100], 100);
//receive()메소드로 패킷을읽고, getData()메소드로 저장된 바이트 배열 획득.
//getLength()로 읽은 바이트 수 획득.
//인코딩 문자열을 디코딩해서 문자열 획득.
String data = new String(packet.getData(), 0, packet.getLength(), "UTF-8");
SocketAddress sA = packet.getSocketAddress();//IP와 포트를 획득
dgS.close();//스레드 작업 종료시 close()호출로 블로킹상태에서 스레드 종료.
Java 1~4 가 모두 종료되었습니다. 감사합니다!

More Related Content

What's hot

What's hot (18)

자바 8 학습
자바 8 학습자바 8 학습
자바 8 학습
 
파이썬+Json+이해하기 20160301
파이썬+Json+이해하기 20160301파이썬+Json+이해하기 20160301
파이썬+Json+이해하기 20160301
 
동작 파라미터와 람다 In java 8
동작 파라미터와 람다 In java 8동작 파라미터와 람다 In java 8
동작 파라미터와 람다 In java 8
 
데이터 분석 3 - Java Collection Framework와 ArrayList
데이터 분석 3 - Java Collection Framework와 ArrayList데이터 분석 3 - Java Collection Framework와 ArrayList
데이터 분석 3 - Java Collection Framework와 ArrayList
 
데이터 분석 5 - Java Collection Framework - LinkedList 파헤치기
데이터 분석 5 - Java Collection Framework - LinkedList 파헤치기데이터 분석 5 - Java Collection Framework - LinkedList 파헤치기
데이터 분석 5 - Java Collection Framework - LinkedList 파헤치기
 
파이썬 문자열 이해하기
파이썬 문자열 이해하기파이썬 문자열 이해하기
파이썬 문자열 이해하기
 
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229
 
Jquery javascript_ed10
Jquery javascript_ed10Jquery javascript_ed10
Jquery javascript_ed10
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
 
파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229
 
파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409
 
Java advancd ed10
Java advancd ed10Java advancd ed10
Java advancd ed10
 
자바스크립트의 암묵적인 강제형변환과 타입캐스팅
자바스크립트의 암묵적인 강제형변환과 타입캐스팅자바스크립트의 암묵적인 강제형변환과 타입캐스팅
자바스크립트의 암묵적인 강제형변환과 타입캐스팅
 
파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기
 
데이터 분석 6 - 나만의 배열 기반 LIST, MyLinkedList를 만들어보자
데이터 분석 6 - 나만의 배열 기반 LIST, MyLinkedList를 만들어보자데이터 분석 6 - 나만의 배열 기반 LIST, MyLinkedList를 만들어보자
데이터 분석 6 - 나만의 배열 기반 LIST, MyLinkedList를 만들어보자
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
 
Scala 기초 (4)
Scala 기초 (4)Scala 기초 (4)
Scala 기초 (4)
 

Similar to Java(4/4)

파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304
Yong Joon Moon
 
Data Mining with R CH1 요약
Data Mining with R CH1 요약Data Mining with R CH1 요약
Data Mining with R CH1 요약
Sung Yub Kim
 

Similar to Java(4/4) (20)

Java_08 collection
Java_08 collectionJava_08 collection
Java_08 collection
 
자바로 배우는 자료구조
자바로 배우는 자료구조자바로 배우는 자료구조
자바로 배우는 자료구조
 
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
 
[Commit Again] 1주차 STL study
[Commit Again] 1주차 STL study[Commit Again] 1주차 STL study
[Commit Again] 1주차 STL study
 
개경프 1주차 Stl study
개경프 1주차 Stl study개경프 1주차 Stl study
개경프 1주차 Stl study
 
Apply교육
Apply교육Apply교육
Apply교육
 
파이썬정리 20160130
파이썬정리 20160130파이썬정리 20160130
파이썬정리 20160130
 
파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304
 
[Swift] Data Structure - Heap
[Swift] Data Structure - Heap[Swift] Data Structure - Heap
[Swift] Data Structure - Heap
 
Stl vector, list, map
Stl vector, list, mapStl vector, list, map
Stl vector, list, map
 
Scala
ScalaScala
Scala
 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 
Swift3 generic
Swift3 genericSwift3 generic
Swift3 generic
 
Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1
 
파이썬 크롤링 모듈
파이썬 크롤링 모듈파이썬 크롤링 모듈
파이썬 크롤링 모듈
 
C++ stl
C++ stlC++ stl
C++ stl
 
파이썬 xml 이해하기
파이썬 xml 이해하기파이썬 xml 이해하기
파이썬 xml 이해하기
 
Data Mining with R CH1 요약
Data Mining with R CH1 요약Data Mining with R CH1 요약
Data Mining with R CH1 요약
 
[Swift] Iterator
[Swift] Iterator[Swift] Iterator
[Swift] Iterator
 
강의자료3
강의자료3강의자료3
강의자료3
 

Java(4/4)

  • 3. 1) 개요와 구분 1 컬렉션 프레임 워크 개요 객체들을 추가/검색/삭제 할 수 있도록 java.util패키지에 컬렉션과 관련된 인터페이스와 클래스들을 포함시켜놓은 것을 컬렉션 프레임워크라고 부름. 인터페이스분류(대) 인터페이스분류(소) 특징 구현 클래스 Collection List 순서를 유지하고 저장 중복저장가능 ArrayList, Vector,LinkedList Set 순서를 유지하지 않고 저장 중복 저장 안됨 HashSet, TreeSet Map 키와 값의 쌍으로 저 장 키는 중복 저장이 안 됨 HashMap, HashTable, TreeMap, Properties
  • 4. 2) List 컬렉션(1) 1 컬렉션 프레임 워크 개요 List는 객체를 일렬로 늘어 놓은 구조. 인덱스로 관리. 객체의 번지를 참조하여 저장. 동일 객체를 중복저장하면 같은 번지를 참조. null을 저장할 경우 해당 인덱스는 객체를 참조하지 않음. 기능 메소드 설명 객체추가 boolean add(E e) 주어진 객체를 맨 끝에 추가 void add(int index, E element) 주어진 인덱스에 객체를 추가 void set(int index, E element) 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈 객체검색 boolean contains(Object o) 주어진 객체가 저장되어 있는지 여부 E get(int index) 주어진 인덱스에 저장된 객체를 리턴 boolean isEmpty() 커렉션이 비어있는지 조사 int size() 저장되어 있는 전체 객체 수를 리턴 객체삭제 void clear() 저장된 모든 객체를 삭제 E remove(int index) 주어진 인덱스에 저장된 객체를 삭제 boolean remove(Object o) 주어진 객체를 삭제
  • 5. 3) List 컬렉션(2) 1 컬렉션 프레임 워크 ArrayList ArrayList는 List인터페이스의 구현클래스. 배열은 불변 크기, ArrayList는 가변크기. 특정 인덱스 삭제/삽입시 이후의 인덱스가 쉬프트된다. Vector Vector는 ArrayList와 달리, 동기화된 메소드로 구성되어있어서 멀티스레드가 동시에 메소드를 실행 할 수 없고 하나의 스레드가 실행을 완료해야 다른 스레드를 실해알 수 있다. 때문에 thread-safe하다. LinkedList List의 구현클래스이지만, 인접참조를 이용해서 링크를 관리하는 점이 ArrayList와 다르다. 삽입/삭제가 빈번하다면 ArrayList보다 훨씬 더 좋은 성능을 보장한다.
  • 6. 4) Set 컬렉션 1 컬렉션 프레임 워크 개요 집합순서와 무관하며 중복을 허용하지 않는다. 기능 메소드 설명 객체추가 boolean add(E e) 주어진 객체를 저장. 저장의 성패를 반환 객체검색 boolean contains(Object o) 주어진 객체가 저장 되었는지 여부 Iterator<E> iterator() 저장된 객체를 한번씩 가져오는 반복자 리턴 boolean isEmpty() 커렉션이 비어있는지 조사 int size() 저장되어 있는 전체 객체 수를 리턴 객체삭제 void clear() 저장된 모든 객체를 삭제 boolean remove(Object o) 주어진 객체를 삭제 Iterator 인터페이스 메소드 boolean hasNext() - 가져올 객체가 있는지 여부 반환 E next() - 컬렉션에서 하나의 객체를 반환 void remove() - Set컬렉션에서 객체 제거 HashSet 객체를 무순서로 저장하고, 중복저장하지 않음. hashCode()메소드로 해시코드를 얻어 낸 후 저장하고, 이미 저장된 동일 해쉬코드가 있다면 equals()메소드로 객체를 비교 후 true인 경우 저장하지 않는다.
  • 7. 5) Map 컬렉션 1 컬렉션 프레임 워크 개요 키와 값으로 구성된 Entry객체를 저장하는 구조를 가짐. 키는 유니크하지만, 값은 중복가능.기존 키로 저장하면 그 키에 해당하는 값을 갱신. 기능 메소드 설명 객체추가 V put(K Key, V value) 주어진 키와 값을 추가, 저장되면 값을 반환 객체검색 boolean containsKey(Object key) 주어진 키가 있는지 여부 boolean containsValue(Object value) 주어진 값이 있는지 여부 Set<Map.Entry<K,V>> entrySet() 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아 반 환 V Get(Object key) 주어진 키의 값을 반환 boolean isEmpty() 컬렉션이 비었는지 여부 Set<K> keySet() 모든 키를 Set 객체에 담아 반환 int size() 저장된 키의 총 수를 반환 Collection<V> values() 저장된 모든 값을 Collection에 담아 반환 객체삭제 void clear() 모든 Map.Entry를 삭제 V remove(Object key) 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 반환 HashMap key타입은 주로 String을 사용. HashTable HashMap과달리 Thread-safe Properties HashTable의 하위클래스, Entry구성요소를 String으로만 저장가능. 애플리케이션 옵션정보/DB연결정보/다 국어정보가 저장된 Properties파일을 읽을때 주로 사용.
  • 8. 6) 검색기능강화 컬렉션(1) 1 컬렉션 프레임 워크 개요 TreeSet과 TreeMap을 제공. 이진트리는 그루핑과 정렬이 잘 되어있으며, 각각 Set과 Map컬렉션이며, 계층적 구조를 갖음. TreeSet의 메소드 리턴타입 메소드 설명 E first() 제일 낮은 객체 반환 E last 제일 높은 객체 반환 E lower(E e) 객체 바로 아래를 반환 E higher(E e) 객체 바로 위를 반환 E floor(E e) 동등한 객체가 있으면 반환, 없으면 바로 아래객체 반환 E ceiling(E e) 동등한 객체가 있으면 반환, 없으면 바로 위 객체 반환 E pollFirst() 제일 낮은 객체를 꺼내고 컬렉션에서 제거 E pollLast() 제일 높은 객체를 꺼내고 컬렉션에서 제거 Iterator<E> descendingIterator() 내림차순 정렬된 Iterator 반환 NavigableSet<E> descendingSet() 내림차순 정렬된 Set 반환 NavigableSet<E> headSet(E toElement, boolean inclusive) 주어진 객체보다 낮은 객체들을 NavigableSet으로 반환, 주어진 객체 여부 포함은 두번째 파라미터로 제어 NavigableSet<E> tailSet(E fromElement, boolean inclusive) 주어진 객체보다 높은 객체들을 NavigableSet으로 반환, 주어진 객체 여부 포함은 두번째 파라미터로 제어 NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) 시작과 끝으로 주어진 객체 사이의 객체들을 NavigableSet으로 반환. 경계 포함 여부는 boolean 값으로 제어
  • 9. 7) 검색기능강화 컬렉션(2) 1 컬렉션 프레임 워크 TreeSet의 메소드 리턴타입 메소드 설명 Map.Entry(K,V) firstEntry() 제일 낮은 Map.Entry를 반환 Map.Entry(K,V) lastEntry() 제일 높은 Map.Entry를 반환 Map.Entry(K,V) lowerEntry(K key) 바로 아래 Map.Entry반환 Map.Entry(K,V) higherEntry(K key) 바로 위 Map.Entry반환 Map.Entry(K,V) floorEntry(K key) 동등한 Map.Entry가 있으면 반환, 없으면 바로 아래 Map.Entry 반환 Map.Entry(K,V) ceilingEnrty(K key) 동등한 Map.Entry가 있으면 반환, 없으면 바로 위 Map.Entry 반환 Map.Entry(K,V) pollFirstEntry() 제일 낮은 Map.Entry를 꺼내고 컬렉션에서 제거 Map.Entry(K,V) pollLastEntry() 제일 높은 Map.Entry를 꺼내고 컬렉션에서 제거 NaviableSet<K> descendingKeySet() 내림차순 정렬된 NaviableSet을 반환 NavigableMap<K,V> descendingMap() 내림차순 정렬된 NaviableMap을 반환
  • 10. 8) 검색기능강화 컬렉션(3) 1 컬렉션 프레임 워크 NavigableSet<E> headSet(E toElement, boolean incl usive) 주어진 Map.Entry보다 낮은 Map.Entry들을 NavigableSet으로 반환, 주어진 Map.Entry 여부 포함은 두번째 파라미터로 제어 NavigableSet<E> tailSet(E fromElement, boolean in clusive) 주어진 Map.Entry보다 높은 Map.Entry들을 NavigableSet으로 반환, 주어진 Map.Entry 여부 포함은 두번째 파라미터로 제어 NavigableSet<E> subSet(E fromElement, boolean fr omInclusive, E toElement, boolean toInclus ive) 시작과 끝으로 주어진 Map.Entry 사이의 Map.Entry들을 NavigableSet으로 반환. 경계 포함 여부는 boolean 값으로 제어 int compareTo<T o> 정렬 전에 비교를 위해 사용. 오버라이딩 해야함. 오버라이딩방식(주어진 객체와 같으면 0,더 작으면 음수 반환, 더 크면 양수 반환) int compareTo<T o1, T o2> 정렬을 위해 사용. 오버라이딩 해야함. 오버라이딩방식(두 객체가 같으면 0, o1이 o2보다 앞에 오게 하려면 음수, o1이 o2보다 뒤에 오게 하려면 양수 반환) TreeSet의 메소드 리턴타입 메소드 설명
  • 11. 9) LIFO, FIFO 컬렉션 1 컬렉션 프레임 워크 개요 스택과 큐를 위한 자료구조. Stack의 메소드 반환 타입 메소드 설명 E push(E item) 주어진 객체를 삽입 E peek() 맨위 객체를 반환(삭제하지않음) E pop() 맨위 객체를 반환(삭제함) Queue의 메소드 리턴타입 메소드 설명 boolean offer(E e) 객체 삽입 E peek() 하나를 가져옴(제거하지 않음) E poll() 객체 하나를 가져옴(제거)
  • 12. 10) 동기화된 컬렉션, 병렬처리를 위한 컬렉션 1 컬렉션 프레임 워크 동기화된 컬렉션 개요 Vector와 Hashtable은 동기화된 메소드로 구성되어서 Thread-safe하다. 동기화 메소드의 반환 타입 메소드 설명 List<T> synchronizedList(List<T> list) List를 동기화된 List로 반환 Map<K,V> synchronizedMap(Map<K,V> m) Map을 동기화된 Map으로 반환 Set<T> synchronizedSet(Set<T> s) Set을 동기화된 Set으로 반환 병렬 처리를 위한 컬렉션 개요 전체 요소를 빠르게 처리하려면 병렬 처리가 필요. 이를 위해 java.util.concurrent패키지의 ConcurrentHashMap와 ConcurrentLinkedQueue 클래 스를 제공. 각각 Map과 Queue의 구현 클래스. ConcurrentHashMap은 thread-safe하면서, 멀티스레드요소 를 병렬처리.
  • 14. 2 Stream 1) Stream(1) 개요 자바8부터 추가된 컬렉션(배열포함)의 저장요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자. 반복자 스트림 List<String> 컬렉션을 순차적 처리하려면 아래와 같이 작성 List<String< list = arrays.asList("B","D","K"); Stream<String< stream = list.stream(); stream.forEach(name->System.out.println(name) ); 스트림 특징 Iterator과 유사한 반복자이만, [람다식 요소처리 제공/내부반복자 사용으로 쉬운 병렬처리/중간처리 와 최종처리 작업 수행]의 차이. 람다식 요소 처리 제공 Stream의 요소처리 메소드는 대부분 함수적 매개타입을 가지기 때문에 람다식/메소드 참조를 이용해 서 요소처리 내용을 매개값으로 전달 할 수 있음 내부반복자사용으로 쉬운 병렬처리 외부반복자(개발자가 직접 코드로 컬렉션의 요소를 반복해서 가져옴)와 달리 내부반복자(컬렉션 내부 에서 요소들을 반복시키고 개발자는 요소당 처리할 코드만 작성)는 개발자가 요소처리코드에 집중할 수 있고, 멀티코어CPU를 최 대한 활용해서 요소들을 분배시켜 병렬 작업을 할 수 있어서 효율적으로 요소를 반복시킬 수 있음. 중간처리/최종처리 가능 중간처리시 매핑/필터링/정렬을 수행하고, 최종처리시 반복/카운팅/평균/총합 등 집계처리 수행 스트림 종류 java.util.stream패키지 내 BaseStream인터페이스를 상속한 Stream/IntStream/LongStream/LongStream 인터페이스. Stream은 객체 요소 처리 스트림, 나머지 스트림들을 각각 기본타입 int/long/double요소 처리 스트림. 다음과 같이 소스로부터 스트림 구현 객체 획득 가능.
  • 15. 2 Stream 2) Stream(2) 반환 타입 메소드 소스 Stream<T> java.util.Collection.stream() java.util.Collection.parallelStream() 컬렉션 Stream<T> Array.stream(T[]), Stream.of(T[]) 배열 IntStream Array.stream(int[]), Stream.of(int[]) LongStream Array.stream(long[]), Stream.of(long[]) DoubleStream Array.stream(double[]), Stream.of(double[]) IntStream IntStream.range(int,int) IntStream.rangeClose(int,int) int범위 LongStream LongStream.range(long,long) LongStream.rangeClose(long,long) long 범위 Stream<Path> Files.find(Path, int, BiPredicate, FileVisitOption) Files.list(Path) 디렉토리 Stream<String> Files.lines(Path, Charset) BufferedReader.lines() 파일 DoubleStream Random.doubles(…) 랜덤수IntStream Random.ints() LongStream Random.longs()
  • 16. 2 Stream 3) Stream Pipe Line(1) 개요 대량의 데이터를 가공해서 축소하는것을 Reduction이라고 하는데, 데이터의 합계/카운팅/최대값/최 소값 등이 리덕션의 예이다. 컬렉션요소를 리덕션의 결과물로 집계하기위해 중간처리와 최종처리가 필요하다. 파이프라인 스트림은 파이프라인을 통해 최종처리를 해결한다. 파이프라인은 최종처리를 제외하고 모두 중간처리 스트림이다. 중간 스트림이 생성될때부터 최종처리가 시작되기 전 까지는 중간처리는 지연(lazy)된다. 최종처리가 시작되면 중간 스트림에서 하나씩 컬렉션 요소가 처리되고 최종처리까지 오게된다. Stream 인터페이스에는 필터링/매킹/정렬 등 중간처리 메소드가 많이있는데, 이 메소드들은 중간처리 된 스트림을 반환한다. 그리고 스트림에서 다시 중간처리 메소드를 호출해서 파이프라인을 형성한다. double ageAvg = list.stream()//오리지널 스트림 .filter(m->m.getGender()==Member.MALE)//중간처리스트림 .mapToInt(Member::getAge) .average()//최종처리 .getAsDouble();
  • 17. 2 Stream 4) Stream Pipe Line(2) 중간처리메소드 종류 반환타입 메소드 소속된 인터페이스 필터링 Stream IntStream LongStream DoubleStream distinct() 공통 filter(…) 공통 매핑 flatMap(…) 공통 flatMapToDouble(…) Stream flatMapToInt(…) Stream flatMapToLong(…) Stream map(…) 공통 mapToDouble(…) Stream.IntStream,LongStre am mapToInt(…) Stream,LongStream,Doubl eStream mapToLong(…) Stream,IntStream,DoubleSt ream mapToObj(…) IntStream,LongStream,Dou bleStream asDoubleStream() IntStream,LongStream asLongStream() IntStream boxed() IntStream,LongStream,Dou bleStream 정렬 sorted(…) 공통 루핑 peek(…) 공통
  • 18. 2 Stream 5) Stream Pipe Line(3) 최종처리메소드 종류 반환타입 메소드 소속된 인터페이스 매칭 boolean allMatch(…) 공통 booldean anyMatch(…) 공통 boolean noneMatch(…) 공통 집계 long count() 공통 OptionalXXX findFirst() 공통 OptionalXXX max(…) 공통 OptionalXXX min(…) 공통 OptionalDouble average() IntStream,LongStream, D oubleStream OptionalXXX reduce(…) 공통 int, long, double sum() IntStream,LongStream, D oubleStream 루핑 void forEach(…) 공통 수집 R collect(…) 공통
  • 19. 개요 Parallel Operation은 멀티코어 CPU환경에서 하나의 작업을 분할해서 각각 코어가 병렬처리하는 것 동시성과 병렬성 멀티스레들은 동시성 또는 병렬성으로 실행됨. 병렬성은 데이터병렬성/작업병렬성으로 구분 데이터병렬성 데이터를 쪼개어 서브데이터로 만들고 각 데이터를 병렬 처리. 자바8의 병렬스트림은 데이터병렬성을 구현. CPU수 만큼의 서브요소로 나누어 CPU수만큼의 스레드가 각각 서브요소들을 병렬 처리함. 작업병렬성 서로다른 작업을 병렬 처리. 예시 : 웹서버처럼 각 브라우저 요청 내용을 개별 스레드에서 병렬처리. 포크조인 프레임워크 병렬스트림은 요소들을 병렬로 처리하기 위해 포크조인 프레임워크를 사용. 병렬 스트림을 이용하면 런타임시에 포크조인 프레임워크가 동작, 포크단계에서 전체 데이터를 서브데 이터로 분리하고 서브데이터를 멀티코어에서 병렬처리한 후에 조인단계에서 서브결과를 결합해서 최종결과를 만들어냄. 포크조인 프레임워크는 포크와 조인긴으이외에 스레드풀 ForkJoinPool을 제공. 작업스레드는 ExecutorService의 구현객체인 ForkJoinPool을 사용. 병렬 스트림 생성 병렬처리를 위해 병렬스트림을 이용할때, 병렬스트림을 다음 두가지 메소드로 얻을 수 있다. parallelStream()메소드는 컬렉션으로부터 병렬스트림을 바로 반환하고, parallel()메소드는 순차처리 스트림을 병렬 처리 스트림으로 변환해서 반환한다. 인터페이스 반환 타입 메소드 java.util.Collection Stream parallelStream() java.util.Stream.Stream java.util.Stream.IntStre am java.util.Stream.LongSt ream java.util.Stream.Double Stream Stream IntStream LongStream DoubleStream parallel() 2 Stream 6) 병렬처리
  • 20. 2 Stream 7) 병렬처리 성능 개요 병렬처리가 순차처리보다 항상 실행성능이 좋지 않다. 요소의 수와 요소당 처리시간/스트림소스의종류/Core의 수를 고려해야 한다. 요소의 수와 요소당 처리시 간 컬렉션에 요소의 수가 적고 요소당 처리시간이 짧으면 순차처리가 더 빠를 수 있다. 병렬처리는 스레드풀생성,스레드생성이라는 추가비용이 발생하기 때문이다. 스트림소스의종류 ArrayList, 배열의 경우는 인덱스로 요소를 관리하기 때문에 분리가 쉬워 병렬처리시간이 절약되며, HashSet, TreeSet는 요소분리가 어려우며, LinkedList는 링크를 따라가야하므로 요소분리가 어렵다. 때문에 이 소스들은 ArrayList, 배열보다 병렬처리가 늦다. Core의 수 싱글코어는 순차처리가 빠르다. 코어의 수가 많을수록 병렬 처리속도가 빠르다.
  • 22. 3 Regular Expression 1) 정규표현식 규칙(1) ^ 형식의 시작 $ 형식의 끝 s 공백 /,.?! 등 기호는 앞에 |를 붙여 줌 d 숫자 [0-9]와 동일 D 숫자가 아닌 문자 w 알파벳, 숫자, _(밑줄) 알파벳이나 숫자를 제외한 문자 [0-9] 숫자 1개 [a-z] 문자 1개 [A-Z] 문자 1개 [A-Za-z] 파벳 대소문자 1개 [^~~~] ~~ 을 제외한 것 . 든 범위의 한 문자 * 의 문자가 0개 이상 + 의 문자가 1개 이상 반복
  • 23. 3 Regular Expression 2) 정규표현식 규칙(2) ? 문자가 없거나 하나있음을 나타냄 {숫자} 의 문자가 숫자만큼 반복 {} 행문자가 나타나는 횟수 또는 범위를 나타냄 a{3} a 가 3번 반복된 경우 a{3,} a 가 3번 이상 반복인 경우 a{3,5} a 가 3번 이상 5번 이하 반복된 경우 | 또는 의 의미 (괄호를 이용해 여러개 가능 => ex (1| 2| 3)) [형식] 안에 있는 형식 [] 문자 클래스를 지정할 때 사용함, 문자의 집합이나 범위는 "-" 기호로 범위를 나타냄 []내에서 ^가 선행하여 나타나면 not 를 나타냄
  • 24. 3 Regular Expression 3) 기본적인 문장 검증 정규표현식 숫자만 ^[0-9]*$ 영문자 ^[a-zA-Z]*$ 한글만 ^[가-힣]*$ 영문자와 숫자만 ^[a-zA-Z0-9]*$ 이메일 ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$ 또는 ^[_0-9a-zA-Z-]+@[0-9a-zA-Z-]+(.[_0-9a- zA-Z-]+)*$ 휴대폰 ^01(?:0|1[6-9])-(?:d{3}|d{4})-d{4}$ 일반전화 ^d{2,3}-d{3,4}-d{4}$ 주민등록 d{6}-[1-4]d{6} IP 주소 ([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})
  • 25. 3 Regular Expression 4) 예시 <0개 이상의 공백> <소문자> pattern "^s*[a-z]$" 은 시작 공백이 0개 이상 소문자 한개 끝 private static void pmatch(String input) { Pattern pattern = Pattern.compile("^s*[a-z]$"); Matcher matcher = pattern.matcher(input); if (matcher.matches()) System.out.println("true"); else System.out.println("false"); } <0개 이상의 공백><소문자> <1개 이상의 공백> <대소문자> <숫자> pattern "^s*[a-z]s+[A-Za-z][0-9]$" 은 시작 공백이 0개 이상 소문자 1개 공백이 1개 이상 대소 문자 숫자 끝 private static void pmatch(String input) { Pattern pattern = Pattern.compile("^s*[a-z]s+[A-Za-z][0-9]$"); Matcher matcher = pattern.matcher(input); if (matcher.matches()) System.out.println("true"); else System.out.println("false"); }
  • 26. 3 Regular Expression 5) 패턴/매쳐 클래스(1) 개요 java.util.regex 패키지에 포함 패턴 클래스 Pattern 객체는 Perl 문법과 비슷한 형태로 정의된 정규표현식을 나타냅니다. 문자열로 정의한 정규표현식은 사용되 기 전에 반드시 Pattern 클래스의 인스턴스로 컴파일되어야 합니다. 컴파일된 패턴은 Matcher 객체를 만드는 데 사용 되며, Matcher 객체는 임의의 입력 문자열이 패턴에 부합되는 지 여부를 판가름하는 기능을 담당하합니다. 또한 Pattern 객체들은 비상태유지 객체들이기 때문에 여러 개의 Matcher 객체들이 공유할 수 있습니다. 매쳐 클래스 Matcher 객체는 특정한 문자열이 주어진 패턴과 일치하는가를 알아보는데 이용됩니다. Matcher 클래스의 입력값으 로는 CharSequence라는 새로운 인터페이스가 사용되는데 이를 통해 다양한 형태의 입력 데이터로부터 문자 단위의 매칭 기능을 지원 받을 수 있습니다. 기본적으로 제공되는 CharSequence 객체들은 CharBuffer, String, StringBuffer 클래스가 있습니다. Matcher 객체는 Pattern 객체의 matcher 메소드를 통해 얻어진다. Matcher 객체가 일단 만들어지면 주로 세 가지 목적으로 사용됩다. 주어진 문자열 전체가 특정 패턴과 일치하는 가를 판단(matches). 주어진 문자열이 특정 패턴으로 시작하는가를 판단(lookingAt). 주어진 문자열에서 특정 패턴을 찾아낸다(find). 이들 메소드는 성공 시 true를 실패 시 false 를 반환합니다. 또한 특정 문자열을 찾아 새로운 문자열로 교체하는 기능도 제공됩니다. appendRepalcement 메소드는 일치하는 패 턴이 나타날 때까지의 모든 문자들을 버퍼로 옮기고 찾아진 문자열 대신 교체 문자열로 채워 넣습니다. 또한 appendTail 메소드는 캐릭터 시퀀스의 현재 위치 이후의 문자들을 버퍼에 복사해 넣습니다. 다음 절에 나오는 예제 코 드를 참고하도록 합시다. CharSequence 인터페이스 CharSequence 인터페이스는 다양한 형태의 캐릭터 시퀀스에 대해 일관적인 접근 방법을 제공하기 위해 새로 생겨났 으며, java.lang 패키지에 존재합니다. 기본적으로 String, StringBuffer, CharBuffer 클래스가 이를 구현하고 있으 므로 적절한 것을 골라 사용하면 되며, 인터페이스가 간단하므로 필요하면 직접 이를 구현해 새로 하나 만들어도 됩니 다.
  • 27. 3 Regular Expression 6) 패턴/매쳐 클래스(2) 예시(금지어 필터링하기) import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegExTest06 { public static String filterText(String sText) { Pattern p = Pattern.compile("fuck|shit|개새끼", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(sText); StringBuffer sb = new StringBuffer(); while (m.find()) m.appendReplacement(sb, maskWord(m.group())); m.appendTail(sb); return sb.toString(); } public static String maskWord(String word) { StringBuffer buff = new StringBuffer(); char[] ch = word.toCharArray(); for (int i = 0; i < ch.length; i++) { if (i < 1) buff.append(ch[i]); else buff.append("*"); } return buff.toString();} public static void main(String[] args) { String sText = "Shit! Read the fucking manual. 개새끼야."; System.out.println(filterText(sText)); }} 예시 출력결과 S***! Read the f***ing manual. 개**야.
  • 29. 4 Open S/W License 1) 공개소프트웨어 라이선스(1) GPL 전문(한국어 번역본) http://korea.gnu.org/documents/copyleft/gpl.ko.html GPL FAQ(한국어 번역본) http://www.gnu.org/licenses/gpl-faq.ko.htm LGPL 전문(한국어 번역본) http://korea.gnu.org/people/chsong/copyleft/lgpl.ko.html KLDP 오픈소스 SW 라이센 스 가이드 http://wiki.kldp.org/wiki.php/OpenSourceLicenseGuide 라이센스구분 제약사항 제한범위 GNU GPL(General Public License) 기본적으로 어떤 프로그램을 개발할 때, GPL 코드를 일부 라도 사용하게 되면 그 프로그램은 GPL이 된다. GPL을 가진 프로그램을 유료로 판매하는 것은 가능하지만, 반드 시 전체 소스코드는 무료로 공개해야 한다. GPL 코드를 사용한 SW를 내부적인(개인, 기관, 단체 등) 목적으로만 사용할 때에는 소스코드를 공개할 필요가 없 지만 어떤 형태로든(유료든 무료든) 외부에 공표/배포할 때에는 전체 소스코드를 공개해야 한다. GPL과 관련되지 아니한 부분만 독립적으로 팔거나 배포 하는 경우는 관계가 없다. 하지만 GPL 코드를 일부라도 사용한 프로그램 전체를 배포할 때에는 GPL을 적용(즉, 프로그램의 전체 소스코드 공개)해야 한다 만일 배포하고자 하는 프로그램의 특정 부 분이 GPL 코드로부터 파생된 것이 아닌 독 립적인 저작물일 경우에는 독립 저작물 모 듈의 개별적인 배포에는 GPL이 적용되지 아니한다 (즉, 코드를 공개할 필요가 없다). 하지만 프로그램을 전체(GPL코드에서 파 생된 모듈 + 독립 저작물 모듈)적으로 배포 할 때에는 GLP을 따라야 한다
  • 30. 4 Open S/W License 2) 공개소프트웨어 라이선스(2) GNU LGPL (Lesser General Public Li cense) LGPL은 GPL보다는 훨씬 완화된 (lesser) 조건의 공개 소프트웨어 라이 선스. LGPL 코드를 사용했음을 명시만 하면 된다. LGPL 코드를 단순히 이용하는 것이 아 니라 이를 수정한 또는 이로부터 파생된 라이브러리를 개발하여 배포하는 경우 에는 전체 코드를 공개해야 한다. LGPL 코드를 정적(static) 또는 동적(dynamic) 라이브러리 로 사용한 프로그램을 개발하여 판매/배포할 경우에 프로그램 의 소스코드를 공개하지 않아도 된다 BSD (Berkeley Software Distri bution) 제한이 없는 라이선스(OpenCV도 여 기에 속함.) 소스코드 공개의 의무가 없으며 상용(상업적) 소프트웨어에서 도 무제한 사용 가능한 라이선스
  • 32. 5 I/O Package 1) IO패키지(1) 개요 자바에서는 스트림을 통해 파일/네트워크 입출력을 처리한다. 입력스트림과 출력스트림 프로그램이 데이터를 입력받을 때에는 입력스트림(InputStream)이라 부르고, 프로그램이 데이터를 보낼 때에는 출력 스트림(OutputStream)이라 부른다. 입력스트림 시작은 키보드/파일/네트워크이며 출력 스트림 목적지는 모니터/파일/네트워크이다. java.io 패키지 클래스 설명 File 파일 시스템의 파일 정보를 얻기 위한 클래스 Console 콘솔로부터 문자를 입출력하기 위한 클래스 InputStream/OutputStream 바이트 단위입출력을 위한 최상위 입출력 스트림 클래스
  • 33. 5 I/O Package 2) IO패키지(2) java.io 패키지 클래스 설명 FileInputStream/FileOutputStream DataInputStream/DataOutputStream ObjectStream/ObjectOutputStream PrintStream BufferedInputStream/BufferedOutputStrea m 바이트 단위입출력을 위한 하위 입출력 스트림 클래스 Reader/Writer 문자 단위 입출력을 위한 최상위 입출력 스트림 클래스
  • 34. 5 I/O Package 3) IO패키지(3) 스트림 클래스 종류 스트림 클래스는 바이트기반, 문자 기반 스트림으로 나뉜다. 바이트 기반 스트림은 그림/멀티미디어/문자 등 모든 종류의 데이터를 보낼 수 있다. 문자 기반 스트림은 문자만 보낼 수 있도록 특화 되어 있다. 구분 바이트기반 스트림 문자기반 스트림 입력스트림 출력스트림 입력스트림 출력스트림 최상위클래스 InputStream OutputStream Reader Writer 하위클래스 (예시) XXXInputStream (FileInputStream) XXXOutputStream (FileOutputStream) XXXReader (FileReader) XXXWriter (FileWriter)
  • 35. 5 I/O Package 4) InputStream(1) 개요 바이트 기반 입력 스트림의 최상위 추상 클래스. FileInputStream/BufferedInputStream/DataInputStream 의 부모 클래스. 바이트 기반 입력스트림의 메소드를 지님. 리턴 타입 메소드 설명 int read() 입력 스트림으로부터 1 바이트를 읽고 읽은 바이트를 반환 int read(byte[] b) 입력 스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열b에 저장 하고 읽은 바이트수 반환 int read(byte[] b, int off, int len) 입력 스트림으로부터 len개의 바이트를 읽고 byte배열 b[off]부터 len개까지 저장. 실제 읽은 바이트 수 len개를 반환. len개를 다 읽지못하면 읽은 바이트 수를 반환. void close() 사용한 시스템 자원을 반납하고 입력 스트림을 닫음.
  • 36. 5 I/O Package 5) InputStream(2) read()메소드 입력스트림으로부터 1바이트를 읽고 4바이트 int타입으로 반환 더 이상 입력 스트림으로부터 읽을 수 없다면 -1을 반환. read(byte[] b)메소드 배열 길이 만큼 읽고 배열에 저장한 후, 읽은 바이트 수를 반환. 더 이상 읽을 수 없을때 -1을 반환 read(byte[] b, int off, int len) 메소드 off를 0으로 len을 배열의 길이로 준다면 read(byte[] b)와 같다. close()메소드 사용한 시스템 자원을 반납하고 입력스트림을 종료.
  • 37. 5 I/O Package 6) OutputStream 개요 바이트 기반 출력 스트림의 최상위 추상 클래스. FileOutputStream/PrintStream/BufferedOutputStream/DataOutputStream 의 부모 클래스. 바이트 기반 출력 스트림의 메소드를 지님. 리턴 타입 메소드 설명 void write(int b) 출력 스트림으로부터 1 바이트를 읽고 읽은 바이트를 반환 void write(byte[] b) 출력 스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열b에 저장 하고 읽은 바이트수 반환 void write(byte[] b, int off , int len) 출력스트림으로 주어진 바이트배열 b[off]부터 len개의 바이트를 보냄 void flush() 버퍼에 있는 내용을 출력해서 비움 void close() 사용한 시스템 자원을 반납하고 출력 스트림을 닫음. write(int b) 메소드 매개변수로 주어진 int값에서 끝에있는 1바이트만 출력 스트림으로 보낸다.
  • 38. 5 I/O Package 7) Reader 개요 문자 기반 입력 스트림의 최상위 추상 클래스. FileReader/BufferedReader/InputStreamReader 의 부모 클래스. 문자 기반 입력 스트림의 메소드를 지님. 반환형 메소드 설명 int read() 입력 스트림으로부터 한 개의 문자를 읽고 반환 int read(char[] cbuf) 입력 스트림으로부터 한 개의 문자를 읽고 cbuf배열에 저장하고 실제로 읽은 문 자수 반환 int read(char[] cbuf, int off, int len) 입력스트림으로부터 len개의 문자를 읽고 cbuf[off]에서부터 len개까지 저장 한후 실제로 읽은 문자수 반환 void close() 입력 스트림을 닫고 시스템 자원 반납 read()메소드 한개의문자(2바이트)를 읽고 4byte int타입으로 반환. 이 반환값을 char형태로 캐스팅하면 읽은 문자 를 얻을 수 있음. 더 이상 읽을 수 없으면 -1을 반환 read()메소드 한개의문자(2바이트)를 읽고 4byte int타입으로 반환. 이 반환값을 char형태로 캐스팅하면 읽은 문자 를 얻을 수 있음. 더 이상 읽을 수 없으면 -1을 반환
  • 39. 5 I/O Package 8) Writer 개요 문자 기반 출력 스트림의 최상위 추상 클래스. FileWriter/BufferedWriter/PrintWriter/OutputStreamWriter 의 부모 클래스. 문자 기반 출력 스트림의 메소드를 지님. 반환형 메소드 설명 void write(int c) 출력 스트림으로 주어진 한 문자를 보냄(c의 끝 2바이트) void write(char[] cbuf) 출력 스트림으로 주어진 문자 배열 cbuf의 모든 문자를 출력 void write(char[] cbuf, int off, int len) cbuf[off]부터 len개의 문자를 출력 void write(String str) str을 모두 출력 void write(String str, int o ff, int len) str의 off인덱스부터 len개의 문자를 출력 void flush() 버퍼에 남은 모든 문자를 출력하고 버퍼를 비움 void close() 출력 스트림을 닫고 시스템자원을 반납
  • 40. 5 I/O Package 9) 콘솔 입/출력(1) 개요 콘솔로 입력받을때 System.in을 사용하고, 콘솔에 데이터를 출력할때 System.out을 사용한다. 에러출 력은 System.err를 사용한다. System.in필드 InputStream의 read() 메소드로 한바이트를 읽으면 키보드로 입력된 키를 확인할 수 있음. 리턴된 int값에는 12진수 아스키코드가 들어있음. InputStream. is=System.in; int ascCode=is.read(); char InputChar=(char)is.read();//문자를 얻을수 있으록 캐스팅 System.out필드 out은 PrintStream타입의 필드. out필드를 OutputTream타입으로 변환해서 사용가능. 콘솔로 1개 바이트를 출력할때는 OutputSteam의 write(int b)메소드 사용. 바이트 값은 아스키코드이며, write()메소드는 아스키 코드를 문자로 콘솔에 출력. OutputStream os = System.out; byte b= 97; os.write(b); os.flush(); Consol 클래스 java.io.Console 클래스로 콘솔에서 입력받은 문자열을 읽을 수 있음. Console console=System.console(); System.console() 메소드는 null을 반환하기 때문에 명령 프롬프트에서 실행해야함.
  • 41. 5 I/O Package 10) 콘솔 입/출력(2) Consol클래스 메소드 반환형 메소드 설명 String readLine() 엔터를 입력하기 전까지 모든 문자열을 읽음 char[] readPassword() 키보드 입력문자를 콘솔에 보여주지 않고 읽음 Scanner 클래스 콘솔클래스는 문자열만 읽을 수 있음. Scanner클래스를 이용하면 기본타입의 값을 읽을 수 있음. Scanner sc=new Scanner(System.in); Scanner클래스 메소드 반환형 메소드 설명(읽어들이는 변수형) boolean nextBoolean() boolean byte nextByte() 바이트 short nextShort() 쇼트 int nextInt() 인트 long nextLong() 롱 float nextFloat() 플로트 double nextDouble() 더블 String nextLine() 스트링
  • 42. 5 I/O Package 11) File 클래스(1) 개요 java.io패키지에서 제공하는 File클래스는 파일크기/속성/이름 등 정보를 얻고, 파일 생성/삭제 기능을 제공. 파일 데이터를 읽고 쓰는 기능은 없기때문에 파일 입출력은 스트림을 사용. File file=new file("c:txt.txt"); boolean isExist=file.exists(); 메소드반환형 메소드 설명 boolean createNewFile() 파일 생성 boolean mkdir() 새로운 디렉토리 생성(단일하위디렉토리생성) boolean mkdirs() 경로상에 없는 모든 디렉토리 생성(계층형태의 경로를 생성) boolean delete() 파일/디렉토리삭제 boolean canExecute() 파일 실행 가능 여부 boolean canRead() 읽기 가능 여부
  • 43. 5 I/O Package 12) File 클래스(2) boolean canWrite() 수정/저장 가능여부 String getName() 파일 이름 반환 String getParent() 부모디렉토리 반환 File getParentFile() 부모 디렉토리를 File객체로 생성후 반환 String getPath() 전체 경로를 반환 boolean isDirectory() 디렉토리 여부 boolean isFile() 파일 여부 boolean isHidden() 숨김파일 여부 long lastModified() 최종 수정일+시간 반환 long length() 파일 크기 반환 String[] list() 디렉토리 내 파일 및 서브디렉토리 목록을 String[]형태로 반환 String[] list(FilenameFilter filer) 필터에 매칭되는것만 String[]형태로 반환 File[] listFiles() 디렉토리 내 파일 및 서브디렉토리 목록을 File배열로 반환 File[] listFiles(FilenameFile filter) 디렉토리 내 파일 및 서브디렉토리 목록중 필터에 매칭되는 것만 File배열로 반환 메소드반환형 메소드 설명
  • 44. 5 I/O Package 13) File 클래스(3) 성능향상 보조 스트림 프로그램 성능은 입출력에 달려있다. HDD의 경우 메모리 버퍼와 작업해서 쓰기속도를 향상 시킨다. 이와 같이 버퍼를 제공하여 프로그램 성능을 향상시키는 스트림이 있다. 바이트 기반 스트림- BufferedInputStream, BufferedOutputStream 문자 기반 스트림-BufferedReader, BufferedWrite 외부입력을 직접 읽지 않고, 버퍼로부터 읽어서 읽기 성능을 향상 시킨다. 기본 타입 입출력 보조 스트림 바이트 스트림은 바이트 단위의 입출력이기에 기본데이터타입의 단위로 입출력이 불가하다. DataInputStream과 DataOutputStream보조 스트림을 연결하면 기본데이터 타입으로 입출력이 가능하다. DataInputStream dis=new DataInputStream(바이트 입력 스트림); DataOutputStream dos=new DataOutputStream(바이트 출력 스트림); 아래 메소드로 입출력할때에는 입출력 순서가 같아야한다 (ex) int-double-char로 입력하면 int-double-char순으로 출력해야한다.
  • 45. 5 I/O Package 14) File 클래스(4) DataInputStream DataOutputStream boolean readBoolean() void writeBoolean(boolean v) byte readByte() void writeByte(int v) char readChar() void writeChar(int v) double readDouble() void writeDouble(double v) float readFloat() void writeFloat(float v) int readInt() void writeInt(int v) long readLong() void writeLong(long v) short readShort() void writeShort(short v) String readUTF() void writeUTF(String str) 프린터 보조 스트림 PrintStream과 PrintWriter는 print(), println()을 가지고 있는 보조 스트림. 각각 바이트 입력 스트림, 문자 출력 스트림과 연결된다. PrintStream ps=new PrintStream(바이트출력스트림); PrintWriter pw=new PrintWriter(바이트 출력 스트림);
  • 46. 5 I/O Package 15) File 클래스(5) 객체 입출력 보조 스트림 객체에 생성된 객체를 파일/네트워크로 출력할 수 있다. 바이트 기반 스트림으로 출력한다. 객체 직렬화를 해야 출력이 가능하며, 직렬화믄 데이터(필드값)을 일렬로 늘어선 연속적 바이트형태이다. 받는 쪽에서는 이를 복원하며, 이를 역직렬화 라고 한다. ObjectInputStream, ObjectOutputStream으로 객체를 입출력할 수 있으며, ObjectOutputStream은 바이트 출력 스트림과 연결되어 직렬화를, ObjectOutputStream은 바이트 입력 스트림과 연결되어 객체로 역직렬화를 수행한다. ObjectInputStream ios = new ObjectInputStream(바이트입력스트림); ObjectOutputStream oos = new ObjectOutputStream(바이트입력스트림); 직렬화가능한 클래스 (Serializable) Serializable 인터페이스를 구현한 클래스만 직렬화 할 수 있고, 이 인터페이스는 필드나 메소드가 없지 만 객체를 직렬화 할때 private 필드를 포함한 모든 필드를 변환해도 좋다는 표시 역할을 수행한다. public class XXX implements Serializable() writeObject()/ readObject()메소드 두 클래스가 상속관계일때, 부모클래스가 Serializable인터페이스를 구현하고 있으면 자식클래스는 Serializable인터페이스를 구현하지 않아도 자식 객체를 직렬화 하면 부모필드&자식 모두 직렬화 된다. 반대로 자식만 Serializeable인터페이스를 구현한 경우에는 부모의 필드는 직렬화에서 제외된다. 이경우 부모클래스 필드를 직렬화 하고 싶다면 부모클래스도 인터페이스를 구현하거나, 자식클래스에서 writeObject()와 readObject()메소드를 선 언해서 부모객체의 필드에서 직접출력하는 방법을 선택해야 한다. 이때, 접근제한자가 priavte가 아니면 자동호출되지 않는다. defaultWriteObject()와 defaultReadObject()는 자식클래스에 정의된 필드들을 모두 직렬화 하고 역직렬화 한다.
  • 47. 5 I/O Package 16) 네트워크(1) 서버/클라이언트 서비스제공프로그램을 서버, 서비스를 받는 프로그램을 클라이언트라고 하며, 서버는 클라이언트가 요청하는 내용을 처리하고 응답을 클라이언트로 보낸다. 포트별 구분명 범위 설명 웰노운포트 0~1023 국제 인터넷주소관리기구가 특정 애플리케이션용으로 미리 예약한 포트 등록된 포트 1024~49151 회사에서 등록해서 사용할 수 있는 포트 동적/사적 포트 49152~65535 운영체제가 부여하는 동적 또는 개인적 목적으로 사용할 수 있는 포트 InetAdress로 IP얻기 java.net.InetAddress 객체로 IP주소를 표현. InetAddress ia=InetAddress.getLocalHost(); 도메인 네임 획득 InetAddress ia=InetAddress.getByName(String host); InetAddress[] iaArr = InetAddress.getAllByName(String host); 문자열로 된 IP주소 획득 String ip=InetAddress.getHostAddress();
  • 48. 5 I/O Package 17) 네트워크(2) TCP 네트워킹 TCP는 정확하고 안정적으로 전달(연결지향적 프로토콜). 연결수립-데이터통신-연결종료 로 진행하며, 네트워크 길이가 짧지 않을 경우, UDP보다 느릴 수 있다. java.net.ServerSocket과 java.netSocket클래스로 TCP네트워킹 사용할 수 있다. ServerSocket과 Socket용도 클라이언트의 요청을 기다리면서 연결수락을 담당하는것이 java.net.ServerSocket클래스, 연결된 클라이언트와 통신을 담당하는 것이 java.net.Socket클래스. 클라이언트가 연결요청을 해오면 ServerSocket을 수락하고, 통신용 Socket을 만든다. ServerSocket생성/ 연결수락 ServerSocket serverSocket = new ServerSocket(5001);//5001번 포트에 바인딩 처럼 서버를 개발하려면 ServerSocket객체를 얻어야 한다. 또는 ServerSocket serverSocket new ServerSocket(); serverSocket.bind(net InetSocketAddress(5001)); 처럼 디폴트 생성자로 객체 생성 후, 포트 바인딩을 위해 bind()메소드를 호출한다. 사용중인 포트라면 Bind익셉션이 발생하고, 바인딩이 끝나고 연결 수락을 하려면 accept()메소드를 호출한다. accept()메소드는 클라이언트가 연결 요청 전까지는 블로킹(스레드 대기상태)된다. 때문에 UI생성이나 이벤트 처리하는 스레드에서 이 메소드를 호출하면 안된다. 클라이언트가 연결요청을하면 accept()는 클라이언트와 통신할 소켓을 만들고 반환한다(연결수립) 블로킹되어있을때 close()메소드를 호출하면 소켓익셉션이 발생한다.
  • 49. 5 I/O Package 18) 네트워크(3) InetSocketAddress 메소드 반환형 메소드명 설명 String getHostName() 클라이언트IP반환 int getPort() 클라이언트 포트번호 반환 String toString() "IP:포트번호"형태 문자열 반환 close() 소켓 클로즈 메소드롤 호출해서 언바인딩 시켜야 다른 프로그램에서 해당 포트를 사용 할 수 있다. 소켓 생성과 연결요청 클라이언트가 서버연결 요청을 하려면 java.net.Socket을 이용. 아래와 같이 서버아이피와 포트를 바인딩한다. Socket socket=new Socket("localhost", 5001);//방법1 Socket socket new Socket(new InetSocketAddress("localhost",5001) );//방법2 socket=new Socket();//생성따로 socket.connect( new InetSocketAddress("localhost", 5001) );//연결요청따로 socket.close();//연결 강제 종료
  • 50. 5 I/O Package 19) 네트워크(4) 소켓 데이터 통신 connetc()->accept()가 수립되면, InputStream과 OutputStream을 얻을 수 있다. InputStream is=socket.getInputStrea(); OutputStream os=socket.getOutputStrea(); 전송 String data="스트링"; byte[] byteArr=data.getBytes("UTF-8"); os.write(byteArr); os.flush(); 수신 byte[] byteArr=new byte[100]; int readByteCount=is.read(byteArr); String data = new String(byteArr, 0, readByteCount, "UTF-8"); 스레드 병렬 처리 서버에서 accept(), connect(), read(), write()는 별도의 작업 스레드를 생성해서 병렬로 처리하면 여러 클라이언트와 작업이 가능하다. UDP 네트워킹 User Datagram Protocol은 비연결 지향적 프로토콜. 연결절차를 생략하기 때문에 안정성은 TCP보다 떨어지지만 빠른전송이 가능하다. java.net.DatagramSocket 과 java.net.DatagramPacket클래스를 이용해서 UDP네트워킹이 가능 하다.
  • 51. 5 I/O Package 20) 네트워크(5) 발신자 구현 DatagramSocket sgS=new DatagramSocket(); //객체생성 byte[] byteArr=data.getBytes("UTF-8");//인코딩 DatagramPacket packet=new datagramPacket(byteArr, byteArr.length, new InetSocketAd dress("localhost", 5001) );//소켓생성 dgS.send(packet);//전송 dgs.close();//소켓종료 수신자 구현 수신자는 데이터그램소켓 객체를 바인딩할 포트와 번호를 지정하고 생성. DatagramSocket dgS=new DatagramSocket(5001);//소켓생성 후 대기 dgs.receive(dgP);//블로킹 된 후 패킷을 받으면 패킷을 DataGramPacket에 저장 //패킷내용을 저장할 패킷 생성 DatagramPacket dgP = new DatagramPacket(new byte[100], 100); //receive()메소드로 패킷을읽고, getData()메소드로 저장된 바이트 배열 획득. //getLength()로 읽은 바이트 수 획득. //인코딩 문자열을 디코딩해서 문자열 획득. String data = new String(packet.getData(), 0, packet.getLength(), "UTF-8"); SocketAddress sA = packet.getSocketAddress();//IP와 포트를 획득 dgS.close();//스레드 작업 종료시 close()호출로 블로킹상태에서 스레드 종료.
  • 52. Java 1~4 가 모두 종료되었습니다. 감사합니다!