'My work space'에 해당되는 글 113건
- 2008.08.20 싱글톤패턴(Single Pattern)
- 2008.08.20 class 안에서 callback함수 사용과, callback 함수 안에서 class 멤버/함수 변수 접근하기
- 2008.08.20 Junit 이란?
- 2008.08.20 JUnit 이클립스 사용
- 2008.08.20 JUNIT 사용 가이드라인
- 2008.08.20 Enumeration & Iterator
- 2008.08.20 JDK5.0 새롭게 변화한 것 및 추가사항
- 2008.08.20 Ⅶ. Activity Diagram
- 2008.08.20 Ⅵ. Collaboration Diagram
- 2008.08.20 Ⅴ. Sequence Diagram
싱글톤(Singleton) Pattern 이란?
객체지향형언어(OOP)에 대해 조금이라도 파고든 사람이라면 싱글톤 패턴이라는
말을 들어봤을 것이다. 못들어봤다면 이제부터 들었다고 해라. 싱글톤이란 생성하고자
하는 인스턴스의 수를 오직 하나로 제한하는 디자인 패턴이다.
그렇다면 왜 싱글톤 패턴을 사용해야하는 것일까? 라는 질문에 대게 답하는 것이
여러개의 인스턴스를 생성하게 되면 가끔 프로그래머도 당혹스럽게 되는 서로의
인스턴스에 간섭을 하는 경우가 있다. 정말 재수 없는 일이 아닐 수가 없다.
public class Singleton
{
private static Singleton singleton = new Singleton();
protected Singleton()
{
System.out.println("Maked Singleton");
}
public static Singleton getInstance()
{
return singleton;
}
}
싱글톤의 기본형이다. singleton 멤버변수는 static 이어야한다는 것과 Singleton 클래스의
생성자는 private / protected 이어야한다는 것을 꼭 유념해야한다. private 일 경우는 결코
new 를 이용하여 인스턴스의 중복 생성을 방지하는 셈이기도 하나 상속이 되지 않는다는
단점이 있어 protected로 대게 선언한다.
뭐~ 싱글톤 패턴이 만들어졌나 아닌가 확인할 것이라면 Test 클래스를 만들어보자.
public class Test
{
public static void main(String [] args)
{
System.out.println("Singleton pattern");
Singleton sg1=Singleton.getInstance();
Singleton sg2=Singleton.getInstance();
if( sg1 == sg2 )
{
System.out.println("Equal");
}
else
{
System.out.println("Not Equal");
}
}
}
여기서 보면 Singleton 의 인스턴스를 생성하기 위해 getInstance() 메소드를 이용한다.
왜 그럴까? Singleton 클래스의 private static Singleton singleton = new Singleton();
부분을 유심히 바라보기 바란다. 이 singleton은 static으로 선언된다. 즉 하나의 인스턴스
singleton 만 생성하는 셈이다. 아마 결과도 Equal로 출력될 것이다.
'My work space > Java' 카테고리의 다른 글
자바와 MS Access DB연동 (0) | 2008.08.20 |
---|---|
Log4J비용계산 (0) | 2008.08.20 |
class 안에서 callback함수 사용과, callback 함수 안에서 class 멤버/함수 변수 접근하기 (0) | 2008.08.20 |
Junit 이란? (0) | 2008.08.20 |
JUnit 이클립스 사용 (0) | 2008.08.20 |
class 안에서 callback함수 사용과, callback 함수 안에서 class 멤버/함수 변수 접근하기

보통 class 안에서 선언된 callback함수는 접근이 안된다.
class T
{
public:
void CALLBACK test();
}
보통 이렇게 되어 있다고 하면 접근을 하기 위해서 static을 붙여주기도 한다.
class T
{
public:
static void CALLBACK test();
}
하지만... callback함수 안에서 다시 class 안에 있는 멈버 변수에 접근을 하지 못하게 된다.
내가 해결한 방법으로는
class 안에서 class 변수를 static으로 선언을 해주어서는 this 포인터로 접근하였다.
class T
{
private:
static T* m_pInstance;
public:
void CALLBACK test();
}
생성자에서는
T::T(void)
{
m_pInstance = this;
}
그리고 마지막으로 전역변수로
T* T::m_pInstance = NULL;
이렇게 하면 callback함수 안에서 class 암에 있는 멤버 변수에 접근이 가능하게 된다.
void CALLBACK T::test()
{
m_pInstance->변수이름;
m_pInstance->함수;
}
'My work space > Java' 카테고리의 다른 글
Log4J비용계산 (0) | 2008.08.20 |
---|---|
싱글톤패턴(Single Pattern) (0) | 2008.08.20 |
Junit 이란? (0) | 2008.08.20 |
JUnit 이클립스 사용 (0) | 2008.08.20 |
JUNIT 사용 가이드라인 (0) | 2008.08.20 |
xp: 주된작업이 코딩부분에 초점을 두고 있는 경량 개발 방법론
xp의 중심적인 중요사항 : 의사소통(communication), 단순성(simplicity), 피드백(feedback),자신감(courage)에 기초를 한다.
의사소통은 짝프로그래밍, 작업견해논의, 반복되는 계획을 수월하게 수용할수 있는가에 대한 중요요소,
단순성은 같은 내용을 과도하게 작성하지 않고 기본에 충실하여 간결한 구조를 처음부터 끝까지 유지하는데에 있다.
피드백은 매우중요하며 코드테스팅, 고객의 요구 사항, 부분적인 반복작업및 여러차례의 결과물인도, 짝프로그래밍/지속적인 코드 검토등의
과정에 의해 이루어진다.
자신감은 문제에 대해 바른 길이 무엇인지 적극적으로 판단하여 리팩토링을 할것인지, 코드를 버릴지, 프로젝트를 중단할지,
품질 요소를 높일 것인지에 대해 결정하는 것에 관한 사항이다.
켄트 벡은 책에서
열두가지의 중요 실천사항을 말하였는데
계획단계(planning game), 작은 규모 릴리즈(small releases), 단순한 설계(simple design), testing, 지속적인 통합(continuous integration),
리팩토링(refactoring) ,짝프로그래밍(pair programming), 코드공동소유(collective ownership), 40시간내 해결(40-hour week),
현장 고객 상주(on-site customer) , 메타포(metaphor), 코딩표준(coding standard)이다.
이중에서 자동화된 테스팅과 지속적인 통합을 수행하기위한 툴 사용에 초점을 둔다.
xp는 전체 테스팅을 한주, 한달, 끝날때 가 아닌 매일 하도록 권하고 있다.
통합 테스팅과 기능테스트를 매일 한다면 문제를 조기에 발견 하는 것이 가능할 것이다.
J2EE환경에서는 (시스템이 복잡한 경우가 대부분) 도구를 사용하여 통합 절차가 복잡한 시스템에서 지속적 통합을 위해
통합 절차를 자동화할 필요가 있다.
<<참고 : Java Tools for eXtreme Programming >>
==========================================================================
JUnit개요
test case는 일련의 테스트를 실행하기 위한 장치(fixture, 기능, 원시코드경로, 멤버 함수간의 상호작용)을 정의하는 것이다.
전형적으로 작성한 모든 클래스는 테스트 케이스를 가지고 있어야 한다.
테스트 Fixture는 테스트 수행에 필요한 자원 즉, 프리미티브 변수와 오브젝트를 제공하는 것
동일하거나 유사한 오브젝트에 대한 테스트가 두개 이상 있을 경우 테스트 환경을 셋업하기 위한 코드를 각 테스트에서
꺼내서 하나의 메소드에 넣어둔다.
동일한 호나경에서 실행되는 테스트를 위한 설정을 테스트 Fixture라고 한다.
테스트 스위트(test suite) 는 관련된 테스트 케이스를 모아 놓은 것을 말한다.
==========================================================================
Unit Test
JUnit의 사용법을 말하기 전에 도대체 테스팅이란 무엇인지 그 의미에 대해서 짚고 넘어가자.
테스트는 말 그대로 우리가 만든 프로그램이 원하는 대로 동작하는지 알아보는 것에 불과하다. 그렇다면 우리가 원하는 대로 동작하는지 알 수 있는 방법은 무엇이 있을까?
그것은 단 한가지이다.
기대값과 결과값을 비교한다.
우리가 기대하던 결과를 프로그램이 출력하는지를 살펴 보는것이 테스팅의 기본이고 끝이다.
유닛 테스트는 이러한 기대값과 결과값을 비교한다. TDD는 이러한 유닛 테스트를 기본으로 한다. 다만 테스트의 범위가 매우 작은것이 그 특징이라 할 수 있다.
비행기를 만들고 비행기가 날아가는 것을 보는것도 테스팅이지만 비행기의 부속하나하나 역시 테스트 하지 않던가?
TDD는 비행기를 테스트 하는것이 아니라 비행기의 부속 하나하나를 꼼꼼하게 테스트한다. 그리고 100% 그 테스트를 통과해야 한다.
<<출처 : http://wiki.tdd.or.kr >>
JUnit 사용법
http://www.junit.org 에서 junit.jar파일을 구하고 자바 클래스 패쓰에 다운 받은 jar파일을 설정한다.
그리고 에디터로 다음의 코드를 작성해 보자.
package tddbook;
import junit.framework.TestCase;
public class JUnitTutorialTest extends TestCase {
public JUnitTutorialTest(String arg0) {
super(arg0);
}
public void testNumber() {
int expected = 10;
assertEquals(expected, 2 * 5);
}
public static void main(String args[]) {
junit.textui.TestRunner.run(JUnitTutorialTest.class);
}
}
이것이 바로 JUnit을 이용한 테스트 코드이다. TestCase를 extends해서 testXXX메써드들을 테스트하고 있다.
위와 같은 모습의 코드가 전형적인 Junit을 이용한 코드의 틀이라고 할 수 있겠다. 위의 testNumber가 실제적인 테스트를 행하는 메써드이며,
이렇게 메써드명이 test로 시작하는 메써드들은 원하는 만큼 많이 만들어서 쓸 수가 있다.
그렇다면 testNumber메써드를 보자. assertEquals라는 TestCase를 통해서 extend받은 메써드를 이용하여 2*5의 결과값이 기대한 값 (expected)와 일치하는지를 비교한다.
위의 코드를 실행하면 다음과 같은 결과를 보게 된다.
.
Time: 0.01
OK (1 test)
자세히 보면 제일 윗줄에 점(.)이 하나 보이는데 이것은 test로 시작하는 메써드들의 갯수 즉, 테스트의 갯수를 의미한단.
다음의 Time은 테스트하는데 소요된 시간을 말하며 OK는 1개의 테스트가 성공했음을 알린다.
이렇듯 text로 그 결과를 보여주는 까닭은 우리가 main메써드에서 junit.textui.TestRunner을 사용했기 때문이며 이 외에도 awt나 swing을 이용한 visual한 결과를 볼 수도 있다.
see also : JunitGui - awt, swing을 이용한 유닛 테스팅
이번에는 테스트가 실패할 경우 어떻게 보여지는지 살펴보도록 하자. 다음과 같이 위의 코드를 수정해 보자.
package tddbook;
import junit.framework.TestCase;
public class JUnitTutorialTest extends TestCase {
public JUnitTutorialTest(String arg0) {
super(arg0);
}
public void testNumber() {
int expected = 10;
assertEquals(expected, 2 * 5);
}
public void testFailMessage() {
int expected = 10;
assertEquals(expected, 3*5);
}
public static void main(String args[]) {
junit.textui.TestRunner.run(JUnitTutorialTest.class);
}
}
testFailMessage라는 메써드를 추가했다. 코드를 보면 expected는 10이지만 3*5의 값은 10일리 없다.
위의 테스트 코드를 실행하면 다음과 같은 결과를 보게 된다.
..F
Time: 0.01
There was 1 failure:
1) testFailMessage(tddbook.JUnitTutorialTest)junit.framework.AssertionFailedError: expected:<10> but was:<15>
at tddbook.JUnitTutorialTest.testFailMessage(JUnitTutorialTest.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at tddbook.JUnitTutorialTest.main(JUnitTutorialTest.java:21)
FAILURES!!!
Tests run: 2, Failures: 1, Errors: 0
점 두개는 역시 테스트의 갯수를 말하며 그 옆의 F는 테스트가 실패(Fail)되었음을 말한다. There was 1 failure: 밑에는 실패한 이유와 trace가 보인다.
우리의 짐작처럼 기대값은 10인데 결과값이 15라서 AssertionFailedError가 발생했음을 알려준다.
마지막 줄은 총 2개의 테스트 중 1개의 Fail이 있고 Error는 0개임을 말한다. 테스트 코드에서 Fail과 Error는 다르다.
Fail은 우리가 테스트한 기대값과 결과값이 다를때 발생하지만 Error는 코드상의 오류나 NullPointerException같은 예측못한 Exception이 발생할 때 생긴다.
setUp & tearDown
setUp - JUnit 테스트 코드의 setUp 메써드는 특별한 의미이다. 주로 코드내에서 사용할 리소스를 초기화 시킬때 setUp을 이용한다.
즉, 각각의 테스트 코드가 항상 new Person()이라는 statement를 실행한다면 이것은 setUp에 선언해서 테스트 매써드가 실행될 때마다 수행하게 할 수 있는 것이다.
다시 말해 setUp은 각각의 testXXX메써드들이 수행되기 바로 직전에 매번 실행되는 것이다.
tearDown - setUp과 반대의 경우라고 생각하면 된다. testXXX매써드가 종료될 때마다 수행되는 매써드이다. 사용한 리소스를 클리어할때 주로 사용된다.
Examples.
package tddbook;
import junit.framework.TestCase;
import java.util.*;
public class TestSetupTearDown extends TestCase {
public TestSetupTearDown(String arg0) {
super(arg0);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(TestSetupTearDown.class);
}
Vector employee;
protected void setUp() throws Exception {
employee = new Vector();
}
protected void tearDown() throws Exception {
employee.clear();
}
public void testAdd() {
employee.add("Pey");
assertEquals(1, employee.size());
}
public void testCleared() {
assertEquals(0, employee.size());
}
}
JUnit Useful Methods
JUnit에서 가장 많이 사용되는 메써드는 assertEquals이지만 이 외에도 여러 유용한 메써드들이 있는데 그것에 대해서 알아보기로 하자.
assertTrue(X)
X가 참인지를 테스트한다.
assertFalse(X)
X가 거짓인지를 테스트한다.
assertNull(X)
X가 NULL인지를 테스트한다.
assertNotNull(X)
X가 NULL이 아닌지를 테스트한다.
fail(MSG)
무조건 실패시킨다 (MSG를 출력한다. ) 주로 Exception테스트를 할때 사용된다.
<< 출처 : http://www.yeonsh.com >>
JUnit Cookbook
A cookbook for implementing tests with JUnit.
간단한 Test Case
뭔가를 테스트하고 싶을 때 순서:
1. TestCase 클래스의 인스턴스를 만든다.
2. runTest() 메소드를 override한다.
3. 값을 검사하고 싶으면, assert()를 호출해서 테스트가 성공일 때 참이 되는 boolean을 전달한다.
public void testSimpleAdd() {
Money m12CHF= new Money(12, "CHF");
Money m14CHF= new Money(14, "CHF");
Money expected= new Money(26, "CHF");
Money result= m12CHF.add(m14CHF);
assert(expected.equals(result));
}
이미 작성한 테스트와 유사한 테스트를 다시 작성해야 한다면 대신 Fixture를 만든다. 만일 하나 이상의 테스트를 실행해야 한다면 Suite를 만든다.
Fixture
동일하거나 유사한 오브젝트에 대한 테스트가 두개 이상 있을 경우 테스트 환경을 셋업하기 위한 코드를 각 테스트에서 꺼내서 하나의 메소드에 넣어 둔다.
동일한 환경에서 실행되는 테스트를 위한 설정을 Fixture라고 한다.
처음 테스트를 작성할 때는 테스트 자체를 위한 코드보다는 테스트를 위한 환경 설정에 더 많은 시간이 들 것이다. Fixture를 작성해놓으면 다음에 테스트를 작성할 때 시간이 절약될 것이다.
공통 Fixture가 있을 경우 할 일:
1. TestCase 클래스의 서브 클래스를 만든다.
2. Fixture의 각 파트를 위한 인스턴스 변수를 추가한다.
3. setUp()을 override해서 변수를 초기화한다.
4. tearDown()을 override해서 setUp()에서 할당한 자원들을 해제한다.
public class MoneyTest extends TestCase {
private Money f12CHF;
private Money f14CHF;
private Money f28USD;
protected void setUp() {
f12CHF= new Money(12, "CHF");
f14CHF= new Money(14, "CHF");
f28USD= new Money(28, "USD");
}
}
Test Case
Suite
TestSuite는 많은 테스트 케이스들을 함께 실행할 수있다.
하나의 테스트 케이스를 실행하는 방법은 아래와 같다.
TestResult result= (new MoneyTest("testMoneyMoneyBag")).run();
두개의 테스트 케이스를 한번에 실행할 때는 아래와 같이 한다.
TestSuite suite= new TestSuite();
suite.addTest(new MoneyTest("testMoneyEquals"));
suite.addTest(new MoneyTest("testSimpleAdd"));
TestResult result= suite.run();
다른 방법은 JUnit으로 하여금 TestCase에서 suite를 추출하도록 하는 것이다. 그렇게 하기 위해서는 TestSuite의 생성자에 테스트 케이스의 클래스를 전달한다.
TestSuite suite= new TestSuite(MoneyTest.class);
TestResult result= suite.run();
테스트 케이스의 일부만 테스트할 때는 수작업으로 하나씩 지정하는 방법을 사용한다. 그 외의 경우에는 위와 같이 자동 추출되도록 하면 테스트 케이스를 추가할 때마다 지정하지 않아도 되므로 좋다.
TestSuite는 Test Interface를 implement하는 모든 오브젝트를 포함할 수 있다.
TestSuite suite= new TestSuite();
suite.addTest(Kent.suite());
suite.addTest(Erich.suite());
TestResult result= suite.run();
TestRunner
어떻게 테스트를 실행하고 결과를 수집할 것인가? JUnit은 실행할 suite를 정의하고 결과를 표시하기 위한 도구(TestRunner)를 제공한다. test suite를 넘겨주는 static method suite()를 사용하면 TestRunner가 suite에 접근할 수 있다.
예를 들어, TestRunner가 MoneyTest suite를 사용할 수 있게 하려면, 아래와 같은 코드를 MoneyTest에 추가한다
public static Test suite() {
TestSuite suite= new TestSuite();
suite.addTest(new MoneyTest("testMoneyEquals"));
suite.addTest(new MoneyTest("testSimpleAdd"));
return suite;
}
만일 TestCase가 suite 메소드를 정의하지 않는다면 TestRunner는 'test'로 시작하는 모든 메소드들을 추출해서 suite를 만들 것이다.
JUnit은 TestRunner 툴의 텍스트 버전과 그래픽 버전을 제공한다. junit.textui.TestRunner는 텍스트 버전이고 junit.ui.TestRunner와 junit.swingui.TestRunner는 그래픽 버전이다.
TestCase 클래스에 main()을 정의해놓으면 직접 TestRunner를 호출할 수도 있다.
public static void main(String args[]) {
junit.textui.TestRunner.run(suite());
}
위의 모든 방법으로 테스트가 정상실행되도록 하기 위해서는 CLASSPATH에 junit.jar 파일이 들어 있어야 한다.
'My work space > Java' 카테고리의 다른 글
싱글톤패턴(Single Pattern) (0) | 2008.08.20 |
---|---|
class 안에서 callback함수 사용과, callback 함수 안에서 class 멤버/함수 변수 접근하기 (0) | 2008.08.20 |
JUnit 이클립스 사용 (0) | 2008.08.20 |
JUNIT 사용 가이드라인 (0) | 2008.08.20 |
Enumeration & Iterator (0) | 2008.08.20 |
XUnit
XUnit의 X는 변수이다. 자바에는 JUnit이 있고 C++에는 CppUnit이 있으며 Python에는 PyUnit이라는 것이있다. 모두 각 언어에서 유닛테스트를 쉽게 해 줄 수 있는 도구이다. 필자는 이 곳의 예제를 가장 대중적인 언어인 자바로 선정했고 이곳에서 JUnit에 대해 잠시 살펴보고 넘어가도록 하자.
JUnit
JUnit은 자바 프로그래밍 시 Unit테스트를 쉽게 해주는 프레임 워크로 TDD의 창시자라고도 할 수 있는 Kent Beck과 디자인 패턴 책의 저자인 Erich Gamma에 의해서 작성되었다.
JUnit은 단 하나의 jar파일로 구성되어 있으며 사용법이 매우 간단한 것이 그 특징이라고 할 수 있겠다. 이 곳에서는 JUnit의 기본적인 사용법과 요새 자바 IDE로 크게 인기를 끌고 있는 Eclipse에서의 JUnit사용법을 함께 알아보자.
우선 실제로 JUnit을 어떻게 사용하는지 간단한 예제를 통해서 알아보자.
junit.jar파일은 http://www.junit.org 에서 다운로드 할 수 있으며, 만약 이클립스 사용자라면 plugin디렉토리에 디폴트로 설치가 되어 있는 것을 볼 수 있을 것이다.
이전에 작성했던 피보나치 수열을 Junit을 이용하여 재구성하면 다음과 같은 코드가 만들어지게 된다.
FiboTest.java <PRE>import junit.framework.TestCase;class Fibo { public int get(int n) { if (n==1 || n==2) return 1; return get(n-2)+get(n-1); }}public class FiboTest extends TestCase { public static void main(String[] args) { junit.textui.TestRunner.run(FiboTest.class); } public void testFibo() { Fibo fibo = new Fibo(); assertEquals(1, fibo.get(1)); assertEquals(1, fibo.get(2)); assertEquals(fibo.get(1)+fibo.get(2), fibo.get(3)); assertEquals(fibo.get(2)+fibo.get(3), fibo.get(4)); assertEquals(55, fibo.get(10)); }}</PRE>
FiboTest클래스는 main메써드의 junit.textui.TestRunner.run(FiboTest.class)를 호출함으로써 테스트가 진행된다. Junit은 FiboTest라는 클래스의 메써드중 test로 시작하는 이름의 메써드는 테스트 메써드로 자동인식하고 자동으로 실행을 시킨다. (java의 reflection을 이용한 방법이다.) 따라서 test로 시작하는 메써드가 10개라면 10개의 테스트 메써드가 실행될 것이다.
우리는 이전에 Fibo라는 클래스에 assertSame이라는 메써드를 직접 만들어서 테스트시 사용했었다. 하지만 junit을 이용하면 우리가 작성했던 assertSame과 동일한 역할을 하는 assertEquals라는 메써드(TestCase클래스의 메써드)가 존재한다. assertEquals메써드 역시 기대값과 결과값이 일치하는지를 조사해주는 역할을 담당한다.
정상적으로 junit.jar를 클래스패스에 등록해주고 위 프로그램을 실행하면 에러없이 테스트가 수행되는 것을 확인할 수 있다. 만약 테스트를 일부러 실패하도록 다음과 같이 수정하고 프로그램을 실행하면,
assertEquals(2, fibo.get(1));
다음과 같은 상세한 Trace를 구경할 수 있다.
<PRE>junit.framework.AssertionFailedError: expected:<2> but was:<1> at junit.framework.Assert.fail(Assert.java:47) at junit.framework.Assert.failNotEquals(Assert.java:282) at junit.framework.Assert.assertEquals(Assert.java:64) at junit.framework.Assert.assertEquals(Assert.java:201) at junit.framework.Assert.assertEquals(Assert.java:207) at FiboTest.testFibo(FiboTest.java:18) … 이하생략</PRE>
우리가 이전에 만들었던 assertSame메써드와 마찬가지로 expected : <2> but was : <1>라는 실패 원인에 대해서 친절하게 알려주고 있다.
이클립스에서 junit을 사용하기 위해서는 다음과 같은 절차를 밟아야 한다.
- 프로젝트 생성
- 프로젝트 Properties선택
- Java Build Path선택
- Add External JARs선택
- plugins / org.junit_3.8.1 / junit.jar 선택
- OK 선택
다음은 위와 같은 순서를 진행한 후의 필자의 이클립스 Package Explorer의 모양이다.
Java Project명은 tdd로 했고 junit.jar가 포함되어 있는 것을 확인할 수 있다. 새로운 TestCase(FiboTest.java)를 추가하기 위해서는
이클립스 메뉴의 위 버튼을 클릭하고 Junit TestCase를 선택하면 된다. 보통 테스트 클래스명은 테스트할 클래스명+Test로 하는 것이 일반적이다. 우리는 Fibo클래스를 테스트 할 것이므로 FiboTest로 하였다. (위 FiboTest.java참조)
새로운 FiboTest클래스를 생성하였다면 FiboTest.java를 위와 같이 타이핑하고 실행해보자. 실행은 이클립스의 다음 버튼을 누르고
Run As a Junit Test를 선택하면 된다. (한번 실행 후 단축키 Ctrl-F11을 눌러서 재실행할 수 있다.)
테스트를 실행하면 다음과 같은 결과를 볼 수 있을 것이다.
소요된 시간은 0.01 seconds이며 총 1개의 테스트중 1개가 실행되었고 Error는 0, Failures는 0임을 알려준다. 그리고 진행바는 초록막대기로 표시가 된다. 초록막대기의 의미는 테스트가 성공했음을 알려주는 표시이다.
만약 테스트를 일부러 실패하도록 코드를 다음과 같이 수정하고 테스트를 수행하면
<PRE>assertEquals(2, fibo.get(1));</PRE>
테스트는 실패하게 되고 다음과 같은 결과를 볼 수 있다.
제일 먼저 눈에띄는 것은 빨간 막대기로 이것은 테스트가 실패했음을 알려준다. 자세히 보면 Failures가 1로 바뀌었음을 알 수 있다. 또한 실패한 테스트 메써드명(testFibo)이 무엇인지 알려주고 있다.
Junit에서 Failure와 Error의 의미는 다음과 같이 구별된다. <PRE>Failure : 테스트의 기대값과 결과값이 틀린경우Error : 테스트 수행시 오류발생, NullPointerException과 같은 RuntimeError일 경우 발생한다.</PRE>
테스트가 실패한 경우에는 빨간 막대기가 있는 화면의 하단부분에 실패에 대한 Trace정보가 아래와 같이 표시된다.
이클립스는 Junit에 대한 준비가 잘 되어있는 훌륭한 IDE로 많은 자바 프로그래머들의 사랑을 받고 있다.
우리는 지금껏 junit의 TestCase 메써드중 assertEquals만을 살펴 보았는데 assertEquals외에도 여러 유용한 메써드들이 많이 있다. 이중에서도 가장 많이 사용되는 메써드들을 간단하게 알아보도록 하자.
<PRE>assertEquals(A, B)</PRE>
assertEquals는 A와 B가 일치하는지를 조사한다. A나 B에는 Object, int, float, long, char,boolean,,,등의 모든 자료형이 들어갈 수 있다. 단 A,B의 타입은 언제나 같아야만 한다.
<PRE>assertTrue(X)</PRE>
X가 참인지를 조사한다. X는 boolean형태의 값이어야 한다.
<PRE>assertFalse(X)</PRE>
X가 거짓인지를 조사한다. assertTrue와 정 반대의 메써드라 보면 되겠다. 역시 X는 boolean형태의 값이어야 한다.
<PRE>fail(message)</PRE>
테스트가 위 문장을 만나면 message를 출력하고 무조건 실패하도록 한다. 위 메써드는 주로 예외상황을 테스트하거나 아직 테스트가 끝나지 않았음을 명시적으로 나타내주기 위해 자주 사용되곤 한다.
[예외상황 테스트의 예] <PRE>try { userMethods.run(parameter.bad()); fail("should not reach here!"); }catch(UserException e) { assertEquals(-1, e.getErrorCode());}</PRE>
userMethods.run이라는 메써드에 임의로 비정상적인 파라미터를 입력했을 때 UserException이 꼭 발생해야 한다는 것을 의도하는 테스트이다. 만약 UserException이 발생하지 않는다면 fail문 때문에 테스트가 실패하게 되는 것이다.
<PRE>assertNotNull(Object X)</PRE>
X가 Null이 아닌지를 조사한다. 만약 Null이라면 assertionFailedError가 발생한다.
<PRE>assertNull(Object X)</PRE>
X가 Null인지를 조사한다. 만약 Null이 아니라면 assertionFailedError가 발생한다.
<PRE>assertSame(Object A, Object B)</PRE>
A와 B가 같은 객체인지를 조사한다. (주의: 우리가 Fibo클래스에서 직접 만들었던 assertSame과는 전혀 다른의미임)
이정도가 junit으로 테스트코드를 만들 때 가장 많이 사용하게 될 메써드가 될 것이다.
setUp & tearDown
이제 곧 여러분도 경험하게 되겠지만 테스트를 작성하다 보면 하나의 메써드로 모든걸 테스트할 수는 없게된다. 따라서 테스트 메써드의 숫자도 계속해서 증가해 나갈수 밖에 없는데 각각의 테스트 메써드가 공통적으로 사용하는 것을 매번 중복해서 적고 있는 자신을 발견하게 될 것이다.
setUp, tearDown메써드는 test로 시작하는 메써드와 마찬가지로 junit에서 자동으로 인식하는 메써드명이다. setUp메써드는 test로 시작하는 메써드가 수행되기 직전에 호출되고 tearDown메써드는 test로 시작하는 메써드가 종료된 직후에 호출된다.
setUp과 tearDown메써드를 적절히 활용하면 test로 시작하는 메써드들간의 중복을 제거할 수 있을 뿐만 아니라 각각의 테스트의 독립성을 보장할 수 있게 된다. 테스트의 독립성은 매우 중요한 이슈인데 하나의 테스트는 다른 테스트에 의해서 영향을 받지 않아야 함을 뜻한다. 만약 testB라는 메써드가 testA라는 메써드가 수행된 이후에 수행되어야 한다면 그 테스트는 벌써 독립성이 깨져버린 불안한 테스트가 되어 버리는 것이다.
[setUp메써드의 예] <PRE>import junit.framework.TestCase;class Fibo { public int get(int n) { if (n==1 || n==2) return 1; return get(n-2)+get(n-1); }}public class FiboTest extends TestCase { Fibo fibo; public static void main(String[] args) { junit.textui.TestRunner.run(FiboTest.class); } public void setUp() { fibo = new Fibo(); } public void testFibo() { assertEquals(1, fibo.get(1)); assertEquals(1, fibo.get(2)); } public void testFibo2() { assertEquals(fibo.get(1)+fibo.get(2), fibo.get(3)); assertEquals(fibo.get(2)+fibo.get(3), fibo.get(4)); assertEquals(55, fibo.get(10)); }}</PRE>
위에서 보았던 FiboTest클래스를 위와 같이 구성하여도 동일한 결과가 나온다. fibo객체를 setUp메써드에서 미리 생성해주고 그 이후에 testFibo, testFibo2메써드가 수행되도록 한 것이다. 위와같이 setUp메써드를 구성하면 test로 시작하는 각각의 메써드에서 fibo객체를 만들 필요가 없다. setUp에서 이미 생성되기 때문이다.(물론 testFibo에서 사용했던 fibo객체와 testFibo2에서 사용한 fibo객체는 다른 것이다.)
출처 : http://wiki.tdd.or.kr/wiki.py?TddTutorial.JunitTutorial
'My work space > Java' 카테고리의 다른 글
class 안에서 callback함수 사용과, callback 함수 안에서 class 멤버/함수 변수 접근하기 (0) | 2008.08.20 |
---|---|
Junit 이란? (0) | 2008.08.20 |
JUNIT 사용 가이드라인 (0) | 2008.08.20 |
Enumeration & Iterator (0) | 2008.08.20 |
JDK5.0 새롭게 변화한 것 및 추가사항 (0) | 2008.08.20 |
![]() |
![]() |
'My work space > Java' 카테고리의 다른 글
Junit 이란? (0) | 2008.08.20 |
---|---|
JUnit 이클립스 사용 (0) | 2008.08.20 |
Enumeration & Iterator (0) | 2008.08.20 |
JDK5.0 새롭게 변화한 것 및 추가사항 (0) | 2008.08.20 |
Ⅶ. Activity Diagram (0) | 2008.08.20 |
Iterator : jdk 1.2버젼에서 개발된 것으로, Collection 인터페이스를 구현한 모든 클래스에서 사용가능.
API를 확인해볼까요??
Vector와 HashTable에 있는 메소드입니다.
하지만, ArrayList, LinkedList, HashMap에서는 찾아볼 수 없었습니다.
iterator는 HashTable이든 HashMap이든, Vector든 LinkedList든,
모두 쓸 수 있다는 것이죠.
Iterator에 대해서는 저번에 알아봤으니까.
이번에는 Enumeration의 API를 간단하게 뒤져봐야겠네요.
hasMoreElements
<PRE>boolean hasMoreElements()</PRE>- Tests if this enumeration contains more elements.
- Returns:
true
if and only if this enumeration object contains at least one more element to provide;false
otherwise
nextElement
<PRE>E nextElement()</PRE>- Returns the next element of this enumeration if this enumeration object has at least one more element to provide.
- Returns:
- the next element of this enumeration.
- Throws:
NoSuchElementException
- if no more elements exist.
이것 또한 Iterator의 next()와 같아 보이는군요..ㅋㅋ
Vector의 요소들을 출력하는 예제입니다.
<PRE>
System.out.println(e.nextElement());
}
Enumeration과 Iterator의 가장 큰 차이점은 바로 Snap Shot입니다.
Enumeration은 Snap Shot을 지원합니다. 여기서 'fail-fast'라는 개념이 나오는데요.
Iterator는 fail-fast 방식이라고 합니다.
그럼 과연 이것이 무엇일까요?? 좋은 아티클이 있어서 긁어왔습니다...-ㅅ-;;
자바 2 이전 버전에서 사용되던 Vector, Hashtable의 뷰 객체인 Enumeration은 fail-fast 방식이 아니었으나, 자바 2의 콜렉션 프레임워크에서 콜렉션 뷰인 Iterator, ListIterator 객체는 fail-fast 방식이라는 점이다.
콜렉션 뷰는 콜렉션 객체에 저장된 객체들에 대한 순차적 접근을 제공한다. 그러나, 뷰 객체인 Enumeration 또는 Iterator 객체를 얻고 나서 순차적 접근이 끝나기 전에 뷰 객체를 얻은 하부 콜렉션 객체에 변경이 일어날 경우, 순차적 접근에 실패하게 된다. 여기서 변경이라는 것은 콜렉션에 객체가 추가되거나 제거되는 것과 같이 콜렉션 구조의 변경이 일어나는 경우를 말한다.
이런 상황은 멀티쓰레드 구조와 이벤트 구동 모델에서 일어날 수 있으며, 개발자가 혼자 테스트할 경우 발견하기 어려운 문제이다. 따라서 정확한 이해와 예상이 필요하며, 이에 대한 대처 방안을 마련해야 한다.
하부 콜렉션 객체에 변경이 일어나 순차적 접근에 실패하면 Enumeration 객체는 실패를 무시하고 순차적 접근을 끝까지 제공한다. Iterator 객체는 하부 콜렉션 객체에 변경이 일어나 순차적 접근에 실패하면 ConcurrentModificationException 예외를 발생한다. 이처럼 순차적 접근에 실패하면 예외를 발생하도록 되어 있는 방식을 fail-fast라고 한다.
Iterator는 fail-fast 방식으로 하부 콜렉션에 변경이 발생했을 경우, 신속하고 결함이 없는 상태를 만들기 위해 Iterator의 탐색을 실패한 것으로 하여 예외를 발생하며, 이렇게 함으로써 안전하지 않을지도 모르는 행위를 수행하는 위험을 막는다. 왜냐하면 이러한 위험은 실행 중 불특정한 시간에 멋대로 결정되지 않은 행위를 할 가능성이 있기 때문에 안전하지 않다고 할 수 있기 때문이다.
멋집니다..-ㅅ-; 더이상 설명할 것이 없을 것 같은데요.
흐음.. 일단 정리를 해보면, iterator는 일종의 pointer가 있습니다.
예전에 LinkedList 개념을 그림으로 그려보았는데요.
그거랑 매우 비슷합니다.
포인터가 Array의 자기자신과 다음 객체를 가르키는 것이지요.
그래서 위에 아티클에 써져있는 것처럼 삭제나 수정시 참조무결성 원칙에 어긋나게되어서
에러가 발생하게 되는것입니다.
아티클에 SnapShot에 대한 좋은 내용도 있더군요.
스냅샷
이처럼 콜렉션 뷰 객체인 Iterator와 ListIterator 객체가 fail-fast 방식인 이유는 스냅샷에 대한 보장을 포함하고 있지 않기 때문이다. 즉, 콜렉션의 뷰인 Iterator 객체를 얻었을 때 그 순간의 상태를 따로 생성하지 않기 때문에, Iterator 객체에서 순차적으로 하부 콜렉션 객체를 접근할 때, 콜렉션 객체의 변경에 영향을 받게 된다.
따라서, 콜렉션 뷰인 Iterator를 통하여 순차적 접근을 행하는 도중에 하부 콜렉션 객체에 변경이 일어날 가능성이 있는 경우 스냅샷을 명시적으로 생성하는 것이 좋다. ArrayList를 이용한 스냅샷을 생성하는 간단한 방법은 다음과 같다.
<PRE class=code>return new ArrayList(collection).iterator();
}
이렇게 스냅샷을 이용하면 스냅샷이 생성된 순간의 상태에 대하여 Iterator를 통한
콜렉션의 뷰를 생성하게 된다. 하부 콜렉션의 변경이 일어나도 스냅샷에는 반영되지
않으며 Iterator는 실패없이 실행된다.</PRE>
콜렉션 계열 중에 ArrayList를 사용하는 이유는 다른 콜렉션 계열 클래스들보다 생성과순차적 접근이 빠르기 때문이다. ArrayList가 삽입과 삭제에 불리한 단점이 있으나
이 경우에는 삽입과 삭제가 없으므로 고려되지 않는다.
조금 더 쉽게 정리를 해보자면,
Enumeration은 객체를 복사해서 저장합니다. 그래서 삭제나 수정시 전체 콜렉션에는
큰 타격을 주지 않는다는 것이죠.
제가 원래 알고 있던 지식은 "Enumeration은 동기화를 지원한다." 였는데,
어디서 잘 못 주워들었나봅니다. -ㅛ-
아티클에 <<콜렉션 프레임워크의 클래스들은 동기화를 보장하고 있지 않다.>>
라고 써져있더라구요. 그래서 찾아보았습니다. 역시 API에서 Enumeration부분을 봐도,
동기화에 대해서 정의된 부분은 찾을 수 없더라구요.
하지만, Vector와 ArrayList의 차이점을 공부한 글에서도 알 수 있을 듯이
Vector는 동기화가 아주 넘쳐납니다-ㅅ-; 그러한 사실은 이클립스에서 Vector.class를
가보면, synchronized로 도배가 되어있는 것을 볼 수 있답니다.
아티클에는,
<<멀티쓰레드에서 콜렉션 구현 객체에 동시에 추가, 삭제를 위한 접근이 행해진다면, 그러한 행위가 발생하는 부분에 동기화를 명시적으로 해주어야 한다.>>
라고 써져있더군요. 방법까지 친절하게 명시해주고 있었습니다.
요렇게-ㅅ-;
"스냅샷을 지원하느냐 하지 않느냐" 라는 것 같습니다.
아티클에서는 "Fail-fast Iterator에 대한 멀티쓰레드 무결성 해결방법" 이라는 제목아래 글을 써내려가고 있는데요. 스냅샷과 동기화가 Iterator의 멀티쓰레드 무결성 해결방법으로 제시되었고, 그와 함께 예시 소스코드도 보여주고 있습니다. 그러니까 Iterator가 스냅샷을 지원하지 않아도, 스냅샷을 명시적으로 생성할 수 있다는 것입니다. 이런건 한번 소스코드를 작성해봐야 확실히 알 수 있겠네요.
'My work space > Java' 카테고리의 다른 글
JUnit 이클립스 사용 (0) | 2008.08.20 |
---|---|
JUNIT 사용 가이드라인 (0) | 2008.08.20 |
JDK5.0 새롭게 변화한 것 및 추가사항 (0) | 2008.08.20 |
Ⅶ. Activity Diagram (0) | 2008.08.20 |
Ⅵ. Collaboration Diagram (0) | 2008.08.20 |
1. Generic Type: collection은 대부분 런타임시 에러가 체크가 되었지만, 이 타입을 사용하면, 컴파일시 타입에러를 알수가 있다.
ex) Collection에서 Map<String,String> dataMap = new HashMap<String,String>();
와일드 카드이용 Vector<? extends Object> list = new Vector<String>();
기존의 방식은 데이터형의 안전성이 코딩단계에서 걸러지지 않고, 실행단계에서 영향을 미치게 되는 것이다. 또한 프로그래머가 해당 컬렉션에 저장된 클래스 인스턴스의 데이터형에 대해서 사전에 알아야만 캐스팅을 할 수 있다는 번거로움이 있다.
public class Common<T>{
public T member;
public void setMember(T mem){
this.member = mem;
}
}
Generic의 이용
Commom<String> common = new Common<String>();
2. 메타데이터
3. 개선된 루프
반복코드
}
4. 오토박싱/언박싱 : primitive타입과 클래스간에 자동 형변환!
5. static import
유틸리티성 메소드들은 정의할 때 static 으로 정의하고 사용할 때는
객체를 생성하지 않고 바로 사용합니다.
예를 들면 콘솔에 글자를 출력하기 위해서 사용하는
System.out.println("화면에 출력합니다");
이것일 것 같습니다. ^^
static import 를 사용하면 다음과 같이 사용할 수 있습니다.
import static java.lang.System.out;
사용할 때는
out.println("화면에 출력합니다.");
앞에 클래스명을 생략할 수 있습니다.
하나더 예를 든다면
import static java.lang.System.out;
import static java.lang.Math.*;
이렇게 import 한 후에
out.println( round(1.3) );
이렇게 사용할 수 있습니다.
6. formatter와 Scanner : C언어와 같은 printf메소드 지원
7. Varargs(Variable Arguments)
파라미터가 몇개가 들어올지 모른다는 것을 의미한다.
arg는 배열타입이다.
인자선언에서 마지막 인자로 사용되어야 한다.
비정형 인자는 한번만 사용할 수 있다.
8. Simple RMI interface generation기법
9. JDBC RowSets
1,4,6번정도는 실제 개발시 많은 도움이 될거 같습니다.
'My work space > Java' 카테고리의 다른 글
JUNIT 사용 가이드라인 (0) | 2008.08.20 |
---|---|
Enumeration & Iterator (0) | 2008.08.20 |
Ⅶ. Activity Diagram (0) | 2008.08.20 |
Ⅵ. Collaboration Diagram (0) | 2008.08.20 |
Ⅴ. Sequence Diagram (0) | 2008.08.20 |
1. Activity Diagram 개요
① 정의 : 처리 로직이나 조건에 따른 처리흐름을 순서에 따라 정의한 모델
② 작성목적
* 처리순서 표현 (대상에 관계없이..)
* 비즈니스 프로세스 정의(이 용도로 가장많이 사용됨) : 업무의 As-is분석, To-be 분석 가능
* 프로그램 로직 정의 : 처리흐름의 도식화로 프로그램 로직 정의 가능
* 유즈케이스 실현
③ 작성시기 : 그 시점이 한정되어 있지 않고 다양하게 사용 가능
* 업무 프로세스 정의 시점.
* 유즈케이스 정의서 작성 시, 처리절차 기술할 때
* 오퍼레이션 사양 정의시
④ 작성순서
* 작성대상 선정 : 업무프로세스 모델링, 오퍼레이션 사양 정의
↓
* Swim lane 정의 : 대상영역에 명확한 역할을 정의해야 할 때.
↓
* 처리절차 모델링 : 시작점, 끝점 반드시 표현.
2. Activity Diagram 구성요소
① Things
* Activity : 행위나 작업 ( 내부적으로 구조를 가지는 단위0
ex) 상품조회, 구매결정, 결재내용입력, 결재자지정....
* Initial State : ● * Final State : ⊙
* Decision(Branch) : ◇
* Synchronization bar : 병렬처리절차가 시작되거나 모이는 지점
ex)
② Relationship
* Transition(전이) : 하나의 액티비티가 행위를 완료하고 다른 액티비티로 처리순서가 옮겨
지는 제어흐름 표현
③ Swim lane : 하나의 처리를 구분지음.
3. Activity Diagram 사례
① SCM 시스템의 일반 정보에 대한 Role 액티비티 다이어그램
* AS-IS
* TO-BE
→ 모든 사용자에게 일반정보를 제공했던 것을 등록여부와 거래품목 등록여부 확인 후
등록된 사용자에게만 일반정보 제공.
② 프리즘에서 유지보수 절차 프로세스를 정의한 액티비티 다이어그램
출처
'My work space > Java' 카테고리의 다른 글
Enumeration & Iterator (0) | 2008.08.20 |
---|---|
JDK5.0 새롭게 변화한 것 및 추가사항 (0) | 2008.08.20 |
Ⅵ. Collaboration Diagram (0) | 2008.08.20 |
Ⅴ. Sequence Diagram (0) | 2008.08.20 |
Ⅳ. Class Diagram (0) | 2008.08.20 |
1. Collaboration Diagram 개요
① 정의 : Sequence Diagram과 같으며 모델링공간에 제약이 없어 구조적인 면을 중시 가능.
② 작성목적
* 객체간 동적 상호작용을 구조적 측면을 중시하여 작성
* 객체를 더욱 상세히 정의
* 유즈케이스 실현
* 프로그래밍 사양 정의
③ 작성시기 : 유즈케이스 작성 후부터 코딩 전.
※ 시퀀스 다이어그램과 콜레보레이션 다이어그램 중 하나만 작성하면 됨.
④ 작성순서 : Sequence Diagram과 동일.
2. Collaboration Diagram 구성요소
① Thing
* Actor : Sequence Diagram과 동일
* Object : Sequence Diagram과 동일
② Relationship
* Message
- Flat Flow of Control
- Nested Flow of Control
- Asynchronous Flow of control
- Return Flow
* Link : 객체와 객체간 연관관계.
메시지는 링크를 따라 움직이므로 객체가 통신하려면 링크되어 있어야 함.
3. Collaboration Diagram 사례
모듈. Use case Diagram, Use case/ 6. 유즈케이스 정의서의 사례/ 사례 2를
컬레보레이션 다이어그램으로 작성한 것입니다. 이 IS 운영시스템을 개발하는 프로젝트
에서는 실제로 작성하지 않았습니다. 앞의 자기진단에서 언급한 것처럼 케이스 도구를
이용하여 시퀀스 다이어그램에서 컬레보레이션 다이어그램을 만들었습니다.
시퀀스 다이어그램에서는 메시지가 위에서 아래로 시간 순서대로 흐르는데,
컬레보레이션 다이어그램에서는 Numbering을 통해서 순서가 나타납니다. 이 또한,
케이스 도구로 컬레보레이션 다이어그램을 자동 생성할 경우, 자동으로 Numbering이
됩니다.
출처
|
'My work space > Java' 카테고리의 다른 글
JDK5.0 새롭게 변화한 것 및 추가사항 (0) | 2008.08.20 |
---|---|
Ⅶ. Activity Diagram (0) | 2008.08.20 |
Ⅴ. Sequence Diagram (0) | 2008.08.20 |
Ⅳ. Class Diagram (0) | 2008.08.20 |
Ⅲ. Use Case Diagram, Use Case 정의서 (0) | 2008.08.20 |
1. Sequence Diagram 개요
※ UML은 기존에 제공하지 못했던 객체간 동적 상호 작용을 제공한다.
이를 Interaction이라 하는데 UML에는 Sequence Diagram과 Colleboration Diagram이
Interaction Diagram에 속한다.
① 정의 : 문제해결에 필요한 객체를 정의하고 객체간 동적 상호관계를 시간순서에 따라 정의.
② 작성목적
* 객체간 동적 상호작용을 시간적 개념을 중시하여 모델링
* 객체의 오퍼레이션과 속성을 상세히 정의
* Usecase를 실현
* 프로그래밍 사양 정의
③ 작성시기 : 유즈케이스 다이어그램 정의 후부터 프로그램 코딩전
④ 작성순서
* 작성대상 선정 : 유즈케이스를 선정하고 유즈케이스 정의서 분석
* 액터 위치시킴 : 액터는 좌측부터 위치..
* 클래스 위치시킴 : 유즈케이스에 참여하는 클래스 위치.
* 객체간 메시지정의 : 시간순서대로 객체간 메시지 정의
* 객체 추가정의 : 요구사항 처리를 위해 필요한 객체가 정의되지 않았으면 추가 정의.
2. Sequence Diagram 구성요소
① Thing
* Actor : Usecase에서의 actor.
* Object : 클래스의 인스턴스. 클래스 타입으로 선언된 변수형태로 존재.
② Rlationship
* Message : 객체와 객체가 통신하는 유일한 수단
- Flat Flow of Control : 가장 일반적 메시지
- Nested Flow of Control : 메시지가 중첩 시 메시지가 모두 돌아와야 다음 처리진행
- Asynchronous Flow of control : 메시지의 결과를 기다리지 않고 다음 처리 진행
- Return Flow : 메시지를 처리한 결과. 필요한 경우에만 사용.
③ etc
* Life Line : 객체의 생존기간. 점선에 X표시가 객체가 소멸하는 시점.
* Activation : 객체가 활성화 되어있는 기간. -점선표기
객체가 외부 메시지를 받고 보낸 메세지를 기다리는 기간.-좁고긴시각형
3. Sequence Diagram 사례
① 설계단계 Sequence Diagram
② 상세설계단계 Sequence Diagram
|
단계 설계단계 상세설계단계
------------------------------------------------------------------------------------
Actor User Buyer System User
------------------------------------------------------------------------------------
Boundary 객체 SearchItemGroupListUI ListItemGroupUI
------------------------------------------------------------------------------------
Control 객체 ItemGroupCtl ICCMItemGroup(<<interface>>)
------------------------------------------------------------------------------------
Entity객체 ItemGroupEty CMItemGroupDAO(<<DAO>>),
CMItemGroupVO(<<VO>>)
------------------------------------------------------------------------------------
requestItemGroupInfo listItemGroup
------------------------------------------------------------------
메시지 searchItemGroupInfo listItemGroup
(searchArg:CMListSearchArg)
------------------------------------------------------------------
searchItemGroupInfo listItemGroup
(searchArg:CMListSearchArg,
con:Connection)
------------------------------------------------------------------------------------
모듈. Use case Diagram, Use case/ 6. 유즈케이스 정의서의 사례/ 사례 2를 시퀀스 | ||||||||||
|
ex) 앞서 언급한 회계 시스템 시퀀스 다이어그램
|
|
출처
|
'My work space > Java' 카테고리의 다른 글
Ⅶ. Activity Diagram (0) | 2008.08.20 |
---|---|
Ⅵ. Collaboration Diagram (0) | 2008.08.20 |
Ⅳ. Class Diagram (0) | 2008.08.20 |
Ⅲ. Use Case Diagram, Use Case 정의서 (0) | 2008.08.20 |
Ⅱ. UML구성요소 (0) | 2008.08.20 |