by givingsheart 2014. 1. 1. 15:52
java.io 관련 이미지



java.io 패키지중 
1.DataInput 인터페이스(몇몇 input 인터페이스의 상위 인터페이스) http://xrath.com/javase/ko/6/docs/ko/api/index.html 

DateInputStream 필터 타입의 인풋 클래스의 경우..
1.추상 클래스인 InputStream 2.필터타입 클래스인 FilterInputStream(생성자가 protected라 거의 추상클래스)을 단계적으로 상속받고 
+ 3.DataInput 인터페이스, CloseAble 인터페이스까지 조립해서 만들어지는 필터타입의 인풋 클래스이다.
  
너무 편리해서 내가 제일 선호하는 ObjectInputStream 필터 타입의 인풋 클래스의 경우..(일반적인 직렬화,프로세스 통신에는
ObjectOutputStream이 좋다)
1.추상 클래스인 InputStream 을 상속받고 위와는 다르게 Filterxxx 는 받을 필요가 없고.. 대신에 
2.DataInput 인터페이스(primitive 인풋을 위해) + OjbectInput 인터페이스(DataInput을 확장해 객체,String,배열등의 인풋을 위해)
+ CloseAble 인터페이스(스트림등 리소스 닫기용) + ObjectStreamConstance 인터페이스(프리미티브를 조립해서 객체 타입을
정의하니까 조립 정보를 직렬화 Serializable (인/아웃풋시 복원을 위한 규칙) 를 지원하기 위한 표시랄까? 말을 해놓고도 애매하네..)
를 조립해서 만들어지는 필터타입의 인풋 클래스이다.

물론 실제 사용시에는 대상 스트림을 열수 있는 "노드 계열"의 인풋 클래스가 필요할테고, 일반적으로 목적이 파일 작업시라면.. 
a. 파일경로+파일이름, 덮어쓸지 여부를 매개변수로 File 객체 생성 (예외처리등 생략)
b. a를 매개변수로 노드계열의 FileInputStream 객체 생성
c. b를 매개변수로 필터계열의 ObjectInputStream 객체 생성
d. objectInputStream의 객체를 가지고 readObject() 를 사용하면 파일에 저장된 객체를 리턴해주고
e. 용건 끝났으니 FileInputStream 해제해서 리소스 풀어주고, 그담엔 ObjectInputStream 해제해서 리소스 풀어주고 (익셉션
   발생시 조심해야 하니까 속 편하게 finally{} 에서 해제) =>필터계열의 스트림 객체만 close() 해주면 된다! 
f. 저 위에서 살펴본 객체를 i/o하기 위한 수많은 고민들을 몰라도 a~e처럼 손쉽게 사용이 가능해서 행복할 따름이고..
(읽기,쓰기 작업시 몇몇 다르게 고려할게 있긴 했지만.. 논외 .. 아 추가적으로 내가 클래스를 정의하고 그것을 파일에 readObject, writeObject 하기 위해선 내 클래스에 implements Serializable하고 sid(클래스의 변경에 따른 버전 관리)인가를 받아야 했다. 꽤 오래돼서 기억이 가물하지만.. 내 클래스를 직렬화 하겠다고 정의하는것)

2.Serializable 인터페이스의 하위 인터페이스들의 면면을 보라! 

java.io 
인터페이스 Serializable

기존의 서브 인터페이스의 일람:
AdapterActivator , Attribute , Attribute , Attributes , BindingIterator , ClientRequestInfo 
ClientRequestInterceptor , Codec , CodecFactory ,Control , Current , Current , Current
 , CustomValue , DataInputStream , DataOutputStream , Descriptor , DHPrivateKey , 
DHPublicKey ,DocAttribute , DomainManager , DSAPrivateKey , DSAPublicKey , DynAny 
DynAnyFactory , DynArray , DynEnum , DynFixed , DynSequenceDynStruct , DynUnion
 , DynValue , DynValueBox , DynValueCommon , ECPrivateKey , ECPublicKey , 
ExtendedRequest ,ExtendedResponse , Externalizable , IdAssignmentPolicy , IDLEntity ,
 IDLType , IdUniquenessPolicy , ImplicitActivationPolicy , Interceptor ,IORInfo ,
IORInterceptor , IORInterceptor_3_0 , IRObject , Key , LifespanPolicy , Name , 
NamingContext , NamingContextExt ,NotificationFilter , ObjectReferenceFactory ,
 ObjectReferenceTemplate , ORBInitializer , ORBInitInfo , PBEKey , POA , POAManager ,
 Policy ,PolicyFactory , PrintJobAttribute , PrintRequestAttribute , PrintServiceAttribute ,
 PrivateKey , PublicKey , QueryExp , RelationType ,RemoteRef , RequestInfo , 
RequestProcessingPolicy , RSAMultiPrimePrivateCrtKey , RSAPrivateCrtKey , 
RSAPrivateKey , RSAPublicKey ,RunTime , SecretKey , ServantActivator , 
ServantLocator , ServantManager , ServantRetentionPolicy , ServerRef , 
ServerRequestInfo ,ServerRequestInterceptor , StreamableValue ,
 SupportedValuesAttribute , ThreadPolicy , UnsolicitedNotification , ValueBase , 
ValueExp

(etc) java.io.StreamTokenizer (한번 사용해볼 기회가 있을라나?)

 


(추가)NIO 패키지는 비동기 IO의 측면에서 굉장히 중요한 개념이다. 출판/구독패턴으로 문제를 해결했으며,
이벤트/콜백(개발자가 아닌, 프레임워크OR 라이브러이가 내 코드를 역제어 개념)에 대한 공부하길 잘했다.


(추가)이 개념이 SPING이란 프레임워크 프로그래밍, AJAX 프로그래밍, 자바스크립트의 이벤트 콜백을 활용
한 함수형 프로그래밍 개념을 이해하는데 작게나마 도움이 되었다. 


********************************************************************************************

 

 


오늘 선생님께 배운게 너무 많긴한데.. 대충 정리해보면(나머진 노트 참조)

1.io관련 클래스들을 볼때 구분 기준(in/out 구분은 너무 직관적이니 논외)

a.바이트 기반(c에서 /rb /wb 옵션으로 1byte단위 초간단하게 바이너리파일) vs 2byte 문자 기반(/rt /wt 옵션 텍스트파일;;) 
=> 메모장으로 열어보면 확실히 이해  (Ex) InputStream(1byte)  vs  Reader(2byte)  ,  OutputStream  vs Writer

b.노드계열(목적 스트림을 열수있는), 필터계열(어떤 방식으로 i/o 할것인가에 대해 추가or확장된 기능)
=> 오늘 요것덕에 데코레이터 패턴에 대한 이해가 한층 업그레이드
(Ex)(파일,메모리,다른 프로세트,네트웍,db등 목적지에 대한) File,Piped,ByteArray기타등등(In/Out)putStream, 

=>지금까지 스트림 객체를 생성할때 단순하게 버퍼드가 좋은거라 본게 있어서.. 멋도 모르고.. 기계적으로 생성해서 
사용했었는데.. 오늘 구분하는 법을 배웠기 때문에 , 다음부턴 내 목적에 맞는 스트림을 생성이 가능할듯 (Happy)

=>왜 노드 스트림 클래스와 보조(필터,데코레이터) 스트림 클래스를 구분한 것인가?  
목적 스트림의 종류 a(파일,네트웍,메모리,db등) * 구체적 처리방식의 종류 b(버퍼드,필터드,프린트,라인넘버 어쩌구..)
a*b 너무 많으니까.. a따로 b따로 만들어서 사용자(우리 개발자=클라이언트)가 알아서 조립해서 사용하라고 데코레이터
패턴을 이용해(개념및 구현 설명 논외) 배포함. 솔직히 모든 구체적 상황별로 클래스를 만들어 놓으면.. 그 클래스들 이름
누가외움?  (자바 api들의 수많은 패키지.. 그안에 들어간 수많은 인터페이스,클래스 조각들.. 기존에 만들어진 인터페이스
와 클래스,상속구조를 이용해 구체화된 수많은 하위 클래스들)

=>툴을 확장성 있게 만들려고 개인적으로 삽질한 설계에 대한 고뇌 + 위의 조립 개념 통해 java가 추구하는 객체 지향을 
조금 더 이해했다고 착각중임 -_-;
 
=> 모든 개념을 담을수 있는 object 타입을 루트클래스로.. 모든 클래스 타입이(예전에 reflect 보면서 놀랬던게.. object란
일반적으로 내가 심지어 class, method등도 object 타입이다. 한마디로 모든 타입과 값을 포함할수 있기에 타입 제너릭
(다형성) + value 제너릭 하다.
 
is a, has a 구성과 상속, 설계와 구현의 분리(interface , abstract class) 를 이용한 각종 디자인 패턴들.. 결국 확장과
유연성및 변경에 따른 노가다 방지를 위해 선배 개발자들이 피땀흘려 고민한 산물이 oop로 자바에 멋지게 구현되어 있다;;

=>아참.. java.io , java.net , java.sql ... 내가 웹작업 하면서 찾아보던 패키지인데.. (그제~오늘은 xml관련 꽂혔지만)
선생님 말씀으론 결국 목적지와 스트림의 형태가 약간 다를뿐 입/출력이라는 커다란 틀에서 유사점(1.스트림 연다
2.스트림으로 작업한다. 3.스트림 종료한다.  네트웍이라면 bind해서 소켓 만들고 connect로 연결요청 -> accept으로
동의 -> 하면 create로 소켓간에 스트림 열어주고?? 맞나?? -> 이런 저런 통신 주고 받다가.. -> 연결 끊고 byebye.. 
간단하게 java.net의 소켓 클래스도 InputStream getInputStream()과 OutputStream getOutputStream()을 제공해 준다;;)
(디비도 연결할 db종류 선택, 스트림 연결(Connection인가 먼가), 쿼리 쏘고 리절트셋 받고.. 웹서버도..)
(etc)모든 스트림은 기본적으로 byte인데.. text(2byte)단위로 i/o는 결국 내부적으로 encode(),decode() 해준다는 의미임..
(etc2) String형 "199"를  byte로 저장하면 (4bit 0x00  4bit  0xc7) (ancii?)  => 상위 비트에는 값이 안들어간다. 그럼으로 EOF -1
이 가능하다.   text(2byte)로 저장하면 (4bit- 0x00 4bit- 0x31 4bit - 0x39 4bit - 0x39임)

=>추가로 생각해볼점! net패키지의 소켓클래스던.. InputStream 타입으로 스트림을 리턴한다. 즉 1byte단위인 것이다.
(이런 객체들이 많다고 말씀해주심)그럼으로 InputStreamReader 라는 byte->text 로 변화해 처리해주는 클래스가 중요한 것이다. 

각설하고;;;

2.실제 잘 쓰이는 조합은

일반적인 인풋시 BufferdReader(InputStreamReader or FileReader)를 사용
 => InputStreamReader 가 존재하기에 상황따라 1(바이트기반)->2byte(문자기반)으로 변화가 가능하고.. 파일 작업도 가능하고

거의 대부분의 경우의 아웃풋시 PrintWriter(노드&필터형&1-2byte혼용&다양한데이터타입으로 만능 출력객체)

=>BufferedReader 가 엔터 데이터를 스킵하는 문제 때문에 그것을 해결하기 위해 PrintWriter 클래스의 println() 자동개행
   을 사용하고.. 그럼으로 일반적인 입력시엔 BufferedReader  , 출력시엔 PrintWriter 를 사용하는 페어가 되는 것이다.

3.버퍼드 필터 방식으로 i/o를 할때 버퍼 방식의 동작을 기억해야함.. (모았다가 쏜다.. 안모이면 안쏜다) 
리더가 리턴값으로 읽은 사이즈를 넘겨주는 것을 인식을 해야함! (1000을 달라했는데 현재 800 넘겨주고 .. 200은 아직 버퍼링
중..) 그럼으로 flush() 역할이 중요, 글고 내가 읽어 오려는 파일의 크기가 내가 담으려는 메모리 공간보다 클때.. 주의 해야함
(덮어쓰기 됨) , 버퍼드 방식으로 데이터를 읽어와서 버퍼드 방식으로 써줄경우! 읽은 사이즈 size = read() 만큼 write(buf, size)
해준다!
=>이걸 기억해야 하는게.. 앞으로 자주쓰게될 PrintWriter도 버퍼드 출력 방식임!
=>BufferedReader 클래스는 readLine() 메서드를 사용하기 위해서 사용하는 것이다. 이것은 '\n' '\r' 등 엔터를 뜻하는
   값을 만날때까지 읽어낸다. 포인트는 "엔터를 의미하는 데이터를 스킵한다는 것이다." (참고:BufferedWriter 클래스의 newLine()
   메서드가 알아서 "엔터"를 넣어준다.)   PrintWriter가 println()를 통해 개행을 자동 제공함으로 이 문제가 해결된다!!!

4.위에서 거론했지만.. 스트림을 열었을때는 잘 닫아둬야하고 .. 예외발생시 코드의 수행을 기억해야함 (finally{})
=>필터 스트림으로 노드 스트림을 감쌌을때 필터,노드 스트림 각각을 close() 해주어야 하는가?
   =>선생님 말씀으론 필터 스트림 객체의 close()를 호출하면 필터가 알아서 자기 남은 일 정리하고 노드 스트림의
      close() 호출한다고 말씀하심. (데코레이터의 묘미)   그럼으로 필터 스트림 객체만 close() 할것!

=>예외 발생시 필터스트림의 close()를 명시적으로 호출해 줘야하는 경우는 버퍼드 필터스트림을 사용할 경우..
    실제로 print() 작업을 해줘도 실제로 파일에 기록을 하지 않고 내부의 버퍼에 담아둔다. 이것을 최종적으로
    타겟 소스로 보내는 작업은 flush()가 담당한다. 그럼으로 close() 또는 flush()를 사용해야 한다. (외부 i/o 접근은
    너무 느리고, 위험성이 있기에 최소화 한다.)  (cf) 채팅 프로그램의 경우엔 버퍼드필터스트림의 생성자에 
    boolean autoFlush 를 true로 한다)

5.중요한건 아닌것 같은데.. mark(),reset()을 배웠는데.. 이게 멀티스레드 작업중에 필요한 건지.. or 예를 들어 게임 
맵스테이지 데이터를 읽어올때 1스테이지만 읽어오고 2스테이지는 나중에 읽어오려 할때 필요한건지.. 감이 안잡힘..
(예전에는 맵 전환 시점(웨이포인트등)에 이르러야 로딩을 했지만.. 물론 용량이 커서.. 시간이 걸리니까 멀티스레드로
동영상등 틀어주면서 -_-)

6. 아참.. 문자열로 디렉토리 경로 설정시 \가 아니라 \\ 해주는것은 escape문자와 구분을 위해서! (\ 한개 쓰고 울지말자)
=>예전에 정규식 공부할때도 체크했던것 같은데.. 아 정규식 표현 기억에서 날아감;;

7. 절대 경로와 상대경로도 배웠음. good! 
.\ 현재 디렉토리  .. 상위 디렉토리로 이동  \ 해당 디렉토리로 진입

=>추후 웹플밍에서도 디렉토리 이동해야 함으로 (jsp,이미지등 디렉토리일까?) 중요하다고 하심!


8.내경우 툴 프로젝트에서 xml파일 형식으로 데이터를 load,write 하는 작업을 했었는데.. java.dom2어쩌구의 
Document,Element 클래스를 활용해서 작업했었는데.. 아래를 보면.. XMLEncoder ,decoder 가 있다.. 나는 이걸 
활용해야 했었다. OTL  <-- 제일 하단에 실제 사용 소스코드 첨부! (불펌죄송)
(XMLEncoder , XMLDecoder 를 사용해서 데이터를 문서로 구성할 경우, 실제 다른 시스템과 주고 받기는 무리가
있다. 객체의 상태를 기록하고 빼오는데 사용할 수준이다.)
 
시간 낭비하지 말고 이미 잘 만들어진 API를 사용할것!@@@@@ 툴의 확장성에 대한 설계적 고민 ㅂㅂ2

public class XMLEncoder  extends Encoder{}
명세:XMLEncoder 클래스는 ObjectOutputStream 의 보완적인 대체 클래스이며,
ObjectOutputStream으로 객체의 바이너리 표현을 생성해서 JavaBean의 텍스트
표현을 생성한다. 아래의 코드를 보면 JavaBean의 그 모든 프로퍼티의 텍스트
표현을 생성할 수 있다.

(ex) XMLEncoder e = new XMLEncoder(new BufferdOutputStream (new FileOutputStream("text.xml") ) )
                          e.writeObject(new JButton("Hello World"));
                          e.close();

XMLEncoder 클래스는,JavaBean 를, XML 스펙 버젼 1.0 으로 Unicode/ISO 10646 캐릭터 세트의 UTF-8 캐릭터 세트에 준거한 XML 문서로서 표현하는 디폴트의 지정을 제공합니다. 



아래는 뭐였드라;; 
 
파일 시스템 관련

ps. 글쓰다가 세션 만료되었음.. 나는 이제 세션의 의미와 왜 세션을 종료 시켰고 내가 쓰던 글을 임시 저장해뒀는지를 
알게 되었음. jsp 책에 감사. 입출력으로도 벅찬데.. 이것 저것 챙겨보다.. 멘붕왔다. OTL

java.beans.XMLDecoder와 java.beans.XMLEncoder를 이용한 Java객체의 xml 변환

by givingsheart 2014. 1. 1. 15:51

혼자서 비트단위로 메모리 표시해가며 고민해봤는데..

(ex) 4byte짜리 int -1 의 경우 비트 표시    11111111  11111111  11111111  11111111
즉 1byte 단위로 끊어와도  11111111  <- 제일 첫비트에 1이 표시되어 음수 표현이 가능

여기서 잘못생각한게.. byte    vs  char 타입의 차이아닌가? <-- 바보?

while(!EOF) 이 의미는 while표현식 안의 값이 true , false를 정해주는건데..  !-1 ? -> 비트 전부 반전되니까 000000 이 됨으로 
0의 불린 표현은 false가 되어서..? 에구 헷갈린다..

byte = 0~255  = 256개  <---  byte도 -128~127 이닷!!!
char = 2의 8승 256개 중에 -128~0~127 = 256개 (논리상 중간에 -0 +0 이 있는데 이중 +0을 표시하는 비트로 0를 표현하고 -0은 
음수 표현에 사용)

잘못 접근한듯... 흠.. 쓸데없는데 시간낭비 그만!

(4byte 짜리를 1byte 단위로 쓴다는 것, 1byte 단위로 읽어 온다는 것 즉 상위 3byte는 0값으로 채운다는 의미.
텍스트 방식인 2byte 단위로 쓴다는 것, 2byte 단위로 읽어온다는 것 역시 상위 2byte는 0값으로 채운다는 의미.
그럼으로 -1인  11111111 11111111 11111111 11111111 될리가 없다.)


엉뚱한 고찰인듯하다.. 

by givingsheart 2014. 1. 1. 15:47

put이라는 메서드의 도큐먼트 설명을 제대로 보지 않고,


단순하게 map이 중복을 허용하지 않기 때문에 put해도 중복된 키는 덮어쓰지 않고
튕겨 낼것이라 판단했다.

그리하여 map에 객체를 넣는데 있어..
isContainsKey() 메서드를 사용하지 않고 바로 put을 사용했다.

지금 확인해본 결과 put 메서드는 중복된 키값이 존재하면 덮어쓰고, 기존 키,오브젝트를
반환한다는 것을 알게 되었다. (나는 set의 add()처럼 저장을 거부할줄로만 알았다)

map자료구조에 add,remove는 있지만, 왜 set(update용 인터페이스)가 존재하지 않는
지를 생각해야한다. 또한 덮어쓰기(update)의 개념이 왜 필요한지도 생각해야한다.
키값은 동일하게 유지하되, 값을 변경하고 싶은 경우가 있을수 있다. (셋은 단일 원소(오브젝트)
의 집합(동일타입) vs 맵은 단일원소의 집합이 아니다.)
 
set에는 add(),remove()가 필요하고, map의 경우엔 put(add() + set()) ,remove가
필요한 것이다. 


똑똑한 개발자 분들이.. MAP, SET 자료 구조를 별도로 구현한 것은, 각각의 역할과 특성이 다르기 때문이다.
SET 은 영어 그대로 집합 = 중복 요소 금지 하는 자료구조이다.
MAP 은 데이터의 보관->검색(활용)시 이점을 두기 위해 KEY,VALUE로 묶은 요소를 KEY의 중복없이(VALUE중복 가능)
관리하는 자료구조이다.

배열도, 연결 리스트도,큐,스택, 트리등등.. 각각의 역할및 장,단점과 사용해야할 곳, 쓰지 말아야 할곳이 존재한다.
(게임 프로그래밍 할때.. 맵을 관리하기 위해 4진 트리 (좌상,좌하,우상,우하)로 맵을 잘라서, 그것을 프랙탈 처럼 반복하는 구조를 사용했었다. 상기하자.. 자료구조를 사용하면, 특정 문제를 쉽게 관리할 수 있다.)

=> 자만하지 말것. 어설프게 알지 말것! api 도큐먼트 보고 메서드의 동작을 확실하게 
확인후 사용할것!


by givingsheart 2014. 1. 1. 15:45

개략적인 이해만 하고 바로 실전 적용. (공부는 목적이 아닌, 수단!)

 

http://blog.naver.com/PostView.nhn?blogId=ljapc&logNo=30038952543&parentCategoryNo=7&viewDate=&currentPage=1&listtype=0



내툴에서 데이터들을 xml 파일 형식을 이용해 관리하려던 고민중에.. 내 툴의 추후 확장성을 고민해 클래스 모델을

설계하던중.. javax.xml.parser 패키지를 살피던중 validationProvider 인가 클래스의 명세를 보니 SAX를 지원하기 위한

클래스란 설명에 simple app for xml 를 검색중, sax과 약간 구분되는 개념인 dom에 접근하게 되었다.  


그리하여 xml DOM(document ojbect model) 이라는 개념을 접하게 되었다.



기존에 내 툴의 경우 확장성을 위해 상속 +  (타입 구분 + 리스트 구조)로서 구현하려 했었고

class DataType (RootElement로 Element 타입을 상속 or 포함 중 포함하려 했다.) 

{

I/O 클래스

Draw 클래스

Parser 클래스

}


class ConfigData extends DataType

{

   List<ConfigDataType> childs; 

}


class ImageData extends DataType

  enum Type

  {

  ConfigData,

  ImageData

  }

   List<ImageDataType> childs; 

...


 interface ConfigDataType

{

  enum Type

  {

    DbConfigDataType,

    EtcConfigDataType

  }

}


class DbConfigData implements ConfigDataType

{

  List<DbConfigDataType> childs;

}


class EtcConfigData implements ConfigDataType{}

...


interface DbConfigDataType

{

  enum Type

  {

    ConnectionConfigData,

    QueryConfigData

  }

}


class DbConnectConfigData implements DbConfigDataType()

{

  List<DbConnectConfigDataType> childs;

}


class DbQueryConfigData implements DbConfigDataType()

{

   List<DbQueryConfigDataType> childs;

}


class DbConnectConfigDataType   

{

String[] defaultDataTable = {"oracle","parkTable","park","111111","xxx.xxx.xx:4324"} 

 enum Type

 {

  DbName,

  DbTableName,

  DbLoginId, 

  DbLoginPw,

  DbUrl

  }

}


class DbQueryConfigDataType 

{

   String[] defaultDataTable = {"INSERT INTO tableName VALUES(?,?,? attribute갯수)","SELECT *     

                                          FROM tableName WHERE id(특정속성)", "xxx", "xxxx"} 

 enum Type

 {

  DbInsert,

  Dbselect,

  ...l

  }

}



//위와 같은 처리가 내 문제였다. key에 value를 매핑하는 여러 자료구조(property,xml의 elements,map 등등)

//에 대한 이해가 없었기에.. 또한 쿼리문 같은 경우 조각 조각 분리해두고 입력 값에 따라 새롭게 조합을 해줘야 할것이다.




xml DOM의 경우 상속 + 트리(노드자료형) 구조로서 설계 되었다.


타입구분 + 리스트를 단순화 하면 트리 자료구조란걸 떠올리지 못했었다. 


http://translate.google.co.kr/translate?

hl=ko&sl=en&u=http://www.w3schools.com/dom/&prev=/search%3Fq%3Ddocument%2Bobject%2Bmodel%26newwindow%3D1%26espv%3D210%26es_sm%3D93




웹 문서 카테고리


1.css 


2.html , html5 , xml(dom+xslt)


3.java script


4.j query


5.asp(sql+aod), php(sql), jsp(servlet)


아래 사이트의 하단에 카테고리 구분되어 있음(약 한달후쯤 진행? 우선순위 wepService(jsp->servelt->db)->??)

http://translate.google.co.kr/translate?hl=ko&sl=en&u=http://www.w3schools.com/dom/&prev=/search%3Fq%3Ddocument%2Bobject%2Bmodel%26newwindow%3D1%26espv%3D210%26es_sm%3D93

by givingsheart 2014. 1. 1. 15:44

import org.jdom2.Document;

 

푸하하하하하하하하하하하하하ㅏ하하하하하하하하하하하ㅏ하

(완전 하드코딩, 막코딩 였지만.. 대만족 OTL)

 

 

xml파일 로딩을 위해선

javax.xml.parsers 를 연구해야 한다..

 

class documentBuilderFactory

class documentBuilder

class saxParserFactory

class saxParser

... 이것만 파면 가져올수 있다 gogo!!

 

그리고 막코딩한 툴의 설계를 변경할 필요가 있다.

특히 1.테이블 이름 입력 받아서 문자열 파싱 처리

2.쿼리를 체크박스 선택 외에도 텍스트 필드를 통해 입력할수 있게끔 처리(or 체크박스를 선택하면 자동으로 텍스트필드에

쿼리 구문 띄우기)

3.막코딩 전에한 설계대로 툴(프레임) + dbCon정보 입력용(Panel) + dbQuery 정보 입력용(Panel) + load/save 버튼용(Panel)

 =>3번은 툴app의 생성자가 현재 아주 더럽기 때문이고(그냥 메서드로 뺄까;;), 레이 아웃 매니저가 정말 짜증이 나기 때문이다.

(현재는 GridLayout을 사용중이고.. Flow,xxxBag,기타 등등 써봤지만.. 적응이 안된다. java.swing 으로 만들어볼까?

 


내가 하고 싶었던 것은.. 쉬운 쿼리를 만들고, 해당 쿼리들을 관리하기 쉽게 XML등으로 표현해주면.. 다른 사람들이 쓰고

관리하기 쉬울듯 하기 때문이었다. 나는 바른 방향으로 진행하고 있나? AWT 패키지로.. GUI를 구현중인데.. SWING 공부는?

by givingsheart 2014. 1. 1. 15:44

애초엔 구현만 시키자고 만들다가..(svn으로 프로젝트 생성도 안함) 

 

기왕 만들거 내가 공부한것들 적용시켜보자는 욕심에

 

계속 만들고 부수고 하면서 설계를 계속 바꾸다가.. 버전 관리가 안됐다.

 

내 생각의 변화, 고민들.. (enumerte 역시 처음엔 c/c++ 처럼 접근을 했는데.. 실제 사용하다

보니까 클래스 였다) 

(ex) ConfigData.DB_INFO_INDEX.DB_LOGIN_ID.ordinal();   <--요렇게 사용했었음;;

 

계속 같은 소스 파일에서 뒤집어 엎어버리다 보니까 ... 분실했다 ㅠㅠ

 

=>배운점: 간단한 프로그램이라도 svn을 통해 버전 관리를 할것!!!!



(추가)

현재 svn -> 내 로컬에 저장소 만들고 (visual 어쩌고) -> 이클립스에서 커밋,체크아웃 하고있다. 요거.. 익숙해 져야 한다.


(추가)

git를 공부했다. 연동이 안된다. gitHub .. 클라우드상 저장소로.. 요걸 사용하면 좋을듯 하다.

by givingsheart 2014. 1. 1. 15:43

로또 번호(중복 되지 않는 6개짜리 숫자열)

 

예전에 중복 체크할땐

 

for(int i = 0; i<arr.length; i++)

{

    for(int j = i+1; j<arr.length; j++)

    {

        if(arr[i] == arr[j])

            isDuplicate = true;

     }

}

요런 식으로 접근했는데..

 

이걸 풀어서 (배열 이름과 연산자 우선순위는 생략)

if( ([0] != [1] && [0] != [2] && [0] != [3] && [0] != [4] && [0] != [5] ) &&

    ([1] != [2] && [1] != [3] && [1] != [4] && [1] != [5])                     &&

    ([2] != [3] && [2] != [4] && [2] != [5])                                        &&

    ([3] != [4] && [3] != [5])                                                            &&

    ([4] != [5]) )

  {

     isDuplicate = false;

  }

 

요런식으로 하면.. 과연 누가 더 빠를까?? (컴파일러가 첫번째걸 어떻게 최적화 시킬지 궁금)

테스트 GoGo!

 

*****************테스트 결과*******************

(처음엔 milisecond으로 받아봤는데 둘다 0이라서 nanosecon으로 변경 = 백만분의 1초가 단위)

 

첫번째 로직 경과시간:45450
두번째 로직 경과시간:2932

=>결론: 배열 첨자 연산은 cpu레지스터에 올라가 저장되고 다른 연산 없이 비교 연산만 반복해주면

           됨으로 엄청 빠르다??   근데 저따위로 풀어쓰면 ㅠㅠ

 

그만 놀고 공부;;;

 

public class main
{

 public static void main(String[] args)
 {
  // TODO Auto-generated method stub
  int[] n = {0,1,2,3,4,5};
  
  //시간 테스트
  A(n);
  
  B(n);
 }

 public static void A(int[] n)
 {
  //시작 시간
  long st = System.nanoTime();
  
  for(int i=0; i< n.length; i++)
  {
   for(int j=i+1; j<n.length; j++)
   {
    if(n[i] == n[j])
    {
     int a = 1;
    }
   }
  }
  
  System.out.println("경과시간:" + (System.nanoTime() - st));
 }
 
 public static void B(int[] n)
 {
  long st = System.nanoTime();

  if( ((n[0] != n[1]) && (n[0] != n[2]) &&(n[0] != n[3]) &&(n[0] != n[4]) && (n[0] != n[5])) && 
   ((n[1] != n[2]) && (n[1] != n[3]) && (n[1] != n[4]) && (n[1] != n[5])) &&
   ((n[2] != n[3]) && (n[2] != n[4]) && (n[2] != n[5])) &&
   ((n[3] != n[4]) && (n[3] != n[5])) && 
   ((n[4] != n[5]))
   )
  {
   int a = 1;
  }
   
  System.out.println("경과시간:" + (System.nanoTime() - st));
 }
}

 

by givingsheart 2014. 1. 1. 15:42

내 툴의 구성은

1.Db커넥션 정보 입력

2.Db 사용 쿼리 선택

 

을 입력받아서 1의 정보 문자열 , 2의 선택정보를 static 쿼리 문자열 테이블에서 꺼내와서 두개를 txt나 xml로

만들어 주는 것이었다.

 

문제점이

a.DbConfigInfo 클래스는  b.DbConnectionInfo클래스 , c.DbQueryInfo클래스를 포함 시키는 Composition 관계로서

 

내 경우에 b,c의 멤버 필드로 String[] 와 enum InfoIndex{DBCON_DRIVER,DBCON_URL,DBCON_LOGIN_ID,...}

처럼 구성했었다. (추후에 조금 더 발전 시킨게.. ArrayList<String> 이엇음;;;)

 

map 자료구조를 나는 까먹었던 것이다!!!! bean 코드를 보면서 property(name , value) 를 그토록 봤었고.. 게다가

예전에 System.property를 전부 출력해봤는데.. 나는 property 데이터 타입의 유용성및 확장성에 대해 깊이있게

생각을 안했었다. (데이터와 코드를 분리한다!, 추가 기능의 탑재를 손쉽게 한다!)

 

유용한 데이터 타입을 팽개치고 string[] 과 인덱스 테이블을 사용하려하고 그땜에 기술적인 문제로 고민하다니;;

 

 

현재 property , xml에 관해서 정보를 찾아보다 spring 프레임 워크에서 저렇게 외부 데이터를 사용한다는

사실을 뒤늦게 깨닫고.. 조금 더 파고 들다가

 

java.sql.DriverManager

java.sql.Driver

java.sql.PreparedStatement (jsp 교재에서 접근하게된 데이터 타입으로 sql 쿼리 수행과 결과 얻기를 상당히 편하게 해준다)

java.util.properties

java.util.ServiceLoader를 파고 들게 되었다.

 

java.net 패키지도 훑어볼것!! (java.net.URL 클래스의 역할과 의미)

 

private static ServiceLoader<CodecSet> codecSetLoader = ServeiceLoader.load(CodecSet.class)

 

CodecSet.class 어디서 많이 본 문법(reflection) 아닌가? 내가 정의한 서비스(클래스묶음)를 저장해뒀다가 불러오는것

아닌가.. 조금 더 파야할듯 한다.  

 

추가로 annotation 또한 빨리 익혀야한다.

 

http://blog.naver.com/dalbong97?Redirect=Log&logNo=130164171144

 

 

********************************************

property의 경운 string string 으로 key, value를 저장하는 형식이고

map의 경운 string Object(모든 클래스 정보) 식으로 key, value를 저장하는 느낌같다. 아직 명확친 않다.

(빈객체를 xml을 이용해 세팅및 생성한다라..)

 

http://blog.naver.com/agapeuni?Redirect=Log&logNo=60090465973 완전히 이해할것!!!!!!!

 

java.net.URL 클래스의 유용성

http://cafe.daum.net/fordeveloper2/DMsp/59?q=java.net.URL&re=1

 

(ex)

 

---------------  
예제1  
---------------  
import java.io.*;  
import java.net.*;  

class URLInfoTest{  
public static void main(String[] args) throws Exception {  
try{  
//URL aURL = new URL("http://www.oraclejava.co.kr");  
URL aURL = new URL("http", "www.oraclejava.co.kr", 80 , "/index.jsp");  
System.out.println("protocol name:" + aURL.getProtocol());  
System.out.println("host name:" + aURL.getHost());  
System.out.println("file name:" + aURL.getFile());  
//생성자에서 port가 set되는 경우에 표시, 아니면 -1  
System.out.println("port name:" + aURL.getPort());  
//HTML 문서 내부의 위치를 지정하는 <a name="..."> 태그의 값을 구한다.  
System.out.println("ref : "+aURL.getRef());  
BufferedReader br  = new BufferedReader(new InputStreamReader(aURL.openStream()));  <- 주목할것!

 

/*

고민을 해보자. 어째서 BufferedReader가 생성자의 매개변수로 InputStreamReader를 받을 수 있는지를!

BufferedReader, InputStreamReader는 java.io.Reader 의 파생 클래스이다.

 

BufferedReader, InputStreamReader 둘다 java.io.Reader 타입의 in 이란 멤버 필드를 갖고 있다. 생성자에서 받게 되는

매개변수의 타입이 java.io.Reader 타입이다.

 

그럼으로 다형성을 이용해 Reader형 필드에 InputStreamReader를 보관할 수 있다. 인터페이스 메서드 read,fill 등에선

실제론 in.read() , in.fill() 등으로 연산을 한다.

 

다른 객체의 메서드를 상속 계층 트리의 다형성을 이용해 내가 사용해서 내 연산을 확장한다!  이것이 데코레이터 패턴이다.

 

URL 객체의 설계역시.. 입,출력 작업을 지원하기 위해 openStream이란 인터페이스를 제공한다. 이것을 자바io의 인풋 스트림 객체가 받고, 또 이것을 입출력 효율을 위해 버퍼드 리더 객체가 받는다..  얼마나 멋진가?

 URL 클래스의 openStream() 메서드이다.

public final InputStream openStream() throws java.io.IOException 
{
<div class="line" style="font:/normal 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; padding-left: 10px; margin-top: -2px; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;">}</div><p> </p><div class="line" style="font:/normal 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; padding-left: 10px; margin-top: -2px; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><pre style="margin: 0px; display: inline;">public URLConnection openConnection() throws java.io.IOException </pre></div><div class="line" style="font:/normal 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; padding-left: 10px; margin-top: -2px; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><pre style="margin: 0px; display: inline;">{</pre></div><div class="line" id="line-969" style="font:/normal 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; padding-left: 10px; margin-top: -2px; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><div class="lnml" id="lnml-969" style="display: inline;"></div><div class="lnmr" id="lnmr-969" style="display: inline;"></div><pre style="margin: 0px; display: inline;"> return .openConnection(this);</pre><div class="lnml" id="lnml-970" style="display: inline;"></div><div class="lnmr" id="lnmr-970" style="display: inline;"></div><pre style="margin: 0px; display: inline;">    </pre></div><div class="line" style="font:/normal 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; padding-left: 10px; margin-top: -2px; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"><pre style="margin: 0px; display: inline;"> }</pre></div><div class="line" style="font:/normal 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; padding-left: 10px; margin-top: -2px; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"> </div><div class="line" style="font:/normal 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; padding-left: 10px; margin-top: -2px; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;">URL 클래스의 멤버 필드</div><div class="line" style="font:/normal 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; padding-left: 10px; margin-top: -2px; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;">transient URLStreamHandler handler;</div><div class="line" style="font:/normal 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; padding-left: 10px; margin-top: -2px; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;"> </div><div class="line" style="font:/normal 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; padding-left: 10px; margin-top: -2px; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;">아래는 URLStreamHandler 클래스가 사용하는 타 패키지의 클래스</div><div class="line" style="font:/normal 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; padding-left: 10px; margin-top: -2px; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;">(In/Out Stream을 주목!)</div><div class="line" style="font:/normal 'Lucida Grande', Tahoma, Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; padding-left: 10px; margin-top: -2px; word-spacing: 0px; white-space: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;">
 package java.net;
 
 import java.io.File;
 
 public abstract class URLStreamHandler 

</div>

*/


String line;  
while((line = br.readLine()) != null) {  
System.out.println(line);  
}  
}  
catch(MalformedURLException e) {  
System.out.println("MalformedURLException : "+e);  
}  
catch(IOException e) {  
System.out.println("IOException :"+ e);  
}  
}  
}  



-----------------  
예제2  
-----------------  
import java.io.*;  
import java.net.*;  

class URLInfoTest2{  
public static void main(String[] args) throws Exception {  
try{  
int ch;  
URL aURL = new URL("http", "www.oraclejava.co.kr", 80 , "/test.html");  
Class[] classes = {Reader.class, InputStream.class};  
Object content = aURL.getContent(classes);  
System.out.println(content + "\n");  
while((ch=((InputStream)content).read()) != -1) {  
               System.out.print((char) ch);  
            }  
System.out.println("--------------------------------");  
InputStream is = aURL.openStream();              
            while((ch=is.read()) != -1) {  
               System.out.print((char) ch);  
            }  
}  
catch(MalformedURLException e) {  
System.out.println("MalformedURLException : "+e);  
}  
catch(IOException e) {  
System.out.println("IOException :"+ e);  
}  
}  
}  


--------------------  
예제3  
--------------------  
import java.io.*;  
import java.net.*;  
public class PageReadTest{  
  public static void main(String[] args) throws Exception   {  
      if(args.length<1)  
        System.out.println("usage: java PageReadTest http://www.oraclejava.co.kr");  
    URL location = new URL(args[0].toString());  
      BufferedReader in = new BufferedReader  
       (new InputStreamReader(location.openStream()));  
String readLine;  
       while ((readLine = in.readLine()) != null)  
    System.out.println(readLine);  
     in.close();  
  }  
}  

by givingsheart 2014. 1. 1. 15:41

새벽에 고민하다가,, 내가 미친짓을 하고 있다는걸 깨닫게 되었다.

 

애초 어제 목표는 DB 커넥션에 필요한 정보(Connection), 사용할 쿼리(PreparedStatement)를 선택해서

xml or txt 파일로 만들어 주는 툴이었는데.. (최종 목표는 내 로컬의 웹페이지-> 내 로컬의 db 에 기록하는

초 간단 회원 관리 프로그램)

 

어느새 정신이 안드로 메다로 날아갔는지..

1.해당 업무에 필요한 Bean 이름

2.Bean에 필요한 프로퍼티 타입과 이름

3.Bean이 수행할 동작들..

 

말 그대로 이건

a.문자열로 입력을 받아서 내 툴 프로그램에서 .java 파일을 만들고 javac(컴파일러)를 호출해서 .class 파일로

   만들어 줘서 Bean 클래스 만들기

b.DB 커넥션에 필요한 정보 & 사용할 쿼리 만들기 아닌가;;

 

내 목표는 b였는데.. 어느새 a를 고민하고 있었다... b자체도 확장을 생각해서 설계를 계속적으로 변경했고

(이것 저것 배운거 다 적용시켜본다고;;)

 

a도 고민을 하다보면 만들순 있겠지만.. 현재 내 능력으로는 벅찬 일이다.

 

 

자바에서 xml 파일 생성하기

http://blog.naver.com/slrkanjsepdi?Redirect=Log&logNo=90160269756

 

 

 

 

by givingsheart 2014. 1. 1. 15:39