2007. 11. 13. 02:25

메타모델과 스테레오타입에 대한 이해를 돕는 한장의 그림

Figure 4: Metamodel and model approach

발췌한 글 논지의 중심에 선 그림은 아니지만, 글 자체보다는 이 그림이 확 시선에 들어왔다.

모델러가 모델을 그릴 때는 메타를 염두해야 한다.
메타(Meta)라는 말을 알 필요는 적다.
더구나 거북한 단어니까 가급적 남용할 필요도 없다.
다만, 어떤 기준을 가지고 모델을 도출하고 표현해야 하는데 그 기준이 곧 메타라 할 수 있다.

UML로 객체지향 모델링을 하면 가장 기본적인 단위가 클래스이다.
클래스 역시 일종의 타입이 된다.
모델링을 하면 구체적인 타입으로 클래스 이름이 부여된다.
클래스라는 타입과 개별 클래스 사이에서의 구분이 요구되는 경우는 거의 늘상 일어난다.
가령, 한국과 개별 번지 사이에 구분이 필요한 것처럼 세상은 무척 복잡하기 때문이다.

그래서, UML에서 확장방안으로 제공하는 것이 스테레오타입(stereotype)이다.
그렇다고, 반드시 스테레오 타입에 메타 타입을 부여해야 할 이유는 전혀 없다.
모델은 의사소통을 위한 것이라는 대전제를 잊지 않는한 그야말로 아무거나 부여할 수 있다.
'왜 그런 것을 스테레오타입으로 부여하느냐'라고 묻는 분들에게 대답을 준비할 필요는 있다.

하지만, 효용성의 관점과 형식적 완성이 늘 부합하지는 않는다.

그래도 우리는 선택의 자유가 있다. ^^

나는 대개의 경우 둘 사이의 조화를 찾으려고 노력한다. 조화가 궁극에 다다르면 오늘 조엘이 올린 글에 소개된 다리처럼 우아함을 갖게 된다.



하지만, 소프트웨어 개발에서는 우아함만 고수하기엔 현실이 척박하다. 따라서, 둘 중 하나를 포기해야 할 상황이 발생하고... 나는 어느 때고 효용성을 택한다. 그리고, 그래야 한다고 떠들고 다닌다. (그래서, Pragmatic 시리즈가 너무 좋다. ^^)

어디까지나 순전히 가상상황이지만, 내가 어떤 제품을 쓰는데 클래스나 메소드이름을 영문과 숫자가 섞인 12자리 암호로 정해야 한다면 어떻게 할 것인가? 스테레오타입에 한글 클래스명을 넣겠다. UML만 공부한 사람이 '쟤는 UML 알긴 하는거야' 라고 코웃음 칠 수 있지만... 나는 UML을 졸업했으니까, 굳이 규정(disciplines)에 얽매일 필요는 없다.

규칙과 원칙(principle)이 충돌하면, 원칙을 새우기 위해서 새 규정을 만들어야 한다.

Trackback 0 Comment 0
2007. 10. 29. 22:26

Creating a Custom Event

e333. Creating a Custom Event

A new custom event must extends EventObject. Moreover, an event listener interface must be declared to allow objects to receive the new custom event. All listeners must extend from EventListener.

This example demonstrates all the steps necessary to create a new custom event.

// Declare the event. It must extend EventObject.
public class MyEvent extends EventObject {
    public MyEvent(Object source) {
        super(source);
    }
}
    
// Declare the listener class. It must extend EventListener.
// A class must implement this interface to get MyEvents.
public interface MyEventListener extends EventListener {
    public void myEventOccurred(MyEvent evt);
}
    
// Add the event registration and notification code to a class.
public class MyClass {
    // Create the listener list
    protected javax.swing.event.EventListenerList listenerList =
        new javax.swing.event.EventListenerList();

    // This methods allows classes to register for MyEvents
    public void addMyEventListener(MyEventListener listener) {
        listenerList.add(MyEventListener.class, listener);
    }
 
    // This methods allows classes to unregister for MyEvents
    public void removeMyEventListener(MyEventListener listener) {
        listenerList.remove(MyEventListener.class, listener);
    }
    
    // This private class is used to fire MyEvents
    void fireMyEvent(MyEvent evt) {
        Object[] listeners = listenerList.getListenerList();
        // Each listener occupies two elements - the first is the listener class
        // and the second is the listener instance
        for (int i=0; i<listeners.length; i+=2) {
            if (listeners[i]==MyEventListener.class) {
                ((MyEventListener)listeners[i+1]).myEventOccurred(evt);
            }
        }
    }
}

Here's an example of how to register for MyEvents.
MyClass c = new MyClass();
    
// Register for MyEvents from c
c.addMyEventListener(new MyEventListener() {
    public void myEventOccurred(MyEvent evt) {
        // MyEvent was fired
    }
});

[출처] http://www.exampledepot.com/egs/java.util/CustEvent.html

Trackback 0 Comment 0
2007. 9. 3. 16:35

Concurrent VS Parallel (병렬 VS 병행)

@ 병렬 : 여러개의 일이 동시에 실행되는 것 처럼 보이지만 결국에 한번에 한가지 일이 실행됨.

@ 병행 : 실제로 여러개의 일이 동시에 실행됨. CPU가 여러개

Trackback 0 Comment 1
  1. 지나그 2018.05.20 15:54 address edit & del reply

    @ 병렬 : 실제로 여러개의 일이 동시에 실행됨. CPU 수만큼동시적으로 일어남

    @ 병행 : 여러개의 일이 동시에 실행되는 것 처럼 보이지만 결국에 한번에 한가지 일이 실행됨. 하나 cpu 에서 작업을 나눠 동시적으로 실행함.

2007. 7. 25. 15:48

Java Vector, ArrayList, LinkedList 차이점

Trackback 0 Comment 0
2007. 7. 10. 14:22

Java Exception 자바 예외처리

예외란 무엇이며 또 에러와는 어떻게 다른가?

우리가 소스를 컴파일 하다보면 잘못된 문법이나 변수이름등의 식별자를 잘못씀으로써 컴파일타임에 에러가 발생할 수 있다. 이런 것들은 컴파일러가 다 잡아주기 때문에 문법을 잘 수정하면 된다. 그러나 컴파일시 발생하는 문법적 예외말고도 다양한 방법으로 프로그램의 실행을 방해할 수 있는 요소가 발생할 수 있을 것이다.


   예를 들어 실제 물리적인 파일을 다루기 위해 자바에서는 File클래스를 이용한다. 이때 아직 존재 하지 않는 파일도 File클래스의 객체로 만들어 쓸 수 있다. 왜냐 새로 파일을 만들 경우를 대비해서. 그러므로 File클래스의 생성자는 별다른 예외가 없다고 간주하여 예외에 대한 발생을 명시하지 않는다.


그러나 파일을 통해서 그 파일을 읽어드리거나 쓰고자 하는 상황은 약간 다르다. 아직 존재하지 않는 파일이야 만들면 되지만 만들어지지도 않은 파일로 부터 어떠한 내용을 읽어 오는 것은 불가능한 일이다. 따라서 FileInputStream(파일읽기)과 FileOutputStream(파일쓰기)클래스의 생성자는 프로그래머가 아직 존재하지 않는 파일을 두 클래스의 생성자의 파라미터로 쓰는 경우를 대비해서 FileNotFoundException예외를 발생한다고 명시해 놓았다.


이처럼 예외란 버그(프로그램이 우리가 원하는 방식으로 동작하지 않는: 프로그램 자체의 논리적인 오류)나 문법적 에러와는 또 다르게 컴파일시점과 실행시간에 프로그램의 흐름을 방해하는 모든 프로그램밍적 상황을 의미한다고 할 수 있다. 그래서 예외(Exception)라고 부르는 모양이다. 자바에서는 예외를 발생시키는 것을 '던진다(thorw)'고 표현하며 그 예외를 처리하는 것을 잡는다(try ~ catch)고 표현하여 예외가 발생되는 시점을 나누어 처리하도록 하고 있다.


자바 언어는 이러한 예외에 대해서도 언어차원에서 접근하게 하기 위하여 예외를 클래스로 나누었다. 예외의 최상위에는 Throwable이라는 클래스가 있으면 이것을 직접적으로 상속받는 Error와 Exception으로 나뉜다. 자바에서는 크게 잡을 수 있는(try~catch나 throws로 처리가능한) 예외와 잡을 수 없는 예외(처음부터 코드의 수정을 필요로 하는)로 구분하는데 잡을 수 없는 예외로는 Error 클래스의 자식들인 AWTError, LinkageError, ThreadDeath, VirtualMachineError와 Exception의 자식 클래스중 RuntimeException이 있다.    


RuntimeException에는 우리가 프로그램을 실행시간에 발생하는 예외로서 발생하면 사람 머리를 아프게 만드는 악덕한 넘들로써 ArithmeticException, ClassCastException, IllegalArgumentException, IllegalStateException, IndexOutOfBoundsException, Negative-ArraySizeException, NoSuchElementException, NullPointerException,SecurityException 등을 자주 볼수 있다.

Trackback 0 Comment 1
  1. 어우냐아 2007.11.02 13:17 address edit & del reply

    Exception 부분을 찾고 공부를 하고 있었는데, 많은 공부와 참고가
    되었습니다. ^^ 감사합니다.