[Java] 익명 클래스 (Anonymous Class)[Java] 익명 클래스 (Anonymous Class)

Posted at 2009. 1. 11. 17:39 | Posted in 프로그래밍 언어/Java
Form GUI 프로그래밍을 할 때 버튼 없이는 되는게 없다는 생각을 할 정도로 GUI 프로그래밍을 할 때 버튼은 거의 꼭 넣곤 한다. 예전에 Swing을 써서 어플리케이션을 만들었는데 버튼에 이벤트를 줘야 했다. 그러나 Swing은 처음. 익명 클래스? 그게 뭥믜 할 시절, 난 다음과 같이 코드를 싸질렀다.
class ButtonActionListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        // Do something...
    }
}

// in main..

JButton button = new JButton("OK");
button.addActionListener(new ButtonActionListener());

버튼 하나 만들 때마다 클래스 수가 증가했고 보기도 힘들더라... 고작 actionPerformed 메서드 하나 있는 ActionListener 인터페이스를 구현해서 넣을 건데 클래스를 따로 만들어야 되다니!!

찾아보니 자바엔 Anonymous Class가 있더라. 뭔고 하니 다음과 같은 것이다.

JButton button = new JButton("OK");
button.addActionListener ( new ActionListener() {
    public void actionPerformed(ActionEvent ev)
    {
        // Do Something...
    }
} );

클래스를 따로 만들 필요가 없다. new 구현한 클래스 이름() 대신, 그냥 위와 같이
new 구현하고자 하는 인터페이스 이름() {    구현해야 하는 메서드 구현    }
끝이다.

다른 표현으론 요론식

interface MyInterface
{
    public void function();
}
public class AnonymousClassFromInterface {
    public static void main(String[] args)
    {
        MyInterface mi = new MyInterface(){
            public void function(){
                System.out.println("익명함수");
            }
        };
        mi.function();
    }
}

output >> 익명함수

인터페이스를 구현한 객체를 만들어야 하는데 그 객체는 어떤 부분에서 제한적으로 사용이 되고 구현해야 하는 메서드 숫자도 매우 적을 경우 익명 클래스를 사용하면 좋다.

↑ 참고사이트: http://happystory.tistory.com/64

만약 Swing에서 한 패널이 있고 그 패널에 버튼이 있는 상태인 경우, 그 패널을 클래스화 시켜서 사용중이라면 다음과 같은 방법도 가능하다.

class SomePanel extends javax.swing.JPanel implements ActionListener{
    private
JButton button1;
    private JButton button2;
    private JButton button3;
    public SomePanel(){
        button1 = new JButton("버튼1");
        button1.addActionListener(this);
        this.add(button1);

        button2 = new JButton("버튼2");
        button2.addActionListener(this);
        this.add(button2);

        button3 = new JButton("버튼3");
        button3.addActionListener(this);
        this.add(button3);
    }
    public void actionPerformed(ActionEvent arg0) {
        // Do Something...
        Object obj = arg0.getSource();
        if(obj == button1) {
            System.out.println("버튼1");
        } else if(obj == button2) {
            System.out.println("버튼2");
        } else if(obj == button3) {
            System.out.println("버튼3");
        }
    }
}


옛날에 구현해 놓은거 열어 보니 저렇게 구현이 되어 있었다. 뭘 보고 저렇게 구현했는지는 잘 모르겠다-_-;; 그런데 리스너로 this 막 넘겨주고 해도 괜찮을까 모르겠다.  메모리 해제가 안 될 것 같기도 하고;;
참고로 getSource() 는 이벤트가 일어난 객체를 리턴한다. 패널의 모든 버튼이 같은 일을 하면 필요 없겠지만 보통 안 그렇기 때문에 저런 방법을...

//

인터넷 이용시 쓰이는 비밀번호, 자주 바꾸거나 다양하게인터넷 이용시 쓰이는 비밀번호, 자주 바꾸거나 다양하게

Posted at 2009. 1. 7. 01:05 | Posted in 이야기 방/IT 이야기
지금 내가 쓰고 있는 비밀번호를 언제 만들었는지는 기억이 잘 안 난다. 고2 나 고3 정도에 만들었던 것 같다. 모든 비밀번호가 다 같은 것은 아니지만 90%정도 이때 만든 비밀번호를 사용한다. 이때까지 비밀번호를 통일해 사용했고 바꿀 생각도 안 했던 이유는 딱 하나다.

난 유명인도 아닌데, 내 아이디를 해킹해서 너(해커)가 얻을게 뭐가 있어

그런데 이런 뉴스를 봤다. <네이버 뉴스 링크> 오바마 블로그 계정 해킹당해
추가>> 이런 뉴스도 있다. <다음 뉴스 링크> "헉! 누구세요?" 메신저 피싱 기승

해커가 내 아이디를 해킹해서 가져갈 어떠한 형태의 직접적인 이득이란 것이 존재하질 않는다. 하지만 내 아이디를 해킹해서 만들어 낼 어떠한 형태의 손해들이 존재한다. 예를 들어 내 아이디를 도용해서 사기를 친다거나, 웹에서 해선 안 될 글/댓글을 쓰는 용도로 쓰인다거나..

이름, 주소, 주민등록번호나 전화번호 같은 내 정보를 빼앗기는 것 보다 내 아이디를 빼앗긴다는 것이 더 무섭게 느껴진다. 인터넷에서 아이디란 '나 자신'을 상징하니까. 근데 그런 아이디를 빼앗겼으니... 난 가만히 있었는데 다른 사람들이 나를 나쁜놈으로 본다고 생각해 봐라. 무섭다-_-;; 현실상 '명의도용'쯤 되려나?

여하튼 그렇다고 모든 사이트의 비밀번호를 모두 다르게 해서 피해를 최소화 시키기도 뭐하다. 요즘 시대에 개인이 사용하는 웹사이트가 하나둘도 아니고 말이다. 그렇다고 아이디-비밀번호를 적어놓고 가지고 다니는 건 더 위험하다. 잃어버리면 끝장이잖나-_-;



여러 사이트의 비밀번호를 다르게 만들 해결책.. 이라기 보단 대안책은 이렇다.
(내 멋대로 생각한 것이다. 아무 근거도 없고 효과도 없을 것 같다-_-)

먼저 자신만의 독특한 비밀번호를 만든다. 6~8자리 정도? 문자와 숫자가 섞여있으면 더욱 좋겠지. 그리고 사용할 웹사이트 도메인 이름의 몇 글자를 빼서 비밀번호의 사이에 껴 넣는 것이다. 말이 어렵다. 예를 써 보자.

예로 네이버를 생각해보자.
만약 자신의 비밀번호가 1234abcd라 하자. 네이버 도메인은 naver.com이다.
naver.com의 1,3,5번째 글자를 비밀번호의 1~2번째 글자 사이, 3~4번째 글자사이, 5~6번째 글자사이 위치에 끼어 넣는다. 그렇게 하면 1n23v4arbcd 가 되겠다.

그런데 이렇게 비밀번호에 도메인의 몇 글자를 적용시키는 패턴이 너무 어렵다. 이거 외우기도 쉽지 않고 적용도 번거롭다. 그냥 1234abcd 의 앞 뒤에 도메인의 양끝 2글자를 거꾸로 붙이는 것도 괜찮을 듯 싶다.(er1234abcdna)
도메인의 몇몇 글자를 빼오고 그 글자를 비밀번호의 어떤 부분에 어떻게 집어넣을 지는 취향일 것이다.



이렇게 하면 장점이 뭘까?

사용자가 여러개의 사이트를 이용할 때 한 사이트의 아이디/비밀번호가 유출된다 해도 다른 사이트는 비밀번호가 다르니 안전하다. 그렇다고 모든 비밀번호를 외워야 하는 것이 아니다. 단지 기본이 되는 비밀번호 하나와 이를 가지고 비밀번호를 생성하는 나만의 패턴 생성 방법만을 외우고 있으면 된다.

아, 물론 내가 이렇게 사용한다는 것은 아니다-_-;; 난 비밀번호 하나를 거의 90% 사이트에서 사용한다;; 단지 글 쓰다 생각난 방법일 뿐이다. 이 방법 우왕ㅋ굳ㅋ? 그런거 아니다-_-

요점은 웹사이트마다 비밀번호를 다르게, 죄다 다르게 하긴 힘드니 그룹을 만들어서라도 여러 개의 비밀번호를 쓰는 것이 분실했을 때 손해를 최소한으로 줄일 수 있는 사용자가 취할 수 있는 행동이 아닐까.



─하지만 최우선적인 것은

비밀번호를 복잡하게, 당신의 실생활 정보(전화번호, 주민번호, 생일 등)를 통해 추측할 수 없는 글자의 조합으로 만들 것.
그리고 남에게 알려주지 말고 여럿이 쓰는 컴퓨터에선 절대 저장 안 되도록 할 것.
//

고등학교 때 소설 썼던 스프링노트를 꺼내보았다.고등학교 때 소설 썼던 스프링노트를 꺼내보았다.

Posted at 2009. 1. 6. 01:59 | Posted in 이야기 방/일상 이야기
지금 보니 소설이라고 하기에도 민망한 허접한 퀄리티를 자랑하고 있다.
비록 문체나 글 쓰는 법은 유치하고 읽기 민망할 수준이었다.

하지만,
중간에 완성을 못 하고 엔딩까지 개략적인 스토리만 적어 둔 상태인데
그 엔딩까지의 스토리를 읽어보니 이 이야기를 끝까지 써 보고 싶다는 생각이 들었다.
아니 앞 문체가 너무 민망하니 다시 처음부터 써 볼까 생각까지.

그리고 요새 PV들을 보면 뭔가 스토리가 있다.
바로 밑 Nightwish의 Amaranth PV를 보며 짧은 단편 같은 거라도 다시 써 볼까 하는 생각이 문득 들었다.
아니면 글을 완성시키진 않더라도 개략적인 스토리라도 써 보는 건 어떨까?


글. 그림. 음악.
예술적인 감각이 내게 조금이라도 있었다면 지금의 인생이 500%는 더 즐거웠을 것이다.
아쉽다. 정말.
쓰고는 싶은데, 그리고는 싶은데, 악기를 두드리고는 싶은데, 노래를 부르고는 싶은데,
능력이 안 된다. 그렇다고 노력으로 이를 극복할 수 있는 시간이나 용기가 있는 것도 아니다.

내게 조그만 감각이라도, 마치 재능으로 착각할 법 한 아주 작은 감각이라도 있었다면
지금의 나와는 많이 달랐을 텐데.
//

Perceptive Pixels - 현 기술은 내 상상 이상을 달리고 있다Perceptive Pixels - 현 기술은 내 상상 이상을 달리고 있다

Posted at 2009. 1. 3. 23:11 | Posted in 이야기 방/IT 이야기
http://www.perceptivepixel.com

학부 수업 때 조교님이 세미나를 해 주시면서 소개해 주신 회사이다.
홈페이지를 들어가면 메인에 이 회사의 기술력을 볼 수 있는 데모 영상이 박혀 있다.

정말 3분 32초동안 얼떨떨 했다.

이 회사는 멀티 터치 기술을 개발 및 판매하는 회사이다.
(to develop and market the most advanced multi-touch systems in the world)
저렇게 큰 화면에서 멀티터치가 되니 손으로 직관적인 작업이 가능해지는 것은 물론,
두 손을 사용하니 작업속도도 향상, 여러 사람과의 협업까지도 가능해진다.

아직은 저런 기술들이 비싼 걸로 알고 있다. 구축도 어렵고.
저런 기술들이 실행활로 들어오게 되면 .... 어떨까-_-?;;

사실 나는 멀티터치를 경험해본 적이 없다.
잘 쓰지도 않는 pmp 를 가지고 터치스크린을 조금 경험해 본 정도다.
그래서 멀티터치와는 친하지 않아서 이에 대해 주구장창 얘기할 수가 없다는게 안타깝다.
저런 영상을 보면서, 저런 기술을 보면서 '대단하다'라고 감탄만 할 수 밖에 없다니 ㅠㅠ

언제쯤 되야 우물안 개구리에서 우물 입구 근처까지라도 다다를 수 있을까.
아직 한참 멀었다.
//

[Ruby] 웹 소스 긁어오기[Ruby] 웹 소스 긁어오기

Posted at 2009. 1. 1. 16:35 | Posted in 프로그래밍 언어/Ruby
웹 소스..라기 보단 웹 요청에 대한 결과물 html 소스라고 해야할까.
PHP에서 하던 것처럼 소켓으로 웹 페이지를 요청하여 그 결과를 받아오는 식으로 코딩하였다.

class TinyWebBrowser
    require 'socket'
   
def initialize(host, port)
       
@host = host
        @port = port
        @socket = TCPSocket.new(host, port)
    end
    def print_page(path)
        request = "GET #{path} HTTP/1.0\r\n"
        request += "Host: #{@host}\r\n"
        request += "Connection: Close\r\n\r\n"
        @socket.write(request)
        response = @socket.read
        return response.split("\r\n\r\n", 2) # 헤더와 웹 소스 분리
   
end
    def close_browser
        @socket.close
    end
end

if __FILE__ == $0
    wb = TinyWebBrowser.new('berorev.pe.kr', 80)
    header, body = wb.print_page('/index.php')
   
File.open('out.txt', 'w') do |fp|
        fp.puts body
   
end
    wb.close_browser
end

HTTP/1.1로 전송해 봤더니 결과의시작과 끝에 17856과 0 이라는 숫자가 붙어 있었다.
1.0으로 보내 봤더니 깔끔하네;; 이유는 잘 모르겠다..'ㅡ';;

여튼 print_page를 호출한 결과로 html 소스를 얻어 보통 정규식 등의 작업을 진행할 것이다.


그런데.... 이미 라이브러리로 만들어진 게 있네.. 이런!!
require 'net/http'
html = Net::HTTP.get 'berorev.pe.kr', '/index.php'
File.open('out2.txt', 'w') do |fp|
     fp.puts html
end

//