예전에 처음 접하면서.. 머리 싸맬때 비하면 훨씬 쉽게(26배 정도) 읽힌다;;


public static Object invokeObjectMethod(Object object, String methodName,

                                                               Class[] paramClasses, Object[] params)  throws Exception
    {

       //아래의 삼항 연산자의 사용은 훌륭하다. 모든 Object형은 Class(타입)형 or Object(인스턴스)형 이다.(인터페이스 깜박했네

       //인터페이스도 결국 타입이지..)

        Class cls = object instanceof Class ? (Class)object : object.getClass(); 
        Method method = null;
        Object value = null;

        //클래스 계층을 순회하면서 메서드를 찾았다면 중단.

        while (cls != null && method == null)
        {
            try
            {
                method = cls.getDeclaredMethod(methodName, paramClasses); //메서드는 기본적으로 이름(타입,타입,타입)으로 식별

                //못찾으면 null이겠지 -_-a

                //내 기억으론 선언된 모든 메서드 몽땅 가져오는게 있었다. 그거라면 메서드 이름 몰라도 상관없이 실행가능..

                //정의된 메서드 객체를 가져오면 각 메서드마다 필요한 매개변수 정보도 가져올수 있었던가..? 기억이 가물..
                method.setAccessible(true); //public,private 깨부수기.. setAccessible()은 method가 null일 경우 조건 처리 안해도 되나?

                //modifier를 가져와서 내맘대로 요리할수도 있음;;
                value = method.invoke(object, params); //오브젝트=메서드가 정의된 클래스의 인스턴스와 오브젝트 배열=매개변수들로 

                //해당 메서드 수행해서 리턴값(메서드의 리턴결과)도 오브젝트 타입으로 받는다. 으하하 

                //다형성 만만세!
            }
            catch (NoSuchMethodException e) //메서드 못찾았으니 상위클래스 뒤져봐야지;;(하위 클래스가 필드 추가하고 생성자만 

            {                                                   //추가했을수 있으니.. 한마디로 재정의 메서드도 없고, 추가한 메서드도 없고..

                cls = cls.getSuperclass();
            }
            catch (IllegalAccessException e)
            {
                cls = null;
            }
        }

        return value; //얍삽하게? 메서드 수행결과를 얻어냈다. 
    }


=> reflect 활용하면.. 도대체 못할짓이 뭐냐 -_-;;


(추가)


모든 객체는 프로퍼티와 함수로 구성되어 있고, 해당 프로퍼티는 문자열의 이름을 갖고 있다. 함수도 문자열의 이름을 갖고 있다. 이름을 알고, 접근할 메서드도 있고, 함수를 수행할수 있는 로우레벨의 INVOKE도 알게 되었다. 

오픈소스 - 보안 이슈가 문득 머리를 스친다. 




(etc) iBatis vs Hibernate (나중에 여유되면 보기.. 빈 vs db간 동기화(매핑)를 지원하는 프레임워크 개념임)


http://blog.naver.com/killer10004?Redirect=Log&logNo=70105825997



(추가)


DB와 서버단에서 OO와 RDB의 갭을 조율해주는 미들웨어 이다. DI란 개념, CONFIG와 XML을 이용한 선언적인 처리, 

쿼리에 대한 자동 바인딩및 리절트 셋을 바로 OO 객체로 바인딩 해주는 기술로서.. 개발자의 어려움을 덜어준다.


다시 한번 느끼지만.. 이 당시 이 개념을 한번 접해둔게, 추후 많은 이해에 도움이 되었다. 아는 만큼 볼수 있으며 아는만

큼 상대에게 종속되지 않고 능동적이 될 수 있다. 힘내자!



by givingsheart 2014. 1. 1. 16:12
상호 배척의 필터 개념인가? 아니면 서로 포장(데코레이트)될수 있는 필터인가?

1.내경운 애초에..  
a.클라가 객체를 전송할때 해당 객체에 String 타입의 "한글" text (2byte input필요) 필드가 존재했다면... 
b.받는 입장 서버나 다른 클라가 읽는(input) 경운.. 소켓은 기본적으로 1byte단위 InputStream을 제공하니까.. 
  요걸 InputStreamReader 필터 클래스로 포장해서 2바이트 단위(text)로 변환한후 데이터(스트림)를 읽어와야  
  안깨진 문자를 쓸수있고.. 
c. 상대가 보낸 스트림 타입이 객체 단위이니까.. ObjectInputStream을 통해 다시 한번 더 포장을 해야한다고 생각했다.

즉 (상대가 보낸 객체 데이터안에 한글 String이 있을경우)
isr = new InputStreamReader(socket.getInputStream() );
bir = new BufferedReader(isr);  
oir = new ObjectInputStream(bir); <--ObjectInputStream의 경우 InputStream 계열만 받는다. 그럼으로 오류!

is = new BufferedInputStream(socket.getInputStream() );
ois = new ObjectInputStream(is); 

MyClass a = (MyClass)oir.getObject();
sysout(a.getTextString()); //한글 출력 잘됨;; 
sysout(a.toString()); //별 의미는 없지만.. 

위의 경우에 해보진 않았지만.. 1byte 단위로 직렬화, 역직렬화를 하게 되는것 아닌가? 내가 InputStreamReader를
통해 2byte 단위로 i/o 처리하게 했다면.. 역직렬화 실패 아닐까??? 등의 고민을 했다.(현재까진 InputStreamReader ,
ObjectInputStream 스트림 필터 클래스를 서로 배척되는 것이라 판단함)

InputStreamReader 없이   ObjectInputStream의 getObject()를 했을때.. 읽어온 오브젝트의 멤버 필드인 한글 String(char[]중 byte가 아닌 text타입)은 어떻게 되는가?   <-- 이 문제 또한 직렬화가 해결해 주는건가? 

생각을 해보자고.. 문자or문자열을 i/o 할땐 직렬화 구현한다고 정의 안했잖아.. 아무런 추가 정보 없이 1바이트 스트림을 이용
해 파일or 네트워크에 1byte로 쐈으니.. 받는 입장(input)에선 text 데이터의 표현을 위해 2byte로 변환이 필요하니까
 InputStreamReader란 필터를 사용한 것이고..  내보낼땐 2byte -> 1byte (Writer -> outputStream)  읽어올땐 1byte->
2byte(inputStream -> Reader) ..
 
ObjectInputStream의 경운.. Serializabe를 통해 알아서 마샬링,언마샬링? 하고.. String 클래스 =  implements Serializabe 할뿐
아니라, 말그대로 인코딩을 지원하기 위한 CharSequence 인터페이스를 구현하고 있다. 해당 문자가 utf-8인지 utf-16인지
아니면 디폴트로 ms949인가 인지..

자.. 내 경우에 이클립스 편집기 언어 인코딩 설정을  utf-8로 변경했을때.. 한글이 전부 깨졌지.. 이게 왜 그럴까?
모든 캐릭터를 8bit로 표현한단 의미잖아. 한글은 표현에 16bit가 필요한데..  

=>결론.. 스트림간 인코딩의 통일! or 약속

2.클라가 Writer를 이용해 텍스트 보내고 , bmp등 Image객체를 보냈을때.. 

(1)text로 보낸 문자는 소켓이 byte로 넘겨주기에 InputStreamReader(socket.getInputStream)을 사용해서 읽어오고
(2)byte로 보낸 이미지 데이터는 ObjectInputStream(socket.getInputStream)을 사용해 읽어온다.


=>1,2에 대해 내게 무엇이 부족해서 명확히 구분을 못하는건지.. 이것조차 헷갈린다.. OTL


**********************************************************************
분산 처리를 위해 A,B,C를 배치하고 네트웍으로 연결시켰을때
 1. org.omg.CORBA(이종의 app간 통신 지원 request, response 웹에서 클라요청->jsp컨테이너의 response) = 한마디로 
  네트웍을 통해 객체가 왔다 갔다 한다. a.니가 가지고 있는 객체좀 줘(request) b.객체를 바로 전달해주거나 or 결과값을 전달
  해주거나(response or resultSet) 
 2. java.rmi(remote method invocation 원격에 있는 객체,메서드를 내 로컬에서 사용하듯이.. reflect에서 많이 봤던..)  로 발전
  과정..
  
  (위의 1,2 등의 작업을 지원하는 프레임워크가 java ee.. 근데 위와 같은 작업은 jsp 컨테이너의 역할과 같은것 아닌가?)

 => 객체라는 reference 타입이 왔다 갔다 i/o를 하기 때문에 

3.직렬화(serializable)의 개념이 필요함.. 
     (etc) 직렬화에서 제외(transient)되어야 할 경우 : 참조 객체가 직렬화 구현 안했을때, 보안이 필요한 객체(필드)일때, 상위 클래스
           가 직렬화를 구현 안했을때(이건 내가 상속받아 직렬화 구현하고 + readObject,writeObject 재정의 하면서 상위 클래스
           멤버 필드를 명시적으로 read,write 해줘야함), 인스턴스가 실제 Object타입의 경우(실제 인스턴스타입이 직렬화를 
           구현했으면 참조 타입이 Object 타입이라도 가능)
     (etc) 직렬화 객체의 구성 요소 각각의 타입이 다를때.. 이 순서를 기억해야 한다. (내가 어제 복리 계산 프로그램에서 double
            형 int형 있어서.. 반복자 처리가 안되었던 사례.) 상위 타입을 준비하고 가급적 순서(List계열)를 유지하는 컨테이너 
            객체로서 관리 하는게 사용에 편리하다. 
            (ex)  ArrayList<Base> list = new ArrayList<Base>();  만들어서 순서가 유지 되어야할 타입이 다른 원소들을 
           생성해서 "순서대로" 집어 넣고..    list 채로 i/o를 하게 되면.. 받는 쪽에서 list 를 반복문을 이용해 순차 접근해서 처리
           하면 되니.. 얼마나 편리한가?(물론 instanceof 로 실제 타입을 확인해서 타입캐스팅 해줘야 하지만.. 그나저나 
           인스턴스A instance of ClassType   VS   ClassType.class == 인스턴스A.getClass()   만약 인스턴스A가 null일때 
           둘중 무엇이 안정적이냐?) 

=>요게 java ee의 "분산처리" 개념을 지원하는 기반 기술

4.예전에 한번 거론했던..sid or uid 역할은 직렬화/역직렬화 클래스의 버전 식별 
(클래스의 멤버 필드,메서드중 객체의 생성,소멸과 관련된 것들(생성자류)을 문자열로 처리해 순서대로 xor 연산 xor  해당 클래
스의.Class를 문자열로 한 값 => 결과였는듯? 아님 말고;;  xor은 순서 따라 전혀 다른 결과가 나오니.. 원본 xor 키 = 암호 결과
 xor 키 = 원본)


by givingsheart 2014. 1. 1. 16:09
(etc) 그나저나 아래 사이트 어떻게 이용하는 걸까?

https://www.ibm.com/developerworks/mydeveloperworks/groups/service/html/communityview?communityUuid=3a304e3a-2d9e-48cc-860c-786c695bf330



(etc)내일부터 spring도 조금씩 진행(선수 지식은 쬐금씩이지만 쌓았다)




이미지 i/o까지 보게되었다..살짝 간만보자;; jsp 진도가 안빠진다;; jsp 교재가 최우선!!!!!!


javax.imageio 
클래스 ImageIO


static BufferedImageread (File  input) 
          현재 등록되어 있는 것의 중으로부터 자동적으로 선택된 ImageReader 를 사용해, 지정된 File 를 복호화 한 결과적으로,BufferedImage 를 돌려줍니다.


<pre>public final class ImageIO
extends Object
</pre>

ImageReader 및 ImageWriter 를 검색하는 정적인 편리한 메소드를 보관 유지해, 간단한 encode와 

복호화를 실행하는 클래스입니다.



javax.imageio 
클래스 ImageReader


<pre>public abstract class ImageReader
extends Object
</pre>

이미지를 해석해 복호화 하는 추상 슈퍼 클래스입니다. 이 클래스는, Java Image I/O 시스템

의 문맥으로, 이미지를 읽어들이는 클래스에 의해 서브 클래스화 됩니다.

ImageReader 객체는, 일반적으로, 특정의 형식의 서비스 프로바이더 인터페이스 (SPI)에 의해 

인스턴스화 됩니다. ImageReaderSpi 인스턴스등의 서비스 프로바이더 클래스는, 그러한 클래스

의 형식의 인식과 사용 가능한 형식의 읽기측과 기입해 옆의 표시에 사용하는 IIORegistry 에 

등록됩니다.

입력 소스가 setInput 메소드를 사용해 설정되는 경우, 「순서 방향 검색만」으로서 지정됩니

다. 이 설정은, 이전에 읽어내진 이미지와 관련지을 수 있었던 데이터를 보관 유지하는 입력 

부분의 캐쉬를 회피하기 위해서, 입력 소스에 보관 유지되는 이미지가 차례로 읽어내지는 

것만으로 있는 것을 의미합니다.



javax.imageio 
클래스 ImageWriter



<pre>public abstract class ImageWriter
extends Object
implements ImageTranscoder
</pre>

encode와 이미지의 기입을 위한 추상 슈퍼 클래스입니다. Java Image I/O 시스템의 문맥내

에서, 이미지를 써내는 클래스가, 이 클래스를 서브 클래스화할 필요가 있습니다.

ImageWriter 객체는 일반적으로, 특정 형식을 위한 서비스 프로바이더 클래스에 의해 인스턴스

화 됩니다. 서비스 프로바이더 클래스는 IIORegistry 에 등록되어 형식을 식별해, 사용 가능한 

형식의 읽기측과 기입해 옆을 제시하기 위해서 사용됩니다.




java.awt.image 
클래스 BufferedImage

모든 구현된 인터페이스:
RenderedImage , WritableRenderedImage , Transparency


BufferedImage 서브 클래스는, 이미지 데이터의 액세스 가능한 버퍼를 갖춘 Image 를 기술합니

다. BufferedImage 는,ColorModel 및 이미지 데이터 Raster로 구성되어 있습니다. Raster SampleModel 

밴드수 및 형태는, 색성분 및 알파 성분을 나타내기 위해서(때문에) ColorModel 에 의해 요구되

는 수 및 형태와 일치하고 있을 필요가 있습니다. 모든 BufferedImage 객체의 좌상구석의 좌표

는 (0,  0)입니다. 이 때문에,BufferedImage 의 작성에 사용되는 Raster 는 minX=0 및 minY=0 가 

아니면 안됩니다.

이 클래스는,Raster 의 데이터의 취득 방법과 설정 방법법, 및 ColorModel 의 색의 기술 방법으

로 의존합니다.


java.awt 
클래스 Graphics2D


<pre>public abstract class Graphics2D
extends Graphics
</pre>

Graphics2D 클래스는, Graphics 클래스를 확장해, 기하학적 도형, 좌표변화, 칼라 관리,

 및 텍스트 배치에 대해 고도의 제어를 실시합니다. 이 클래스는, Java(TM) 플랫폼에서

 2D 의 도형, 텍스트, 및 이미지를 draw하기 위한 기본 클래스입니다.



abstract  voiddrawImage (BufferedImage  img, BufferedImageOp  op, int x, int y) 
          BufferedImageOp 로 필터 처리되는 BufferedImage 를 draw 합니다.
abstract  booleandrawImage (Image  img, AffineTransform  xform, ImageObserver  obs) 
          이미지 공간으로부터 사용자 공간에의 변환을 적용하고 나서, 이미지를 draw 합니다.





3d 용 directX나 openGL은 어찌 사용할까?


by givingsheart 2014. 1. 1. 16:06
아.. File 객체는 txt등 파일외에도 디렉토리의 개념도 포괄한다. 즉 2개의 개념을 의미하는 단위이다.
(그럼으로 list()등을 이용해 얻어온 File 객체들은 파일 or 디렉토리를 구분해 주어야한다)

오늘 배운것중 디렉토리 경로를 매개변수로 해당 디렉토리 내의 모든 하위 디렉토리, 파일을 출력해주는 코드를 구현시..
재귀호출을 사용해서 하위 디렉토리,파일을 출력하게끔 처리했음. (트리처럼 하위 요소들은 깊이에 따라 출력 전에 /t를 
추가 해주면 더 보기 좋을듯)


File renameTo(File path+name) : 파일의 수정,이동의 경우 삭제->새로 생성이 아닌, 경로와 파일명의 변경을 의미한다.


(etc)파일의 복사,이동의 경우 파일 객체의 디렉토리or파일명을 바꾸어주는 것이다.
(자바의 대입연산인 clone()처럼 참조값만 바꾸어준다. 실제 하나의 데이터 파일을 2개가
가르키고 있다가.. 특정 파일을 수정하는 경우 그때서야 새롭게 데이터 블럭에 파일을
기록할 것이다<- 아닐지도 모름... 이게 게으른(lazy) 복사였나?)

(etc)File 클래스의 isExcute() 인가 메서드 웬지 찍혔음 (내app에서 다른 프로그램 웹이던 뭐던 띄울때 체크하기용으로)

getParent() 요건 상위 경로명 리턴

글고 가급적 디렉토리 만들깨 mkdirs()로 만들것! (왜냐면.. 상위 디렉토리가 없을 경우 알아서 다 만들어줌)

File (URI  uri)  요걸로 웹작업할때 사용하면 좋을듯. (URI > URL,URN)

각종 유효성 리턴 메서드 isXXX() 계열.. 흠.. 내코드의 안전을 위해선 쓰는게 좋을듯..
(나 역시 모든 유효성 체크를 isValidFile() 요런식으로 묶어서 써야지.. 코드가 덜 지저분해
질듯;;)


 booleanmkdirs () 
          이 추상 경로명이 가리키는 디렉토리를 생성합니다.
 booleanrenameTo (File  dest) 
          이 추상 경로명이 가리키는 파일의 이름을 변경합니다.
 booleansetExecutable (boolean executable) 
          이 추상 경로명에 소유자의 실행 권한을 설정하는 편리한 메소드입니다.
 booleansetExecutable (boolean executable, boolean ownerOnly) 
          이 추상 경로명에 소유자 또는 전원의 실행 권한을 설정합니다.
 booleansetLastModified (long time) 
          이 추상 경로명이 가리키는 파일 또는 디렉토리가 변경된 시각을 설정합니다.
 booleansetReadable (boolean readable) 
          이 추상 경로명에 소유자의 읽기 권한을 설정하는 편리한 메소드입니다.
 booleansetReadable (boolean readable, boolean ownerOnly) 
          이 추상 경로명에 소유자 또는 전원의 읽기 권한을 설정합니다.
 booleansetReadOnly () 
          이 추상 경로명이 가리키는 파일 또는 디렉토리에 마크를 설정해, 읽기 조작만이 허가되도록(듯이) 합니다.
 booleansetWritable (boolean writable) 
          이 추상 경로명에 소유자의 쓰기 권한을 설정하는 편리한 메소드입니다.


by givingsheart 2014. 1. 1. 16:00
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

내 툴의 구성은

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

실제 소스코드를 확인하진 않았지만.. 좋은 방법이 떠오른다.

 

 

문제점)일단 부동소수점 방식의 데이터 타입으론 지수부(e)+가수부

 

정확한 연산이 안된다. (결제등 프로그램이라면 중요)

 

BigInteger란 클래스가 쓰인다 하셨는데..

 

 

Sol아이디어)예전에 작업했던 반올림용 round()메서드 구현하기 처럼

 

실제 데이터 보관은 String형 (ex) String str = "241.12342"

 

실제 연산은 str을 파싱해 long등 큰 타입의 정수형 만들어 다루고,

24112342 - 1000001 = 14112341

 

반환시  return double retVal/10*n(해당 소수점 6개 만큼)

 

으로 처리하는게 아닐까 싶다.(tc++pl에서 얼핏 본듯;;)

by givingsheart 2014. 1. 1. 15:21

java.Bean 패키지 분석중

 

1.java.beans.Beans 클래스엔

static Object getInstanceOf(Object bean, Class<T> targerType) 즉 빈에서 해당 타입의 객체 생성해주는 메서드

static Object instantiate(ClassLoader cls, String beanName) 오버라이딩된 메서드가 클래스 로더&이름을 통해

   빈 객체를 생성했다.

 

2.java.beans.BeanDescripto 클래스엔  Beans클래스가 가져야할 타입 정보외 기타 정보를 관리해준다.

BeanDescriptor(Class<?> beanClass)  일반빈에 디스크립터 작성

BeanDescriptor(Class<?> beanClass, Class<?> customizerClass) 구체화시킨 빈에 디스크립터 작성

 

3.java.beans.MethodDescriptor 클래스엔 Beans클래스가 가져야할 타입외 메서드 관련 정보를 관리해준다.

Method geMethod() 디스크립터가 캡슐화한(특정 프로퍼티에) 메소드들 getter

ParameterDescriptor[] getParameterDescriptor() 빈이 해당 메소드에 연결된 매개변수 정보들 getter

 

즉 빈의 프로퍼티(캡슐화)-> 메서드A -> 파라미터A

                                                   -> 파라미터B

                                                   -> 파라미터C

                                  -> 메서드 B ->파라미터 A

                                                    ->파라미터B   식의 트리형태 구성

 

4.java.beans.PropertyChangeListenerProxy 클래스(이벤트 리스너 프록시 상속) 는 말 그대로 내가 만든 빈의

    각 프로퍼티(attribute o member field or memberData)와 그에 해당하는 사용자의 입력등 이벤트를 핸들링

    한다.

 

 중요한 생성자 (이벤트 핸들러에 자신이 관심영역, 해당처리를 할 리스너를 연결) 컴포넌트에 addListener(MyListner)방식

  PropertyChangeListenerProxy(String propertyName, PropertyChangeListener listener)

 

 String gerPropertyName() 청취자가 관련지어진 프로퍼티의 식별자를 리턴

 void propertyChange(PropertyChangeEvent evt) 프로퍼티에 관심 이벤트를 재 설정

 //상속받은 메서드

 public EventListner getListener() 해당 프로퍼티와 관련지어진 리스너를 리턴

 

5.java.Beans.PropertyChangeSupport 클래스(Object클래스 상속, 직렬화(Serializable) 구현)는 이벤트 핸들러의 역할

 void addPropertyChangeListener(PropertyChangeListener listener) //청취자 추가

 통지는 notify가 아닌, fireXXX 메서드를 사용

 void fireIndexedPropertyChange(String propertyName, int index, boolean oldValue, boolean newVlaue)

 

6.그외에 XMLDecoder, XMLEncoder 클래스들이 눈에 띄었음.

 

7.java.awt.component 클래스에서도

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

import java.beans.PropertyChangeEvent;

등을 사용 한다는 것에 웬지 웃음이 나오고 존경심이 든다.

객체지향 만세! java frame work 만세!

 

역할별로 1과2  4와 5를 쪼개고, 특징별로 1과 3 를 쪼개고.. 음.. 좀 더 고민을 해보고 이해가 깊어져야할듯. 

by givingsheart 2014. 1. 1. 15:19
| 1 2 |