지연된 객체 (Deferred Object) 만들기 – Java 편

자스 편은 내가 제이쿼리의 지연된 객체를 연구하면서 나온 심플한 결과 되시겠다.

그리고 타 사이트에 올렸기 때문에 존댓말을 썼지만 여기서는 내 일기장같은 존재라서 그런지 존대말 쓰기 귀찮다.

어쨌든 지연된 객체를 어떻게 자바에서 만드나? 구현된 예제를 통해 알아보자.

public class DeferredObjectSample {
    //이벤트 담을 필드
    private DeferredDoneEvent event;
    //초기화시 몇초 기다릴건지 스레드 초기화
    public DeferredObjectSample(final int second){
       
        System.out.println(“작업 시작!”);
        System.out.println(second+“초 후 작업이 끝난다!”);
        //스레드 하나 만들고
        new Thread(new Runnable() {
           
            @Override
            public void run() {
                try {//지정된 초동안 잠들다가
                    Thread.sleep(second*1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                done();//내부 메서드로 종결.
            }
        }).start();//스레드는 바로 시작.
    }
    //실제 이벤트 실행부
    private void done(){
        if(this.event!=null) this.event.done();
    }
    //이벤트 정의부
    public DeferredObjectSample done(DeferredDoneEvent event){
        this.event=event;
       
        return this;
    }
    //이벤트를 담을 인터페이스
    public interface DeferredDoneEvent{
        public void done();
    }
    //콘솔 프로그램으로 예제를 꾸며보자.
    public static void main(String[] args){
        //5초 후 콘솔 내용 표시 이벤트를 정의한 지연된 객체를 만들자.
        new DeferredObjectSample(5).done(new DeferredDoneEvent() {
           
            @Override
            public void done() {
                System.out.println(“작업이 끝나부렀어.”);
            }
        });
    }
}

<

p>알다시피 자바스크립트는 싱글 스레드다. 그래서 스레드 관리하는 녀석이 없다. (굳이 있다면 Web Worker 가 있지만.)

그리고 자바는 일단 여러 스레드를 물릴 수 있다. 관리하는 클래스와 메서드도 제공한다.

자바와 자바스크립트는 완전 다른 언어다. 나 깜짝놀랐다. 아직도 자바와 자바스크립트를 같은 녀석으로 보다니.. 창피하다.

제발 구분하자.

어쨌든, 자바는 7부터 비동기 프로그래밍을 쉽게 제공할 수 있는 환경을 제공했다. 근데 7 쓰는 업체는 눈씻고 찾아봐도 없더라.

어떤새끼가 자바 7로 되면서 더 구려졌다고 한다. 내가 써본 결과 좋기만 하다. 그딴 개소리나 생각 가지고 있으면 집어 치우도록.

대부분 시니어 개발자가 자기 먹고살기 위한 포석 유지하기 위해서 하는 일종의 “개소리 중 개소리” 니 절대 선동당하지 말자.

만약 신규 자바 프로젝트를 계획하는가? 그러면 주저없이 최신 자바를 사용하라. 보안, 안정성, 성능 측면에서 절대 이득이다.

기존 프로젝트 개선이나 고도화, 기존 프레임워크로 만드는 프로젝트라면 말을 안하는데 완전 쌩 처음으로 시작하는 프로젝트라면 제발 보안 구리고 환경 구리구리한 옛날 자바는 인간적으로 좀 쓰지 말자.

하지만 대부분이 잘 안쓰는 관계로 5~6 개발자를 위해 내가 신경 좀 썼다. 근데 의외로 간단하다.

바로 쓰레드를 이용하는 것이다. 쓰레드로 비동기 프로그래밍은 당연히 가능하다.

소켓 서버나 스케줄러 만들어봤다면 더욱 더 와닿을 것이다.

자바는 인터프리터 언어는 아니기 때문에, 일반적인 sleep 걸고 변수 바뀌길 기다리는 것은 멍청한 짓이다.

메모리 뙇 정의해 놓고 실행하기 때문에, 실행부가 끝날때까지 실행부 안에서 sleep 걸어봐야 그대로다. 햇갈리지 말자.

자바 컴파일 후 class 내용볼 줄 안다면 당신은 이미 무릎을 탁 치고 넘어갈 것이다.

어쨌든 스레드를 하나 만들고, 거기서 몇초 재우고 깨운 다음, 다시 내부 메서드를 실행하는 것으로 끝난다.

쓰레드 영역으로 나간 메서드는, 객체와 따로 논다.

비유해볼까? 유치원이 있다. 애들 몇명 왔는지 세기 위해 교실에 불러들인다. 이 상황으로 가정한다.

객체는 문을 닫아버리고 애들 수를 센다. 그리고 애들 수 다 세면 그때서야 문을 연다고 보면 된다. 만약 중간에 빠진 애들 몇명이 온다면? 문 열때까지 대기했다가 문열면 그제서야 들어간다. 그런 꼴이 되겠다.

근데 쓰레드를 쓰면? 일단 문을 닫는건 동일하다. 애들을 세다가 빠진 애들이 보이면 쓰레드로 쓸 애 하나 불러서 빠진 애들 몇명을 찾으러 간다. 그럴려면 문을 열고 나가야겠지. 지정된 시간동안. 5분이던 10분이던, 

그러다가 애들 찾고 오면 문열고 다시 교실로 들어간다. 그럼 빠진 애들은 채워지고 원래 있던 애들과 이제 들어온 애들까지 다 세고 애들 출석 끝나면 이제 문을 연다.

이런 차이라고 비유하면 비유 좀 되겠지?

글로 설명해도 못알아듣는 개발자는 당장 구글에 자바 스레드 검색해서 강좌나 팁을 얼렁 익히고 구현해 보도록!

composite / 2013년 9월 16일 / 미분류
태그:, , , , , ,

답글 남기기

Your email address will not be published / Required fields are marked *