java 에서는 입출력 을 할때 대부분 Scanner 를 사용하여 입출력을 많이 사용합니다. 

scanner 를 사용하여 int 값과 String 값을 혼용하여 받는 일이 자주 있는데 

nextInt() 후 nextLine() 함수를 호출할 경우 nextLine()함수가 아무것도 입력이 안된 상태로 함수를 끝내는 경우가 있습니다. 

어떻게 고쳐야 할까요?



출처


http://blog.naver.com/grand425/220321547208

'코딩 > Java 프로그래밍' 카테고리의 다른 글

OOP 용어 정리  (0) 2016.12.14
자바 Collections 클래스 Comparator  (0) 2016.11.26
자바 상속, 인터페이스에 의한 다형성  (0) 2016.10.18
자바의 4대 특성  (2) 2016.10.17

TCP/IP 네트워크 프로그래밍 공부를 하면서 나름 정리한 개념인데

만들어보면서도 알 것 같으면서도 어려운 개념인것 같다. 저기 어디에 메모 짱박아두다가 이제 정리 해 본다.


많은 사람들이 블록킹과 동기식을, 논블로킹과 비동기를 같은 용어로 생각하는데 엄연히 다른용어다.


우선 bloking I/O(블록킹), Non-blocking I/O(논블록킹)는 소켓의 동작방식을 나타내는 말이고,

그리고 Syncronous(동기), Asyncronous(비동기)는 서비스나 함수의 동작방식을 나타내는 말이다.



● Blocking I/O


블로킹 입출력 방식은 요청한 작업이 완료되지 않으면 응답을 돌려주지 않는다.

버퍼가 비어있을 경우, 입력이 들어올 때 까지 대기하며 그 동안 다른작업을 할 수 없다.

그러므로 자원의 낭비가 발생하게 된다.


blocking i/o와 달리 nio방식은 다수의 클라이언트의 요청을 처리할 수 있는데,

blocking i/o 에서는 스레드를 사용하여 해결할 수 있다.


하지만 과도한 요청수 만큼 발생한 스레드(멀티쓰레드)는 OOM(Out Of Memory)를 발생 시킬 수 있다.

이를 방지하고자 스레드를 사용하고 반납하는 형식으로 스레드의 개수를 제한하는 스레드풀을 사용한다.


스레드풀의 크기를 정하는 것에는 두가지 관점에서 생각할 필요가 있다고 한다.


첫 번째는 스레드의 개수는 힙에 할당된 메모리의 크기에 의존하는데

클 수록 관리해야 할 스레드 개수가 늘어나므로 가비지 컬렉션의 수행속도가 감소한다.


두 번째는 많은 스레드가 Context Switching(CPU를 점유하기 위한 상태변경)을 하면서

엄청난 오버헤드를 발생시킨다. 이는 cpu 성능저하의 원인이 된다. 


쓰지 말라는 것이 아니고 용도에 맞게 적절하게 사용하는 것이 맞다.

하지만 멀티스레드를 사용하는 병렬처리는 공유자원에 대한 dead lock의 위험 때문에 프로그래밍 하는것이 쉽지 않다.



● Non-Blocking I/O (NIO)


논블로킹은 셀렉터(selector)나 폴(poll)에 여러 소켓을 바인딩 시킨 후

하나의 채널(싱글스레드)에서 관리하는 방식이다. 멀티플렉서에 비유한 것을 본 것 같기도하다.


셀렉터는 주기적으로 채널에 데이터가 들어왔는지 확인하는데

버퍼가 비어있을 경우 즉각 return 시키고 다음 요청을 받을 수 있기 때문에

멀티스레드에 비해 오버헤드가 적다.




● Syncronous (동기)


"동기" 라는 용어는 기본적으로 둘 사이의 싱크를 맞춘다는 말이다.

행위나 목적이 같은것을 시작과 끝을 맞추어 동시에 이루어 지는 방식이다.


● Asyncronous (비동기)


비동기는 요청이 들어와도 꿋꿋이 내가 하던 일을 한다. 들어온 요청은 맡겨버리고 "그 일 다끝나면 알려줘~" 하는 것이다.

그러므로 비동기는 수행되는 순서 및 시작과 끝을 알 수 없다.

동작방식은 메인스레드에서는 내가 하던일을 함과 동시에 요청받은 작업이 별도의 스레드에서 진행되는 거다.

작업이 끝나면 "다 끝났어 가져가" 하며 콜백으로 알려준다. 이러한 방식에는 델리게이트, 퓨처, 프로미스, 콜백 등이 있다. 



동기와 비동기의 간단한 예제를 살펴보자.


1. 싱글스레드 + 동기식


스레드에서 순서대로 요청받은 작업을 처리한다.

하지만 앞의 작업이 모두 끝날 때 까지 뒤의 작업은 무한대기다.



2. 멀티스레드 + 동기식


각각의 스레드에서 요청을 1:1로 맡아 작업을 처리한다.



3. 싱글스레드 + 비동기식


일단 모든 요청을 결과에 상관없이 반환한다.

그리고 작업이 끝남과 동시에 결과를 알려준다.



4. 멀티스레드 + 비동기식


모든 요청을 여러 스레드가 나누어 결과에 상관없이 반환한다.

그리고 작업이 끝남과 동시에 결과를 알려준다.

가장 빠른 속도가 예상되며 2번과 3번을 섞은 느낌이다.




아래는 동기와 비동기 방식의 간단한 예제다 (출처 : http://malchooni.name/)


동기방식은 A노드와 B노드사이의 작업 처리 단위(transaction)를 동시에 맞추겠다는 뜻이다.
얄순이에게 보내는 말춘이의 오천원‘ 예를 보자.

ex1

  1. 말춘계좌는 오천원을 뺄 생각을 하고 있다.
  2. 말춘계좌는 얄순계좌에게 오천원을 전송한다.
  3. 얄순계좌는 오천원이 수신되었단 걸 인지 하고 말춘계좌에게 ‘받았음’을 전송한다.
  4. 이로써 말춘계좌는 -5000원을 하고 얄순계좌는 +5000원을 한다.

이 예제에서 눈여겨 볼 부분은 마지막이다. 말춘계좌와 얄순계좌는 서로의 요청과 응답을 확인한 후 같은 일을 동시에 진행했다.
‘계좌이체’라는 작업단위는 위의 그림처럼 동기화를 해야한다. 그래야지 한쪽이 보냈는데 못받았거나, 안보냈는데 받은 상황이 없을 것이다.

비동기방식은 이와 반대로 노드사이의 작업 처리 단위를 동시에 맞추지 않아도 된다는 것이다.
말춘학생의 시험지는 얄순선생이 채점한다‘ 예를 보자.

ex2

  1. 말춘학생은 시험지를 열심히 푼다.
  2. 시험지에 답안 작성을 완료한 말춘학생은 시험지를 얄순선생에게 전송한다.
  3. 얄순선생은 말춘학생의 시험지를 채점한다.
  4. 채점이 다 된 말춘학생의 시험지를 다시 전송한다.
  5. 말춘학생은 얄순선생이 채점한 시험지를 받아 본다.

말춘학생과 얄순선생은 시험지라는 연결고리가 있지만 시험지에 행하는 행위(목적?)은 서로 다르다. 한사람은 시험지를 푸는 역할을 또 한 사람은 그 시험지를 채점하는 역할을 한 것이다. 그래서 둘의 작업 처리 시각을 따지자면 일치하지 않는다. 일치하지 않아도 된다.

여기서 블록과 논블록의 차이를 간략히 설명해 보겠다. 말춘학생이 시험지를 얄순선생에게 건낸 후 얄순선생의 얼굴만 바라보며 채점 된 시험지를 받기 기다린다면 말춘학생은 블록 상태인 것이다. 하지만 말춘학생이 시험지를 건낸 후 채점이 완료 됐다는 이벤트를 받기 전까지 춤을 춘다거나 클래시오브클랜을 한다던가 다른 일을 하게 된다면 말춘학생의 상태는 논블록 상태인 것이다.
동기와 비동기, 블록과 논블록은 헷갈리기 쉬운 개념이다.

자바네트워크 프로그래밍 블록과 논블록 *

마지막으로 정리를 하자면 동기와 비동기는 어떤 작업 혹은 그와 연관된 작업을 처리하고자 하는 시각의 차이이다. 동기는 추구하는 같은 행위(목적)가 동시에 이루어지며, 비동기는 추구하는 행위(목적)가 다를 수도, 동시에 이루어지지도 않는다. 


'전공과목 > Network' 카테고리의 다른 글

OSI 7 Layer [OSI 7 계층]  (0) 2016.10.18
[네트워크] 빅엔디안 리틀엔디안  (1) 2016.10.12

정규화란


데이터 중복을 최소화, 데이터 안정성 확보, 데이터 일관성 유지를 위해

자료의 손실이나 불필요한 정보의 도입없이, 하나의 테이블을 둘 이상으로 분리하는 작업



● 목적


자료 저장에 필요한 저장공간 최소화

자료의 삽입, 갱신, 삭제에 따른 이상현상 제거

자료구조의 안정성 최대화



● 슈퍼키


그 자체로만으로 고유식별자가 되는 것

슈퍼키에 뭘 갖다 붙여도 슈퍼키



● 후보키


슈퍼키의 부분집합으로, 구성 애트리뷰트중 하나라도 제거하면 슈퍼키가 아닌 것

모든 다른 애트리뷰트를 함수적으로 결정하는 애트리뷰트

즉 다른 모든 것을 결정하는 결정자


y가 x에 종속 될 때, x->y 라고 표현

x는 결정자, y는 종속



● 기본키(PK)


여러 후보키 중 대표적인 키 하나가 테이블의 기본키가 된다.




●  제 1정규화(1NF)


테이블은 반드시 하나 이상의 키를 가지고 있어야 하며, 애트리뷰트의 도메인이 오직 원자값만을 포함한다.

반복되는 그룹속성이 존재할 경우, 그 그룹을 분리하여 새로운 엔티티타입을 추가한 후 실체와 1:N관계를 형성해준다.



예제

컴퓨터 학원에서 수강생에 대한 자격증 보유 사항 테이블을 만든다고 가정해보자


[자격증 보유 사항 테이블] 기본키 : 학생번호

학생번호

이름

주소

핸드폰번호

자격증

자격증번호

취득일


제1 정규화를 하지 않고 테이블 사용시 쓸데없는 데이터베이스 공간의 낭비가 발생한다.

또한 주소나 핸드폰번호의 변경이 있을 경우 4개의 레코드를 모두 변경해야 한다.


만약 학생번호 1인 김개똥이라는 친구가 자격증을 4개를 가지고 있다면

김개똥에 대한 정보, 즉 회원번호, 이름, 주소, 핸드폰번호등의 정보가 중복해서 저장되어진다.


학생번호

이름

주소

핸드폰번호

자격증

자격증번호

취득일

1

김개똥

하와이

019-999-999

정보처리

12345

백수

1

김개똥

하와이

019-999-999

워드1급

23456

고2

1

김개똥

하와이

019-999-999

오라클

34512

고2

1

김개똥

하와이

019-999-999

MCSE

12341

고3


 해결 방법 -> 1NF : 반복되는 그룹 속성 분리

 




중복되는 속성을 4 -> 1으로 줄임

 자격증 보유테이블에서 학생번호는 FK이면서 동시에 PK<식별자 관계>




●  제 2정규화(2NF)


기본키 2개 이상으로 구성되는 테이블에서 일부 속성에 대해서만 부분적으로 함수 종속적인 것을 분리

부분함수 종속성을 제거 다시 말해 본키가 하나 인 경우 제 2정규화를 하지 않고 Pass!!

즉, 후보키가 아닌 애트리뷰트들이 후보키(결정자)에 대해 완전종속



예제

컴퓨터 학원에서 수강생에 대한 교육과정별 평가에 대한 테이블 만들었다고 가정해보자

 

 [학생 성적테이블] 기본키 : 학번, 과정코드

학번

과정코드

평가

과정명

기간


제2 정규화를 하지 않고 테이블 사용시 과정명 하나만 수정해도 모두 바꾸어야 주어야 한다.

즉, 중복된다. (1NF와 동일) -> 무결성 유지 힘듬


column명 만을 보면 어찌해야 되는지 알 수 없다. 가볍게 data를 삽입해보자


학번

과정코드

평가

과정명

기간

200

A01

A

JAVA

1개월

200

A02

A

DB

2개월

201

B01

B

ASP

2개월

202

A01

A

JAVA

1개월

203

B01

C

ASP

2개월


- 모든 data는 [학번,과정코드]의 키로 unique 해진다(중복된 data X). 즉 1NF Pass

- 복합키[학번,과정코드]에 ‘평가’는 완전 종속이 된다.

- 복합키 중 하나인 '과정코드'에 ‘과정명’과 ‘기간’이 부분 종속 되어진다.

그림으로 보자면 ↓



※ 해결 방법 -> 2NF : 부분적 종속 제거


부분적 종속을 제거해준다. 즉 과정코드를 기본키로해서 테이블을 분리 해준다.





●  제 3정규화(3NF)


Primary key가 아닌 일반 column으로 종속되어지는 column 분리.

A -> B, B -> C 그러므로 논리적으로 A -> C. 즉, 이행적 종속 관계를 분리한다.

즉, 후보키가 아닌 애트리뷰트들에서 이행종속이 발생하지 않는다.


예제

제 1정규화 할때 쓴 테이블 가져와 보자. 제 1정규화를 하고 기본키가 하나 이기때문에 제 2정규화 과정은 pass

 

[교육과정테이블] 기본키 : 학번(FK)

학번

자격증

자격증번호

1

정보처리

12345

1

워드1

23456

2

정보처리

12345

3

컴활1

87452

4

SCJP

44444


제3 정규화를 하지 않고 테이블 사용시

● 새로운 자격증이 추가 되어 삽입하려고 할때 이 자격증을 취득하고 있는 사람이 존재 하지 않더라도

   가상으로 취득 한 것처럼 해야만 삽입이 가능하다


● 학번이 2인 사람이 학원을 그만 두게 되어 내용을 삭제하려고 할때 유지되어야 할 데이터까지 삭제됨(정보처리 12345)


● 특정 학생이 자격증을 취득하게 되면 그 자격증에 의하여 자격증 번호가 결정됨 (이를 이행적 함수 종속성)

   즉 기본키가 아닌 속성인 자격증에 의해서 자격증번호가 결정되게 되며 학번으로 자격증번호를 검색 할 수 있다.


학번 -> 자격증, 자격증 -> 자격증번호

∴ 학번 -> 자격증번호


그림으로 보자면 ↓




※ 해결 방법 -> 3NF : 이행적 종속 제거



●  보이스코드 정규화 (BCNF)


BCNF는 제3정규형을 만족하지만, 그 반대는 아니다.

x->y 인 모든 x,y 에 대해 모든 결정자는 후보키여야 한다.


ㅡ> Cycle이 발생하면 BCNF 가 아니다. (이행이랑은 다름)

후보키가 아닌 애트리뷰트가 결정자가 되는 경우 BCNF가 아니다.



요약


정규화

무조건 테이블을 나누는 작업이 아니고 각 단계에서 얻고자 하는 바를 알면 쉽게 해결될 수 있다.


제1 정규화 -> 중복되는 data 분리

 - 저장공간을 최소화하기 위해서

 - N:N 관계를 1:N으로 바꾸기 위해서

 - 수정시 모든 레코드의 data 변경


제 2 정규화(복합키 인 경우만 보면 된다.) -> 부분 종속 분리

 - 원하는 바는 제 1정규화와 동일


제 3 정규화 -> 이행적 종속 관계 분리

 - 삽입이상 제거

 - 삭제이상 제거

[출처] DB 정규화|작성자 샌드

[출처] DB 정규화|작성자 샌드

[출처] DB 정규화|작성자 샌드

[출처] DB 정규화|작성자 샌드



● 출처


http://blog.naver.com/PostView.nhn?blogId=force44&logNo=130100972038

+ Recent posts