에너미 앳 더 헬 게이트
마지막 컷에 보이는 나뒹구는 시체 중 하나인 내 심정은..
내가 웃는게 웃는게 아니야..










|
PHP
|
|
|
JavaScript and Ajax
|
|
|
Java EE & Web Development
|
|
|
JavaFX
|
|
|
Groovy and Grails
|
|
|
Ruby and Rails
|
|
|
GlassFish v3 Prelude for Web Development
|
|
|
C/C++
|
![]() |
|
Java ME
|
![]() |
|
Java Debugger
|
![]() |
|
Java SE
|
![]() |
|
IDE Tools and Usability
|
![]() |
지난 수년간 JAVA로 개발을 해 오다 작년부터 필요에의해 MS의 .Net Framework와 C#으로 프로젝트를 진행하고 있다.
.Net Framework와 C#이란 언어를 다루면서 처음으로 접한 문화 충격이라면 Property와 Delegate일 거다.
MS진영 개발자라면 당연한것으로 받아들이고 있을 두 개념을 처음 접했을때의 신선함이란!
자바 개발자들을 위해 간략하게 첨언하면
.Net에서 이야기하는 Property란 java 세상에서는 쉽게말해 getter와 setter에 해당하는데 요걸 코드로 표현하는 방법이 재미있다.
(물론 이 property란게 코드의 표현이 재미있다의 수준에서 그치는 건 절대 아니다.)
그리고 .Net에서 이야기하는 Delegate는 메소드 레퍼런스의 OOP적인 Wrapper이다.
이 Delegate란게 Java언어에서도 구현은 할 수 있지만 .Net에서와 같은 우아한 코드로 표현되진 않는다.
( Java는 OOP 개념으로 접근하여 교과서스럽게 코드로 표현하기 때문일거다..
여튼 Java에서는 없는 개념이라고 맘편히 생각해도 되겠다. )
뭐? '메소드 레퍼런스의 OOP적인..'이 어쨌다고? 문자로 표현하니 뭘 이야기하는 건지 금방 못알아듣겠지만 개념이 그렇다.
(C의 표현을 빌자면 '함수의 포인터' 정도로 불릴 수 있겠다.) 나 역시 코드를보고서야 위 말의 의미를 알 수 있었으니까..
풀어 말하자면 클래스 인스턴스의 레퍼런스를 다른 클래스 인스턴스의 메소드에 전달하는것과 마찬가지로
메소드의 레퍼런스를 객체 다루듯이 다른 클래스 인스턴스의 메소드에 전달하는것이 가능하다.
놀랍지 않은가? 메소드를 객체처럼 주고 받을 수 있다니!!
이게 사용하다보면 은근히 편하다. Java 세상에선 Callback을 받기위해 자신의 레퍼런스를 넘겨야 가능할 일을
.Net에서는 Callback 메소드를 싼 클래스를 넘겨 버리면 그만이니...
확실히 최근에 나온 언어일수록 개발의 편의성이 높긴하다. Java에도 조금 유연성을 발휘하여 이런 개념을 도입하면 어떨까?
[상업적으로 가장 성공한 OOP언어가 Java가 아니던가. Java에 Generic 개념이 도입되었을때도 자바스럽지
않다며 유난을 떠는 사람들도 많았으니 .net의 delegate 개념을 언어 차원에서 지원한다면 이건 더이상 java가 아니다며
너스레를 떠는 사람이 넘쳐날지도.. ]
결국 그 delegate가 Python 언어의 람다 함수나 Javascript의 익명 함수와 같은 역할을 하죠. 원래 Lisp 같은 함수형 프로그래밍 언어 쪽에서 나온 개념인데 이게 은근 편리(?)하다보니 요즘은 원래 함수형 언어가 아닌 언어에서도 많이 지원하는 추세인 것 같습니다.
예 daybreaker님께서 주신 말씀대로입니다.
본질을 이해하고나면 표현하는 방법이 무슨 대수겠습니까만은..
이게 시작을 대중적인 OOP언어로 한 저같은 사람은 생소한 코드
표기방법과 쓰임에 당황+놀라움을 동시에 경험하기도 한답니다.. ^^

미사토:저게 에바의 진정한 모습.
사이트 하단에 간략하게 제작에피소드가 적혀있던데 흥미롭게 읽었습니다.
애니에서는 싱크로율이 400% 정도 되었을때 녹는걸로 되어있었다고 하는군요.
제 수치는 저는 아마 의식을 잃은 상태이고 에바가 제멋대로 폭주한 상황이겠네요. ^^;
SCExamLab.exeSCJP 5.0 시험 시뮬레이터
Mercury5 리더기와 TI 社 제조의 rfid 태그간의 궁합문제가 있단다.
0,1의 전기 신호로 움직이는 하드웨어 세상에는 전기의 위상차이나 타이밍 등 다양한 이유로 부품간, 혹은 컴포넌트 간에 미묘한 궁합이 있다는건 익히 알고 있었지만, 이런 식으로 생각지도 못한 곳에서 이 '궁합'이란 문제와 마딱트리릴 줄이야!
요 며칠간 일전에 회사에서 제작한 RFID미들웨어와 ALE의 코드 개선 작업을 진행했다.
Mercury5 리더기와 TI 제조의 태그를 테스트 장비로 이용하였는데.. Smoothing Filter의 Window Size를 4000 msec까지 올려도 tag out 이벤트가 발생하는게 아닌가.. (이 때는 솔직히 리더 성능을 탓했다... ) 도대체 윈도우 사이즈를 몇 초나 올려줘야 데이터가 안 튄단 말인가!!
미들웨어 제작을 발주했던 회사의 담당 과장을 옆에 모시고 시연을 해 보이며 이런 현상이 발생하는 상황을 인지시켜드린 다음 날, 담당 과장이 머큐리5 리더 개발자 메뉴얼에서 조차 보지 못한 (없었다고 확신은 할 수 없다.. 내가 놓친 부분일수도 있으니까..) 희한한 명령어 두 줄을 건네시며 이 명령어를 리더에 적용한 후 다시 한번 테스트를 부탁하시는거다. TI칩과 궁합에 문제가 있으니 요 명령어 먹이면 좀 나아질거란 말씀과 함께..
다시 한 번 테스트... 결과는?
속된말로 '후덜덜'할 정도로 데이터가 양호하게 올라온다..
대체 하드웨어 제조가 아니면 모를 이런 tweak 정보는 어디서 얻는 거냔 말이다. 메뉴얼을 다시 보면 보일까?
여튼 담당 과장 덕분에 개선한 코드가 너무나 잘~ 움직여주고 있다는거 확인거 정도로 긍지를 가져도 괜찮겠지.
자. 이제 위의 예제코드의 ResultSet을 XML데이터로 변형 해 봅시다.
이를 위해 com.sun.rowset.WebRowSetImple 클래스를 이용할 수 있습니다.
위 예제 코드에 몇 라인의 코드를 추가함으로써 result set을 XML 파일로 출력 할 수 있습니다.
[code]
... ... ...
ResultSet rs = stmt.executeQuery("select * from student");
WebRowSet wrs = new WebRowSetImpl();
wrs.populate(rs);
try {
wrs.writeXml(
new FileOutputStream("student.xml"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
... ... ...
[/code]
wrs.writeXML()의 출력형태는 WebRowSet scheme definition. 의 형태를 따르며
출력은 properties, metadata, data의 세 부분으로 구분 되어집니다.
일반적인 출력 레이아웃은 다음과 같습니다.
[code]
<?xml version="1.0"?>
<webRowSet xmlns= "http://java.sun.com/xml/ns/jdbc"
xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation= "http://java.sun.com/xml/ns/jdbc
http://java.sun.com/xml/ns/jdbc/webrowset.xsd">
<properties>
... ... ...
</properties>
<metadata>
... ... ...
</metadata>
<data>
... ... ...
</data>
</webRowSet>
[/code]
<properties> 태그는 provider( isolation leve, RowSet type 등)를 의미 합니다. <metadata> 태그는 해당 데이타베이스의 테이블의 갯수, 이름, 컬럼타입 등을 나타내며, 마지막으로 <data> 태그는 해당 테이블의 실제 정보를 기술합니다.
[code]
<data>
<currentRow>
<columnValue>200 < /columnValue>
<columnValue>Jack</columnValue>
<columnValue>Dakota</columnValue>
<columnValue>21</columnValue>
</currentRow>
<currentRow>
<columnValue>100</columnValue>
<columnValue>John</columnValue>
<columnValue>Doe</columnValue>
<columnValue>26</columnValue>
</currentRow>
</data>
[/code]
위의 예에서 보이는 <currentRow> 태그는 WebRowSet의 각 Row에 저장되어있는 데이터를 나타냅니다. insert, update, delete같은 데이터 조작은 다음편에서 계속하겠습니다.
아래에 이어질 예제는 JDK5.0과 Oracle 데이터베이스 10.2를 이용하여 진행하고 있음을 밝혀둡니다.
자.. 'student'라는 테이블에 아래와 같은 데이터를 갖는 간단한 데이터베이스가 있다고 합시다.
SQL> select * from student;


WebRowSet inheritance Hierarchy(출처:OnJava)
"우린 아직 제대로 이룬 게 없잖아요. 무언가를 이루고 싶어 열심히 노력하지만
바라는 결과가 나올지 어떨지는 모르죠. 결과가 나오는 사람과 나오지 않는 사람의 차이가
어디에 있는 건지도 알 수가 없고."
식사가 나왔다.
"처음부터 '나는 뭔가가 되어야만 한다'는 생각을 하지 않고 살 수 있으면 편하겠어요.
하지만 이미 그렇게 될 수는 없겠죠. 우린 모두 뭔가가 되기 위해 노력해야 한다는 사실을
알고 있으니까, 눈을 떠 버렸으니까."
모든 자바 클래스의 최상위 부모클래스인 java.lang.Object 클래스에는 finalize() 메소드가 존재하며, Java API 에는 이 메소드는 '가비지 컬렉터가 레퍼런스를 잃은 클래스의 인스턴스를 가비지 컬렉션할 때 호출된다' 라고 기술하고 있습니다.
이 메소드는 객체인스턴스가 가비지 콜렉션에 의해 소멸되는 시점에 특정한 동작을 수행해야 할때도 요긴하게 사용할 수 있는 메소드입니다만 일반적인 경우 불필요하게 이 finalize() 메소드를 오버라이딩하는 것은 자제해야합니다.
이유는 'finalize 메소드에 의한 Collection 지연과 OOME(Out of Memory Exception)발생 가능성'때문입니다.
특정 Class에 finalize 메소드가 정의되어 있는 경우, 이 Class Type의 Object는 Garbage Collection 발생시 즉각적으로 Collection 되지 않습니다. 대신 Finalization Queue에 들어간 후 Finalizer에 의해 정리가 되는데요. Finalizer는 Object의 finalize 메소드를 실행한 후 메모리 정리 작업을 수행하게됩니다.
만일 finalize 메소드를 수행하는데 오랜 시간이 걸린다면 그 만큼 객체가 오랫동안 메모리를 점유하게 되고 이로 인해 OOME가 발생할 확률이 높아집니다.
이런 이유로 finalize 메소드는 되도록 사용하지 말아야 합니다.