전치 연산자를 다음과 같이 함수를 선언함으로써 중첩시킬 수 있습니다.

반환형 operator op (매개변수)

여기서 op는 중첩시킬 연산자 입니다. 따라서 ++ 연산자를 다음과 같은 모양으로
void operator++ ()

// 전치연산자(PreFix Operator)를 중첩(Overloading) 시키기.
#include <iostream>
using namespace std;

typedef unsigned short USHORT;
class Counter
{
public:
 Counter();
 ~Counter() {}
 USHORT GetItsVal() const { return itsVal; }
 void SetItsVal(USHORT x) { itsVal = x; }
 void Increment() { ++itsVal; }
 void operator++ () { ++itsVal; } // 재정의하고 싶은 연산자

private:
 USHORT itsVal;
};

// 디폴트 생성자 초기값 0
Counter::Counter():itsVal(0) {};
 
int main()
{
 Counter i;
 cout << "The value of i is " << i.GetItsVal() << endl;
 i.Increment();
 cout << "The value of i is " << i.GetItsVal() << endl;
 ++i;
 cout << "The value of i is " << i.GetItsVal() << endl;

 return 0;

}

함따라 봤는데 진짜 신기한군요.

신고

포인터 : 포인터란 메모리 주소를 가리킬 수 있는 변수

포인터를 이해하기 위해서는 여러분은 컴퓨터의 메모리에 대해 조금 알아야 합니다. 컴퓨터의 메모리는 그 위치를 가리키는 연속적인 번호가 붙여진

부분으로 나누어질 수 있습니다. 각 변수는 메모리의 각 유일한(주소라고 함)을 가리키고 있습니다.

 

#include <iostream>

using namespace std;

 

int main()

{

    unsigned short shortVar = 5;

    unsigned long longVar = 65535;

    long sVar = -65535;

 

    cout << "shortVar:" << shortVar << "\t";

    cout << "Address of shortVar:";

    cout << &shortVar << "\n";

 

    cout << "longVar:" << longVar << "\t";

    cout << "Address of shortVar:";

    cout << &longVar << "\n";

 

cout << "sVar:";

    cout << sVar << "\t Address of sVar:";

    cout << &sVar << "\n";

 

    return 0;

 

}

 

 

여러분이 각 변수의 실제의 주소를 숫자로 알아야 할 이유는 없습니다. 중요한 것은 각 변수는 자신의 주소를 갖고 또 그 변수의 형만큼의 길이를

갖는다는 것입니다. 여러분은 변수형을 선언함으로써 컴파일러에게 그 변수형에 해당하는 길이 만큼의 메모리를 잡아 놓을 것을 말해줍니다.

컴파일러는 자동적으로 그 변수의 주소를 할당합니다. 예를 들어, long 정수형은 4바이트이고 이는 메모리에서 4바이트를 차지한다는 의미입니다.

 

포인터에 주소를 저장

모든 변수는 주소를 갖고 있습니다. 주어진 변수를 몰라도 여러분은 주소를 포인터에 저장할 수가 있습니다. 예를 들어, howOld가 정수형이라고 합

시다. howOld의 주소를 저장할 포인터를 pAge라 하면 여러분은 다음과 같이 쓸 수 있습니다.

Int *pAge = 0;

이 선언은 pAge가 정수형의 변수 주소를 가리키는(정수형의 포인터라고 한다.) 변수라는 뜻입니다. 다시 말해 pAge는 정수형의 주소를 가지도록

선언되었습니다.

pAge는 변수 입니다. 여러분은 정수형 변수를 선언하면 그 변수에 저장되는 내용은 정수로 해석됩니다. 여러분이 pAge를 포인터로 선언했으면

pAge에 저장되는 내용은 주소로 해석됩니다. pAge는 변수는 변수이되 그 내용이 약간 다를 뿐입니다.

여기의 예에서 pAge는 0으로 초기화되어 있습니다. 그 값이 0인 포인터를 널 포인터라고 합니다. 모든 포인터는 그들이 생겨날 때 어떤 값으로 초기

화가 됩니다. 포인터에 어떤 값을 초기화시켜야 할지 모르겠거든 0으로 초기화합시다. 초기화 되지 않은 포인터를 와일드(wild) 포인터라고 합니다.

♨ 주의 포인터는 항상 초기화 합시다.

여러분이 포인터를 0으로 초기화했다면 언젠가는 howOld의 주소를 pAge에 저장해야 합니다. 다음과 같이 저장합니다.

Unsigned short int howOld = 50; // 변수를 만듦

Unsigned short int *pAge = 0; // 포인터 만듦

pAge = &howOld; // howOld의 주소를 pAge에 저장

줄여서 unsigned short int *pAge = &howOld; // 포인터르 만듦

이제 pAge는 howOld의 주소를 저장하는 포인터입니다. pAge를 사용하여 여러분은 실제적으로 howOld의 값을 알 수 있습니다.

포인터 pAge를 사용하여 howOld에 접근하는 것을 간접 지정(indirection)이라 합니다. 왜냐하면 pAge를 경유하여 howOld로 접근하기 때문입니다.

간접지정 : 포인터에 지정된 주소값을 통해 원래의 변수에 접근하는 방식을 의미합니다. 포인터는 그 안에 지정된 주소값을 통해 그 주소에 저장된

값을 알 수 있는 간접적인 방식을 제공합니다.

 

포인터 이름

포인터는 일반 C++에서 가지는 변수명을 가질 수 있습니다. 이 책에서는 일단 포인터는 p로 시작하는 작명방식을 쓰고자 합니다.

 

간접 지정 연산자

간접 지정(indirection) 연산자(*)는 조회 연산자(dereference)라고도 부릅니다. 포인터가 조회되었을 때 그 포인터에 저장된 주소에 있는 값이 검색됩

니다. 일반적인 변수들은 그 값에 직접 접근 방식을 제공합니다. 가령 여러분이 yourAge라 불리는 unsigned short 정수형을 선언했다면, 여러분은

howOld의 값을 그 새로운 변수에 저장할 수 있습니다.

Unsigned short int yourAge;

yourAge = howOld;

포인터에는 원하는 값의 주소가 저장되어 있으므로 간접 지정 방식을 통해 접근합니다. 포인터 pAge를 통해 yourAge에 howOld 값을 저장하려면 다

음과 같이 합니다.

Unsigned short int yourAge;

yourAge = *pAge;

pAge 앞에 붙어있는 간접 지정 연산자(*)는 '이 주소에 저장된 값'을 의미합니다. 따라서 둘째 줄은 다음과 같이 해석됩니다. 'pAge에 저장된 값(이는

주소를 가리킴)을 가져와, 이 주소가 가리키는 곳으로 찾아가 저장된 값을 찾아 yourAge에 저장합니다.'

*pAge = 5; // 값 5를 pAge 안에 지정된 주소 위치에 저장하라.

 

포인터, 주소, 변수

포인터라는 변수

그 포인터 변수에 저장된 주소값

그 포인터 변수에 저장된 주소값이 가리키는 메모리를 찾아가면 저장되어 있는 실제값

Int theVariable = 5;

Int *pPointer = &theVariable;

theVariable은 5로 초기화된 정수형 값입니다.

pPointer는 정수형 값이 저장되는 주소를 저장하는 포인터입니다.

 

포인터를 사용한 자료 연산

포인터가 변수의 주소값을 할당받았다면, 그 변수의 자료에 접근하기 위해 여러분은 포인터를 쓸 수가 있습니다.

 

 

#include <iostream>

using namespace std;

typedef unsigned short int USHORT;

 

int main()

{

    USHORT myAge; // 변수

    USHORT *pAge = 0; // 포인터

myAge = 5;

        

    cout << "myAge:" << myAge << "\n";

 

    pAge = &myAge;

 

    cout << "*pAge:" << *pAge << "\n\n";

    cout << "*pAge = 7 \n";

 

    *pAge = 7; // sets myAge to 7

 

    cout << "*pAge:" << *pAge << "\n";

    cout << "myAge:" << myAge << "\n\n";

 

    cout << "myAge = 9\n";

 

    myAge = 9;

 

    cout << "myAge:" << myAge << "\n";

    cout << "*pAge:" << *pAge << "\n\n";

    

    return 0;

 

}

 

 

 

 

주소 관찰

포인터는 여러분이 주소를 실제 그 주소를 정확히 알지 못하더라도 연산할 수 있게 해줍니다. 오늘 이후로 포인터에 변수의 주소를 대입하면 그 주소

가 대입이 되고 그 포인터는 그 변수의 주소를 가지고 있다는 것을 자신 있게 알게 될 것입니다.

 

포인터가 가리키는 주소에 저장된 값에 접근하려면 간접 지정 연산자(*)를 씁시다.

모든 포인터를 유효한 주소값이나 널(0)로 초기화합시다.

포인터에 저장된 주소값과 그 주소의 메모리에 저장된 값을 구별할 줄 압시다.

 

포인터를 선언하려면 저장되는 주소가 가리키는 값의 변수형 또는 객체형을 쓰고, 포인터 연산자를 쓰며(*) 그 포인터의 이름을 씁시다.

Unsigned short int *pPointer = 0;

포인터에 값을 저장하거나 초기화할 때 저장하고자하는 주소의 변수명 앞에 주소 연산자(&)를 붙여 대입합니다.

Unsigned short int *pPointer = &theVariable;

포인터를 소환하려면 소환연산자(*)를 포인터 앞에 붙입니다.

Unsigned short int theVariable = *pPointer;

 

도대체 왜 포인터를 쓰는가?

 

여태껏 여러분은 변수의 주소를 가리키는 포인터에 대해 자세히 배웠습니다. 그런데 여러분은 이렇게 복잡한 방식이 맘에 안들 것입니다. 왜 값에

직접 접근할 수 있는 변수가 있는데 포인터를 쓰는 것일까요?

 

포인터 용도

- 자유 기억 장소의 자료를 다룰 때

- 클래스 멤버 자료와 클래스 멤버 함수에 접근할 때

- 함수에 주소 전달을 할 때

 

스택과 자유 기억 공간(Free Stor)

- 전역 공간

- 자유 기억 공간

- 레지스터

- 코드 영역

- 스택

 

지역 변수는 함수의 매개 변수와 함께 스택에 저장됩니다. 코드는 코드 영역에 저장되고 전역 변수는 전역 공간에 저장됩니다. 레지스터는 여러 잡다

한 일들을 합니다.(예를 들어, 스택의 꼭대기와 명령 포인터를 계속 추적하는) 그리고 나머지의 메모리는 자유 기억 공간(free store)로 분류되는데 힙

(heap)이라고 불립니다.

 

지역 변수의 문제점은 영원히 지속되지 않는다는 것입니다. 함수가 반환되면 지역 변수들은 버려집니다. 또한 전역 변수들은 그 문제를 해결했지만

프로그램의 모든 부분에서 제한 없이 접근할 수 있다는 대가를 치러야 합니다.

 

전화기에는 메모리 기능이 있습니다. 김군 집의 전화번호는 1번 단추에, 이군 집의 전화번호는 2번 단추에 기억을 시켜 넣는 것입니다. 이렇게 하면

여러분은 친구 집에 전화를 걸려고 일일이 그 번호를 다 입력을 하지 않아도 됩니다. 그 전화번호는 어디 구석에 넣어둡니다. 여러분이 번호 하나만

누르면 전화가 알아서 찾아가 줍니다. 그 자세한 전화번호는 무엇인지 모릅니다. 하지만 그 집에 통화는 할 수 있습니다.

여러분은 컴퓨터의 메모리에 주소를 통해 접근할 수 있습니다. 이는 실제 전화 번호 입니다. 하지만 여러분은 실제 메모리의 주소를 몰라도 됩니다.

단지 포인터에 잡아넣으면 됩니다. 특정 번호만 누르면 됩니다. 포인터는 여러분이 여러분의 자료에 자세한 주소를 몰라도 접근할 수 있게 해줍니다.

 

포인터는 간접 접근 방식으로 자료에 접근할 때 강력한 도구를 제공합니다. 모든 변수는 주소를 가지고 있는데 이는 주소 연산자 &를 통해 얻을 수

있습니다. 이 주소가 포인터에 저장됩니다.

포인터는 그 포인터가 가리키는 객체의 형을 쓰고 간접 연산자(*)를 붙인 뒤 포인터의 이름을 써서 완성시킵니다.

포인터는 객체, 또는 널을 가리키게 하여 초기화시킵니다.

간접 연산자(*)를 사용하여 포인터에 저장된 주소값을 접근합니다.

     상수형 포인터를 선언하여 그 포인터에 다른 객체의 주소를 대입할 수 없게 하고 또 상수형 객체의 포인터를 선언하여 포인터가 가리키는 값을 바꿀

수 없게 할 수 있습니다. 힙에 new 객체를 만들어 포인터에 그 값을 대입할 수 있습니다. Delete 예약어를 호출하여 메모리를 풀어놓을 수 있습니다.

Delte는 메모리를 풀어놓지만 그 포인터를 파괴하지는 않습니다. 따라서 다른 주소값을 그 포인터에 저장할 수 있습니다.

 

간만에 포인터에 대해서 함 공부하면서 정리한 내용들은데 역시 포인터는 잘쓰면 해가 되고 잘못사용 독이 된다는 사실을 알았습니다…

신고
  1. 배열

    배열은 동일한 형식의 데이터 메모리 상의 연속된 공간에 저장하는 구조를 말합니다.

    장점 : 데이터를 처음부터 끝까지 차례로 처리하는 등의 일을 매우 빠른 속도로 수행할 수 있다는 장점이 있습니다.

    단점 : 배열은 저장 공간이 한정되기 때문에 크기를 늘리거나 중간에 데이터를 삽입하기가 어렵습니다.

    예를들어 100개의 배열을 잡아놓고 사용하다가 101번째 데이터를 저장하려면 101개의 데이터가 들어갈만한 영역에 배열을 새로 잡아야 한다.

     

  2. 리스트

    리스트는 하나하나가 따로 저장됩니다. 데이터들의 저장위치가 포인터로 줄줄이 연결됩니다.

    노드 : 데이터가 저장되는 공간

    링크 : 노드를 연결하는 포인터

    모든 노드가 포인터로 연결되어 있기 때문에 첫번째 노드의 포인터만 기억하고 있으면, 리스트에 저장된 모든 노드를 찾아갈 수 있다.

    데이터의 추가, 삭제가 빈번한 응용에는 배열보다 리스트를 사용하는 것이 좋습니다.

     

  3. 맵은 디셔너리라고도 하고, 해시 테이블 이라고도 합니다. 데이터가 키 값과 함께 저장될 때 맵 구조를 사용하면 좋습니다.

    예를들어 사전처럼 어떤 단어와 그 단어의 뜻을 함께 저장한다고 할 때, 단어는 키가 되고, 그 단어의 뜻은 데이터가 됩니다.

    맵과 일반배열의 차이점

    100대의 차를 주차할 수 있는 주차장에 차를 넣고 넣고 빼는 예를 들어보겠습니다.

    여기서 주차장은 데이터를 저장할 배열이고, 자동차는 데이터, 자동차의 번호가 키 값이라고 생각하시면 됩니다.

    일반 배열 같으면

    1. 들어오는 순서대로 주차장에 넣을 겁니다.
    2. 나중에 차 주인이 차를 빼러 오면 몇 번째 칸에 주차를 했는지 인덱스를 기억하던가
    3. 자신의 차를 발견할때까지 첫번째 칸부터 차례로 찾아보야 합니다.

    맵을 이용하면

    1. 차를 주차할 때부터 키 값을 이용합니다.
    2. 주차장에 100대의 차를 주차할 수 있으니까 자동차 번호의 뒷자리 두 개를 가지고 저장될 위치를 결정하면 되겠네요.

 

  1. MFC 배열 클래스

클래스

데이터 형식

CByteArray

Byte

CDWordArray

DWORD

CObArray

CObject*

CPtrArray

Void*

CStringArray

CString

CUIntArray

UINT

CWordArray

WORD

 

  1. MFC 배열 클래스들의 주요 맴버 함수

함수

기능

SetSize

배열의 크기를 지정합니다.

GetSize

현재 배열에 저장된 항목의 개수를 반환합니다.

GetAt

지정된 인덱스에 저장된 값을 반환합니다.

SetAt

지정된 인덱스에 값을 저장합니다.

Operator[]

GetAt,SetAt 함수의 기능을 할 수 있습니다.

예) array.SetAt(3,10); -> array[3] = 10;

예) int a = array.GetAt(3); -> int a = array[3];

Add

배열의 저장된 항목을 1개 늘리고, 여기에 새로운 값을 추가합니다.

InsertAt

지정된 인덱스에 새로운 항목을 삽입합니다.

RemoveAt

지정된 인덱스의 항목을 삭제합니다.

RemoveAll

배열의 모든 항목을 삭제합니다.

 

InsetAt, RemoveAt, Add 등의 함수는 배열의 속성상 하기 힘든 일을 억지로 시키는 함수들입니다. 이 함수를 호출하는 것은 쉽지만, 그 대가는 생각보다 큽니다. 예를 들어, InsertAt 함수를 호출하여 배열의 6번째 항목에 새로운 값을 추가하도록 하면, 6번째 항목 이후의 모든 값이 뒤로 한 칸씩 밀려야 하기 때문에 배열의 크기가 큰 경우에는 메모리에서 많은 양의 데이터가 이동해야 합니다. 우리는 배열의 속성을 잘 이해하고 있으므로 InsertAt, RemoveAt, Add 함수와 같이 비용이 큰 함수는 불 필요하게 남발하지 말아야 겠습니다.

신고
필요하시면 보시고, 댓글은 필수!

신고

c#환경변수 설정

실행--> CMD 상에서 C#컴파일 가능

내컴퓨터 -->속성-->고급-->환경변수-->PATH(편집) 에 CSC.EXE 파일이 있는경로를 설정C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

(보통 알집으로 설정이 되어있지만 상관말고 밀어버리셈..)

해주면 CMD(도스 커맨드창) 어느곳에서든 CSC 컴파일이 가능

 출처:// 내 머리 중추신경 어딘가에서..


신고

COM(Component Object Model)은 Visual C++를 비롯한 다양한 언어로 만들어서 배포할 수 있으며,

DLL이나 EXE 파일처럼 이진코드(binary)에서의 표준을 말한다. COM을 만드는 것은 어떤 언어든 관계가 없으며

단지 COM 표준을 잘 지켜서 만들면 된다. COM은 다음과 같이 발전해 왔다.

 

메인프레임 -> 클라이언트/서버 -> 3 tier 클라이언트/서버(분산 컴퓨팅 환경)

 

분산 컴퓨팅 환경에서 응용 프로그램을 어떻게 구성하고 묶어나가는가는 중요한 문제로 떠올랐으며,

이를 해결하기 위해 컴포넌트에 기반한 객체 기술이 생겨났다. 컴포넌트 기반 기술은 각 회사별로 다음과 같다.

 

윈도우:

마이크로소프트 - COM/DCOM, COM+

 

유닉스:

OMG(object management group) - CORBA

선마이크로시스템즈 - EJB(enterprise java beans)

 

다음은 COM의 발전사이다.

 

OLE(object linking and embedding) - 객체(엑셀,워드,비트맵)를 서로 연결하고 포함하는 기술로써

      DDE(dynamic data exchange)를 사용하여 구현.

 

OLE2 - DDE의 문제점을 개선. 이때부터 COM이라 부름.

 

-------------------------------*^^*-----------------------*^^*----------------------------

 

COM 용어

 

COM 인터페이스 - C++에서 볼 수 있는 가상 함수 테이블. 우리는 이 가상함수 테이블의 포인터를 얻는

                           것을 QueryInterface() 함수를 통해 구현할 수 있다.

메서드 - COM 인터페이스가 제공하는 함수를 메서드(method)라 부른다.

IUnknown 인터페이스 - 모든 COM 프로그램이 반드시 상속 받아야 하는 인터페이스로, QueryInterface(),

                                 AddRef(), Release() 메서드(함수)를 갖고 있다.

CoClass - 하나 이상의 인터페이스와 실제 구현 코드. CoClass는 하나 이상이 모여서 DLL 또는 EXE 파일로

               컴파일되어 저장된다.

COM 오브젝트 - CoClass가 메모리에 로드되어 객체화된 상태

COM 서버 - 기능을 제공하는 프로그램(DLL 또는 EXE)

COM 클라이언트 - DLL 또는 EXE를 사용하는 프로그램

GUID - Globally Unique IDentifier. 전세계적으로 유일한 값(ID)으로 16바이트(128bits)로 구성, GUID는

          네트워크 카드의 물리적인 주소(48비트), 1582년 이후의 10억분의 1초(60비트), 기타(20비트)로 구성.

CLSID - COM객체마다 유일한 GUID.

IID - CoClass의 인터페이스마다 유일한 GUID.

HRESULT - COM에서 사용되는 함수가 리턴하는 값. S_OK, E_NOTIMPL, E_NOINTERFACE 등.

COM 라이브러리 - COM을 지원하기 위한 운영체제의 함수들. 보통 CoXXX()처럼 호출됨.

ProgID - GUID를 대신해서 사용할 수 있는 문자열로 구성된 ID. (예-Excel.Application.12)

 

 

COM 응용 기술

 

자동화(Automation) - IDispatch 인터페이스를 통해 COM을 제어하는 기술.

OLE 문서 - IOleContainer, IOleObject 등의 인터페이스를 통해 서로 데이터를 공유하는 기술.

클립 보드 - IDataObject 인터페이스를 통해 데이터를 주고 받는 기술.

드래그 앤 드롭 - IDropTarget, IDropSource 등의 인터페이스를 사용하며, 마우스로 데이터를 끌어다

                       놓고 전송하는 기술.

ActiveX 컨트롤 - 일반적인 컨트롤처럼 사용될 수 있으며, 비주얼 베이직, 웹페이지에 삽입될 수 있음.

                        다른 말로 OLE 컨트롤이라고도 부름. 확장자가 OCX 임.

 

퍼온글 : http://cafe.naver.com/pplus.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=140

신고

1) 객체 모델링

객체 : 사물을 뜻함

객체 모델링 : 객체를 클래스라는 프로그램으로 적용하는 것이다.

예) 급여의 속성 - 기본급,세금,초과근무시간

급여의 동작 - 초과근무시간 계산, 세금계산, 급여계산

객체 모델링 - 특징

특징

맴버변수

기본급

basicSalary

초과근무시간

overTime

이름

name

객체 모델링 - 동작

동작

메소드

초과근무시간계산

overTimeAllowanceCompute()

세금계산

taxCompute()

급여계산

salaryCompute()

2) 클래스의 정의

- 클래스 이름 : Salary

public class Salary

{

int basicSalary; // 기본급

String name; // 이름

int overTime; // 초과근무시간

// "초과근무수당 계산"을 메소드로 구현

public int overTimeAllowanceCompute()

{

return overTime*20000;

}

// "세금 계산"을 메소드로 구현

public double txzCompute()

{

return (basicSalary+overTimeAllowanceCompute())*0.1;

}

// "급여 계산"을 메소드루 구현

public int salaryCompute()

{

return (int)(basicSalary+overTimeAllowanceCompute()-taxCompute());

}

}

- 제어자 : 클래스 및 클래스의 멤버를 정의할 때 필요한 것(접근제어자, 키워드)

- 클래스 멤버 : 메소드, 멤버 변수

class modifier(클래스 제어자)

public,abstract, final

constructor modifier(생성자 제어자)

public,protected,private

method modifier(메소드 제어자)

public,protected,private,abstract,static,

final,native,synchronized

member variable modifier

(맴버 변수 제어자)

public,protected,private,final,static,

transient,volatile

- 클래스 제어자

public : 클래스명과 파일명이 같아야 한다.

abstract : 추상 클래스, 상속을 통해 완성 된다.

final : 상속을 할 수 없는 클래스, 상속을 금지 한다.

예외) 조합을 해서 사용할수 있으나, abstract, final은 같이 쓸 수 없다.

- 생성자 : 객체를 생성할 때 반드시 필요한 것, 생성자를 기술하지 않으면 자바 가상머신이 기본 생성자(default constructor)를 생성한다.

- 메소드 제어자

native : java class에서 C/C++ 언어를 구현할 때 쓰임.

synchronized : 멀티 쓰레드를 제어할 때 사용하는 것.

- 멤버 변수 제어자

transient : 저장시 영구기억장치(하드디스크)에 저장되지 않는다.

volatile : 쓰레드 간에 공유하는 데이터로서 일관성을 유지할 때 사용된다.

- 클래스 사용 방법

선언한 클래스를 사용하기 위해서 클래스는 메모리를 할당 받아야 한다.

객체생성 : 클래스의 객체(인스턴스)를 생성해야 한다.

자바 : 클래스의 객체(인스턴스)를 생성할 때 new라는 키워드를 사용해서 생성한다.

Salary s = new Salary()

레퍼런스타입 클래스의 인스턴스, 객체생성 생성되는 객체 타입

레퍼런스 변수

해당 클래스에 생성자가 없으면 자바 가상머신이 디폴트 생성자를 생성한다.

UML 다이어그램 표현

Salary

basicSalary

name

overTime

멤버변수

+inputData

+overTimeAllowancecompute

+taxCompute

+salaryCompute

+outputData

+main

메소드


신고

상속이란 ?

객체지향 프로그램에서 가장 중요한 부분이다. 객체지향의 개념중에서 가장 중요한 ‘코드의 재사용’을 프로그램으로 구현하는 부분이기 때문이다. 새로운 클래스를 생성할 때 처음부터 새로 작성하는 것이 아니라, 기존의 정의된 클래스로부터 중복되는 부분을 물려받아서 사용할 수 있다. 이렇게 되면 우리는 새로운 클래스에서 추가되는 부분만 고심해서 프로그래밍하면 된다.

장점 - 프로그램 전체를 새로 개발하는 것이 아니므로 프로그램 개발 기간의 단축과 비용의 감소를 가져올 수 있고, 실제 시스템에서 안정적으로 돌아가는 코드 부분을 사용하기 때문에 시스템이 더 안정적이다.

서브클래스(sub class), 자식 클래스(child class), 파생 클래스(derived class) - 새로 작성해서 기존의 코드를 가져다 쓰는 클래스가 상속을 받는 클래스를 말함.

슈퍼클래스(super class), 베이스 클래스(base class), 부모 클래스(parent class) - 기존에 이미 만들어져서 상속해주는 클래스를 말함.

상속은 'is a' 관계로 표현한다.

“Human is a Mammal" (사람은 포유류이다)

포유류의 종류 중에서 사람이라는 하나의 종류로 특성화(구체화)됨을 보여준다.

서브 클래스는 슈퍼 클래스가 가지는 멤버 변수나 메소드를 모두 사용할 수 있다.

즉, 부모의 것은 내 것이다.

object 클래스의 정의 -

object 클래스는 모든 클래스의 최상위 클래스이다.

extends를 쓰지 않은 클래스를 선언해도, 그것은 묵시적으로 extends object를 한것과 같은 의미이다.

public class Employee{

}

이 두 클래스는 같은 의미이다.

public class Employee extends Object{

}

슈퍼 클래스

서브 클래스

프로그램 수행 결과

생성자를 정의하지 않은 경우

생성자 정의 안함

수행됨

매개 변수 없는 생성자

수행됨

매개 변수 있는 생성자

수행됨

매개 변수가 없는

생성자를 정의한 경우

생성자 정의 안함

수행됨

매개 변수 없는 생성자

수행됨

매개 변수 있는 생성자

수행됨

매개 변수가 있는

생성자만 정의한 경우

생성자 정의 안함

에러 발생

매개 변수가 없는 생성자

슈퍼 클래스의 해당 생성자를 호출하지 않으면 에러 발생. super() 메소드 사용

매개 변수가 있는 생성자

슈퍼 클래스의 해당 생성자를 호출하지 않으면 에러 발생. super() 메소드 사용

서브 클래스의 객체를 생성할 때는 반드시 슈퍼 클래스의 생성자를 먼저 실행해야 한다.

슈퍼 클래스에 매개 변수가 있는 생성자만 정의되어 있고, 서브 클래스에 매개 변수가 있는 생성자가 있을 때, 서브 클래스의 super()를 쓰지 않으면 에러가 난다. 슈퍼 클래스의 매개 변수 있는 타입의 생성자는 여러 가지 형태가 있을 수 있어 무엇을 수행할지 알 수 없으므로 자동으로 슈퍼 클래스의 생성자를 실행하지 않는다. 따라서 반드시 super()를 사용해야 한다. 앞의 표에서 보듯이 슈퍼 클래스에 매개 변수가 없는 생성자가 정의되어 있는 경우 서브 클래스의 생성자는 어떤 형태가 나와도 상관이 없다. 따라서 하는 일은 없더라도 프로그램의 안정성을 위해서 매개 변수가 없는 생성자를 정의하는 것이 좋다.

생성자 - 클래스와 이름이 같은 메소드를 말한다.

- 특징

1. 클래스명과 대소문자도 모두 같아야 한다.

2. 클래스의 객체가 생성될 때마다 자동으로 호출된다.

3. 하나의 클래스에 여러 개를 기술할 수 있다.

4. 하나의 클래스에 여러 개의 생성자를 기술하면 객체 생성시 매개 변수의 개수, 매개 변수의 타입이일치하는 생서자를 호출해서 객체를 생성한다.

5. 생성자는 클래스명과 동일한 이름을 가지고 리턴 타입을 기술하지 않으며, 접근제어자는 public을 권장한다.이유) 어느 곳에서든지 객체를 생성할 수 있게 하기 위해서이다. 리턴타입은 기술하지 않지만 암묵적으로 void로 정의한 것으로 취급한다.

class ABC{

public ABC(){

}

}

생성자에서 하는일 - 주로 멤버 변수의 초기화와 메모리 할당을 위해 사용된다. 즉, 객체의 생성에 필수 요소이다. 생성자를 기술하지 않으면 자바 가상머신이 default 생성자를 생성해 준다.

this 레퍼런스 - 클래스에서 자기 자신을 가리킬 때는 this 레퍼런스를 사용한다.

- 용도

1. 매개 변수 값으로 멤버 변수의 값을 설정하는 경우처럼 자신의 클래스 내에 멤버 변수나 메소드를 명확히 해야 할 필요가 있을 때이다.

예) this.width = width;

2. 자신의 클래스 전체를 매개 변수로 전달할 때이다. 주로 이벤트 처리에서 이벤트를 처리하는 메소드가 같은 클래스 내에 있을 때, 또는 다른 클래스의 메소드를 호출할 때 자신의 클래스를 매개 변수로 보내야 할 경우에 사용된다.

동물 시뮬레이션 프로그램을 만들기 위한 상속 트리를 설계해봅시다.

1. 공통적인 속성과 행동이 들어있는 객체를 찾아봅시다.

여기에 있는 여섯 종류의 동물에서 어떤 공통적인 특성을 찾을 수 있나요? 그 과정에서 행동을 추상화 할 수 있습니다(2단계).각 유형은 어떻게 연관될까요? 이 과정에서 상속 트리에서의 관계를 정의할 수 있습니다(4단계~5단계)

2. 공통적인 상태와 행동을 나타내는 클래스를 설계합니다.

이 객체들은 모두 동물이므로 Animal이라는 공통적인 상위클래스를 만들겠습니다. 그리고 그 안에는 모든 동물이 필요로 하는 메소드와 인스턴스 변수를 집어넣어야 겠죠?

3. 특정 하위클래스 유형에만 적용되는 행동(메소드 구현)이 필요한지 결정합니다. Animal 클래스를 보면 각 하위클래스에서 eat()와 makeNoise()를 오버라이드해야 한다는 결정을 내릴 수 있습니다.

4. 공통적인 행동이 필요한 하위클래스를 두 개 이상 찾아서 추상화의 개념을 더 폭넓게 활용할 수 있을지 찾아봅니다. 여러 클래스를 살펴보면 Wolf와 Dog에 공통적인 행동이 있고 Lion, Tiger, Cat에도 공통적인 행동이 있다는 것을 알 수 있습니다.

5. 클래스 계층 구조를 완성해봅시다.

사실 동물에는 이미 계층 구조(hierarchy, 생물 시간에 계, 문, 강, 목, 과, 속 종 같은 생물 분류 체계를 배운 적이 있죠?)가 있으니까 클래스를 설계하는 과정에서도 최대한 활용해보겠습니다. 여기서는 생물 분류체계에서의 과를 활용하여 Feline(고양이과) 클래스와 Canine(개과) 클래스를 만들어서 동물을 조직화하겠습니다.

개과 동물은 무리를 지어서 움직이는 성향이 있다는 점을 감안하면 Canine 클래스에서 공통적인 roam()메소드를 만들 수 있을 것입니다. 또한 고양이과 동물은 같은 종류에 속하는 다른 동물을 피하려는 습성이 있기 때문에 공통적인 roam()메소드를 만들 수 있을 것입니다. Hippo 클래스에서는 그냥 Animal 클래스에 들어있는 일반적인 roam() 메소드를 활용하겠습니다.

일단 지금은 이 정도로 마치고 잠시 후에 다시 이 주제로 돌아오도록 하죠


신고

'객체지향언어' 카테고리의 다른 글

파이썬 2부  (0) 2013.06.10
파이썬 1부  (0) 2013.06.09
삼성 애니프레임.  (0) 2013.05.31
클래스의 상속  (0) 2009.08.19
객체지향 - 유스케이스  (0) 2009.08.19

자바는 기존의 프로그래밍 언어인 C/C++(이하 C라 명명한다.) 계열과 비슷한 문법을 보이면서도 내부적으로 실행될 때는 확연한 차이점을 가지고 있다. C는 기계어로 번역되고 메모리에 적재되어 CPU에서 직접 처리된다. 반면 자바는 바이트코드(Byte code)라는 특수한 코드로 번역되어 가상의 CPU인 JVM(Java Virtual Machine)이 그 실행을 맡고 CPU에 처리를 맡긴다. 따라서 자바는 JVM이라는 가상의 CPU를 가지고 있기 때문에 플랫폼이 독립적이다.

1. 컴퓨터와 관련하여 플랫폼이라는 용어는 응용프로그램이 실행될 수 있는 기초를 이루는 컴퓨터 시스템을 의미한다. PC에서는 두 개의 서로 다른 플랫폼의 예로서 윈도우95와 매킨토시를 들 수 있으며, 대형 서버나 메인프레임에서는 IBM의 System/390을 하나의 플랫폼으로 볼 수 있다.

하나의 플랫폼은 운영체계, 컴퓨터 시스템의 보조 프로그램, 그리고 마이크로프로세서, 논리연산을 수행하고, 컴퓨터 내의 데이터 이동을 관장하는 마이크로칩 등으로 구성된다. 운영체계는 특정 마이크로프로세서의 명령어셋과 함께 동작할 수 있도록 설계되어야 한다. 예를 들면, 마이크로소프트의 윈도우95는 같거나 비슷한 종류의 명령어셋을 공유할 수 있는 인텔의 마이크로프로세서군과 함께 동작할 수 있도록 만들어졌다. 마더보드나 데이터 버스 등과 같이 어떠한 컴퓨터 플랫폼이라도 보통 다르게 적용된 부품들이 있지만, 이러한 부품들은 점차적으로 모듈화되고 표준화되어가고 있다.

역사적으로 대부분의 응용프로그램들은 특정 플랫폼 상에서만 운영되도록 개발되어 왔다. 각 플랫폼은 다른 시스템 서비스들을 위해 다른 응용프로그램 인터페이스를 제공한다. 그러므로 윈도우 플랫폼에서 운영되기 위해 개발된 PC 프로그램을, 매킨토시 플랫폼에서 운영하기 위해서는 프로그램을 처음부터 다시 개발해야만 했다. 비록 이러한 플랫폼의 차이들은 계속 존재하고, 그들 사이에는 항상 독점기술에 관한 차이가 존재하겠지만, 표준을 따르는 새로운 개방형 인터페이스를 통해 이제는 일부 프로그램들이 다른 플랫폼에서 운영될 수 있고, 브로커 프로그램 등의 중재를 통해 서로 다른 플랫폼 간의 상호 운영이 가능해지고 있다.

2. 플랫폼은 다른 기술들 또는 공정들이 그 위에서 구현될 수 있는 일종의 기술 기반을 의미하기도 한다

내용을 간단히 요약해보면..

cpu가 멀티코어 시대가 되었으며 때문에 2개의 cpu에서 동시에 실행하는 멀티스레드 환경이 되었다. 기존의 Lock 동기화 메커니즘을 사용하면 멀티코어 성능을 제대로 활용할 수 없다. 멀티 스레드에 완벽하게 안전한 언어가 요구된다. 함수 언어는 동기화 없이 멀티스레드에 항상 안전하다. 이렇게 서론을 띄우고 SCALA라는 언어를 소개한다.

SCALA

Scala는 다음 같은 몇 가지 강력한 장점을 가진 함수-객체 혼성 언어다. 다음은 SCALA의 특징이다.

1. 자바 바이트코드로 컴파일되고 JVM 위에서 실행된다. 자바의 풍부한 오픈소스 환경을 활용할 수 있을 뿐 아니라 별도의 이행 비용 없이 현재의 IT 환경에 통합할 수 있다.

2. 스칼라는 하스켈(Haskell)과 ML의 함수 원리에 기반을 두고 있으면서도 여전히 자바 프로그래머가 좋아하는 친숙한 객체 지향 개념을 많이 빌어왔다. 결과적으로 양쪽의 최선을 하나로 녹여냈다.

3. 마지막으로 스칼라는 자바 커뮤니티에서 Pizza와 GJ 언어로 잘 알려진 Martine Odersky에 의해 개발되었다. 참고로 GJ는 현재 Java 5 제네릭스(Generics)의 프로토타입이다. 이 같이 스칼라는 "뭔가 진지한 성과"라는 느낌을 준다. 별 생각 없이 만들어 별 생각 없이 버려지는 언어가 되지는 않을 것이다.

정리해 보자면.. 멀티스레드에 안전하다는 함수적 개념을 도입한 Java의 확정버젼?? 이렇게 해석된다. 믿을만한 사람이 개발했기 때문에 앞으로도 더 발전할 것이라는..

너무 객체지향개념에 얽매여서 고민하기 보다는 일단 프로그램을 기능적으로 완성한 다음 어떻게 하면 보다 객체지향적으로 코드를 개선할 수 있을지를 고민하여 점차 개선해 나가는 것이 좋다.

이러한 경험들이 축적되어야 프로그램을 객체지향적으로 설계할 수 있는 능력이 길러지는 것이지 처음부터 이론을 많이 안다고 해서 좋은 설계를 할 수 있는 것은 아니다.

int iv; // 인스턴스 변수

static int cv; // 클래스 변수

1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다.

2. 클래스변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.

3. 클래스메서드(static메서드)는 인스턴스변수를 사용할 수 없다.

4. 메서드 내에서 인스턴스변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

- 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살펴보고 있으면, static을 붙인다.

- 작성한 메서드 중에서 인스턴스 변수를 사용하지 않는 메서드에 대해서 static을 붙일 것을 고려한다.

class MyMath2{

long a, b;

// 인스턴스변수 a, b만을 이용해서 작업하므로 매개변수가 필요없다.

long add() { return a + b; } // a, b는 인스턴스 변수

// 인스턴스변수와 관계없이 매개변수로만으로 작업이 가능하다.

static long add(long a, long b) { return a + b; } // a, b는 지역변수

}

class MyMathTest2{

public static void main(String args[]){

//클래스메서드 호출

System.out.println(MyMath2.add(200L, 200L));

MyMath2 mm = new MyMath2();

mm.a = 200L;

mm.b = 100L;

System.out.println(mm.add());

}

}

------------------------------------------------------

MemberCall c = new MemberCall();

int result = c.instanceMethod1();

int result = new MemberCall().instanceMethod1();

------------------------------------------------------

기본형 매개변수

------------------------------------------------------

static void change (int x){ // 기본형 매개변수

x =10000;

System.out.println("change() : x = " + x);

}

------------------------------------------------------

참조형 매개변수

------------------------------------------------------

class Data { int x; };

class ParameterTest2 {

public static void main (String[] args) {

Data d = new Data();

d.x = 10;

System.out.println("main() : x = " + d.x);

Change(d);

System.out.println("After Change(d)");

System.out.println("main() : x = " + d.x);

}

static void change (Data d){ // 참조형 매개변수

d.x = 1000;

System.out.println("change() : x = " + d.x);

}

}

------------------------------------------------------

참조형 매개변수

------------------------------------------------------

class ParameterTest3 {

public static void main (String[] args) {

int[] x = {10}; // 크리가 1인 배열. x[0] = 10;

System.out.println("main() : x = " + x[0]);

Change(x);

System.out.println("After Change(x)");

System.out.println("main() : x = " + x[0]);

}

static void change (int[] x){ // 참조형 매개변수

x[0] = 1000;

System.out.println("change() : x = " + x[0]);

}

}

메서드 오버로딩 이란?

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩(method overloading)또는 간단히 오버로딩(overloading)이라 한다.

오버로딩의 조건

1. 메서드 이름이 같아야 한다.

2. 매개변수의 개수 또는 타입이 달라야 한다.

3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.

(리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)

오버로딩의 장점

1. 메서드도 변수처럼 단지 이름만으로 구별된다면, 한 클래스내의 모든 메서드들은 이름이 달라야 한다. 근본적으로는 같은 기능을 하는 메서드들이지만, 서로 다른 이름을 가져야 하기 때문에 메서드를 작성하는 쪽에서는 이름을 짓기도 어렵고, 메서드를 사용하는 쪽에서는 이름을 일일이 구분해서 기억해야 하기 때문에 서로 부담이 된다.

2. 메서드의 이름을 절약할 수 있다는 것이다. 하나의 이름으로 여러 개의 메서드를 정의할 수 있으니, 메서드의 이름을 짓는데 고민을 덜 수 있는 동시에 사용되었어야 할 메서드 이름을 다른 메서드의 이름으로 사용할 수 있기 때문이다.

예)

void println()

void printlnBoolean(boolean x)

void printlnChar(char x)

void printlnDouble(double x)

void printlnString(String x)

생성자란?

생성자는 인스턴스가 생성될 때 호출되는 ‘인스턴스 초기화 메서드’이다. 따라서 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다.

인스턴스 초기화 : 인스턴스변수들을 초기화하는 것을 뜻한다.

생성자 조건

1. 생성자의 이름은 클래스의 이름과 같아야 한다.

2. 생성자는 리턴 값이 없다.

Card c = new Card();

1. 연산자 new에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성된다.

2. 생성자 Card()가 호출되어 수행된다.

3. 연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

생성자에서 다른 생성자 호출하기 - this(), this

- 생성자의 이름으로 클래스이름 대신 this를 사용한다

- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

this - 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.

this(), this(매개변수) - 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

인스턴스를 생성할 때는 다음의 2가지 사항을 결정해야 한다.

1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?

2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?

int door = 4; // 기본형(primitive type) 변수의 초기화

Engine e = new Engine(); // 참조형(reference type) 변수의 초기화

오버로딩 vs 오버라이딩

오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것(new)

오버라이딩 : 상속받은 메서드의 내용을 변경하는 것(change, modify)

class Parent {

void parentMethod() {}

}

class Child extends Parent {

void parentMethod() {} // 오버라이딩

void parentMethod(int i) {} // 오버로딩

void childMethod() {}

void childMethod(int i) {} // 오버로딩

void childMethod() {} // 에러, 중복정의 되었음

}

패키지 : 클래스의 묶음

간단한 프로그램이나 애플릿은 패키지를 지정하지 않아도 별 문제 없지만, 큰 프로젝트나 Java API와 같은 클래스 라이브러리를 작성하는 경우에는 미리 패키지를 구성하여 적용하도록 한다.

하나의 소스파일에 단 한번만 선언될 수 있다.

import문

컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다. 컴파일 시에 컴파일러는 import문을 통해 소프파일에 사용된 클래스들의 패키지를 알아 낸 다음, 모든 클래스이름 앞에 패키지명을 붙여 준다.

import문의 선언

모든 소스파일(.java)에서 import문은 package문 다음에, 그리고 클래스 선언 문 이전에 위치해야한다. 그리고 import문은 package문과는 달리 한 소스파일에 여러 번 선언할 수 있다.

1. package문

2. import문

3. 클래스 선언

import 패키지명.클래스명;

import 패키지명.*;

프로그램 오류

프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있다. 이러한 결과를 초래하는 원인을 프로그램 에러 또는 오류라고 한다.

이를 발생시점에 따라 ‘컴파일 에러(compile-time error)’와 '런타임 에러(runtime error)'로 나눌 수 있는데, 글자 그대로 ‘컴파일 에러’는 컴파일 할 때 발생하는 에러이고 프로그램 실행도중에 발생하는 에러를 ‘런타임 에러’라고 한다.

자바에서는 실행 시(runtime) 발생할 수 있는 프로그램 오류를 ‘에러(error)’와 ‘예외(exception)' 두 가지로 구분하였다. 에러는 메모리 부족(outofmemoryerror)이나 스택오버플로우(stackoverflowerror)와 같이 일단 발생하면 복구할 수 없는 심각한 오류이고, 예외는 발생하더라도 수습될 수 있는 비교적 덜 심각한 것이다.

예외처리

정의 - 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것

목적 - 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

class ExceptionEx3 {

public static void main(String arg[]){

int number = 100;

int result = 0;

for (int i=0; i<10; i++){

try{

result = number / (int)(Math.random() * 10);

System.out.println(result);

} catch (ArithmeticException e) {

System.out.println("0");

} // try-catch의 끝

} // for문 끝

}

}

class NewExceptionTest {

public static void main(String arg[]){

try{

startInstall(); // 프로그램 설치에 필요한 준비를 한다.

copyFiles(); // 파일을 복사한다.

} catch (SpaceException e) {

System.out.println("에러 메시지 : " + e.getMessage());

e.printStackTrace();

System.out.println("공간을 확보한 후에 다시 설치하시기 바랍니다.");

} catch (MemoryException me) {

System.out.println("에러 메시지 : " + e.getMessage());

me.printStackTrace();

System.gc(); // Garbage Collection을 수행하여 메모리를 늘려준다.

System.out.println("다시 설치를 시도하세요");

} finally {

deleteTempFiles(); // 프로그램 설치에 사용된 임시파일을 삭제한다.

} // try의 끝

} // main의 끝

static void startInstall() throws SpaceException, MemoryException {

if(!enoughSpace()) // 충분한 설치 공간이 없으면...

throw new SpaceException("설치할 공간이 부족합니다.");

if (enoughMemory()) // 충분한 메모리가 없으면...

throw new MemoryException("메모리가 부족합니다.");

} // StartInstall 메서드의 끝

static void copyFile() {}

static void deleteTempFile() {}

static boolean enoughSapce() {

// 설치하는데 필요한 공간이 있는 확인하는 코드를 적는다.

return false;

}

static boolean enoughMemory() {

// 설치하는데 필요한 메모리공간이 있는 확인하는 코드를 적는다.

return true;

}

} // NewExceptionTest 클래스의 끝

class SpaceException extends Exception {

MemoryException(String msg){

super(msg);

}

}

1. 컬렉션 프레임윅(collection Framework)

- 다수의 데이터를 쉽게 처리할 수 있는 표준화된 방법을 제공하는 클래스들

2. 유용한 클래스 - 알아두면 좋은 아주 쓰이는 클래스들

3. 형식화 클래스 - 데이터를 표준화된 형식으로 출력하는데 도움을 주는 클래스들


신고


유스케이스 : 시스템이 어떤 일을 수행하기 위해 거쳐야 하는 단계들을 말합니다.

유스케이스는 새로 만들 시스템이나 소프트웨어 변경 사항에 대한 요구 사항을 찾아내는 방법입니다. 각 유스케이스는 특정 목표를 달성하기 위해 시스템이 사용자 또는 다른 시스템과 어떻게 상호작용하는지를 전달하는 하나 이상의 시나리오를 제공합니다.

하나의 유스케이스, 세가지 부분

1. 명확한 가치 : 모든 유스케이스는 시스템에게 명확한 가치를 가지고 있어야 합니다. 유스케이스가 고객의 목표 달성에 도움이 되지 않는다면 소용없는 유스케이스입니다.

2. 시작과 종료 : 모든 유스케이스는 명확한 시작 시점과 종료 시점이 있어야 합니다. 뭔가가 유스케이스를 기동시키고, 유스케이스가 완료되었음을 표시하는 상태가 있어야 합니다.

3. 외부 기동자 : 모든 유스케이스는 액터에 의해 시작됩니다. 액터는 주로 사람이지만 시스템 외부의 어떤 것이나 될 수 있습니다.

ex)

1. 피도가 밖에 나가고 싶어 짖습니다.

2. 토드 또는 지니가 파도가 짖는 것을 듣습니다.

3. 토드 또는 지니가 리모콘의 버튼을 누릅니다.

4. 강아지 문이 열립니다.

5. 피도가 밖에 나갑니다.

6. 피도가 밖에 쉬합니다.

6.1 문이 자동으로 닫힙니다.

6.2 피도가 들어오려고 짖습니다.

6.3 토드나 지나가 파도가 짖는 것을 듣습니다.(다시)

6.4 토드나 지나가 리모콘을 누릅니다.

6.5 강아지 문이 열립니다.(다시)

7. 피도가 안으로 들어옵니다.

8. 강아지 문이 자동으로 닫힙니다.

피도 : 이것이 유스케이스의 시작점입니다. 피도가 짖기 전까지는 아무것도 시작 되지 않습니다.

피도가 이 유스케이스의 외부 기동자입니다.

stop : 피도가 집안으로 들어오고 문이 닫힌 상태입니다.

super buy : 전체 유스케이스가 가치입니다. 왜냐하면 토드와 지나가 침대에 계속 있으면서 피도를 밖에 내보낼 수 있으니까요.

유스케이스 다이어그램은 유스케이스들을 시각적으로 보여주는 방법입니다.

신고

'객체지향언어' 카테고리의 다른 글

파이썬 2부  (0) 2013.06.10
파이썬 1부  (0) 2013.06.09
삼성 애니프레임.  (0) 2013.05.31
클래스의 상속  (0) 2009.08.19
객체지향 - 유스케이스  (0) 2009.08.19