프로젝트는 혼자서 하는일이 아니라서 각자 업무를 분담해야 한다 업무 분담을 보여주기 위해서 문서를 만들었다.
필요하신분 갔다 쓰시고, 리플만 달아주세요.


프로젝트를 시작하여 팀원끼리 문서 양식을 정하고 표준을 잡는일은 프로젝트의 날개이자 산출물의 핵심요소 인것같다. 산출물을 뽑는것도 힘들지만 산출물의 틀을 잡는것이 더 어렵고 힘들었던것 같다. 각자의 의견이 분분하고 토의해서 결정해야 된다는 생각에 왜그리도 많이 싸웠는지...
아래 내용은 화면디자인 표준안을 잡는 작은 한예이다. 여러분도 프로젝트 할때 이런걸 잡고 가는가요?

화면 디자인 표준안

1. 제목표시줄(Form Text)

- Form Name : Frm_화면번호

예) Frm_001

- 화면 크기 : 800 x 480

- 폰트 : Tahoma

- 폰트 크기 : 9

예) 모바일 컨텐츠 관리 화면

2. 버튼(Button)

- Button Name : Btn_명사

예) Btn_Edit, Btn_Delete

- 크기 : 90 x 50 (기본), 상황에 따라 버튼이 크게 표기 되야 할시에는 변경 가능함.

- 폰트 : tahoma

- 폰트 크기 : 9

- 버튼 제목

> 기본적으로 명사를 표기하는 것으로 원칙으로 합니다. 아래는 대표적으로 자주 쓰는 용어만

통일하여 기입해 놓은 것입니다. 아래 예 외에도 추가로 통합되야 할것이 있으면 회의를 통해

합치는 것으로 한다.

예) 정보보기(X), 사용자정보(O), 확대보기(X), 확대(O)

> 수정(EDIT) : “편집”, “변경”, “edit”

> 입력(INSERT) : “add”, “첨부” , “추가”

> 삭제(DEL) : “delete", "지우기”

> 출력(PRINT) : “인쇄”, “프린트”

> 검색(SEARCH) : “search", "find", "찾기”

이외도 많은 용어들이 있겠지만 위 용어는 자주 사용하는 용어만 정리해 놓았습니다.

- 버튼 배치

3. 입력 상자(Textbox)

- Textbox Name : Txt_명사

예) Txt_Name, Txt_Tel

- 폰트 : tahoma

- 크기 : 9

- 꼭 필요한 입력상자 항목

속성 : BackColor - Info

1) 꼭 필요한 항목 2) 일반 항목

4. 레이블(Lable)

- Label Name : lbl_명사

- 폰트 : tahoma

- 크기 : 일반(9), 제목(14)

- 주민번호와 같은 보호 항목 처리

속성 : PasswordChar - “*”

- 근접한 컨트롤이 전체 폼에 오른쪽에 있을 경우 : 오른쪽 정렬

근접한 컨트롤이 전체 폼에 왼쪽에 있을 경우 : 왼쪽 정렬

5. 리스트박스(ListBox)

- Listview Name : listview_명사

- 폰트 : tahoma

- 크기 : 일반(12), 제목(9)

- 글씨에 길이가 길 경우 : 오른쪽 정렬

- 이름 같이 잛은 경우 : 가운데 정렬

6. 콤보박스(ComboBox)

- ComboBox Name : cmb_명사

- 폰트 : tahoma

- 크기 : 9

- 가운데 정렬

7. 체크박스(CheckBox)

- CheckBox Name : chk_명사


'시스템분석 및 설계' 카테고리의 다른 글

종합설계 - 요구분석서  (0) 2010.06.02
종합설계 시간에 만든 개발계획서를 올려본다.  (2) 2010.06.02
업무분담표 작성  (0) 2009.08.20
프로젝트 문서  (0) 2009.07.29

1. 상대방 IP 알아낸다. : netstat -na

- nmap : nmap을 이용하여 대상 서버를 알아본다.(리눅스,유닉스,윈도우NT 계열인지...)

http://insercure.org/nmap 사에트에서 리눅스, 윈도우 버전으로 제공중이다.

- fport : fport로 자신의 포트가 열려 있는지 확인한다.

fport /? -> 명령어로 원하는대로 정렬이 가능하다.

http://www.foundstone.com 사이트에 가면 다운로드 할수 있다.

- Windows 2000 Or Windows 2003 서버일경우에는 아래와 같은 공격이 통함.

- 단, Message 서비스가 켜져있어야 한다.

2. 명령어

net send IP 전할 말

3. 명령어 응용

for /L %1 IN (5,-1,1) do net send [IP] [메세지]

4. 공유 폴더확인 : net share

5. 공유 폴더삭제 : net share [폴더명] /delete

가. DLL 인젝션과 API 후킹

1. DLL 인젝션 정의

만일 어떻게든 A프로세스의 주소 공간에 서브클래싱을 위한 윈도우 프로시저를 포함시킬 수 있다면, SetWindowLongPtr을 사용하여 A프로세스 주소 공간에 포함된 MySubclassProc의 주소로 해당 윈도우의 윈도우 프로시저를 변경할 수 있을 것이다. 이러한 기법을 우리는 프로세스의 주소 공간으로 DLL 인젝션 한다고 한다.

2. 서브클래싱 이란?

서브클래싱(SubClassing)이란 윈도우 프로시저로 전달되는 메시지를 중간에 가로채는 방법이다. 중간에서 메시지를 조작하게 됨으로써 윈도우의 모양을 변경하거나 동작을 감시하거나 하는 작업을 할 수 있게 되는 것이다.

윈도우는 CreateWindow()를 통해 만들어진다. 이 때 CreateWindow()의 첫번 째 인수인 윈도우 클래스에서 윈도우 생성에 필요한 정보를 구하게 되는데, 그 중 가장 중요한 것이 메시지를 처리하는 윈도우 프로시저의 번지(lpfnWndProc)이다. 이는 윈도우 클래스에 보관되는 것이 아니고 윈도우별로 별도로 보관된다.

윈도우는 메시지를 받게 되면 해당 윈도우의 윈도우 프로시저 번지를 조사한 후 조사된 번지로 메시지를 보내고 메시지를 받은 윈도우 프로시저는 이 메시지를 받아 해당 윈도우에서 작성한 코드대로 처리를 하게 된다.

이 때 윈도우 프로시저를 다른 윈도우 프로시저로 변경을 한다면, 모든 메시지는 새로 만든 윈도우 프로시저로 전달이 될 것이다.

이렇게 새로 만들어진 윈도우 프로시저를 서브클래스 프로시저(SubClass Procedure)라고 한다.

윈도우 프로시저의 번지를 변경하기 전에 원래의 윈도우 프로시저 번지를 보관해 두고 서브클래스 프로시저에서 처리하지 않은 메시지는 반드시 원래 윈도우 프로시저로 전달하도록 해야한다.

서브클래스 프로시저를 등록하기 위해서는 아래와 같은 함수를 사용한다.

LONG_PTR SetWindowLongPtr( HWND hWnd, int nIndex, LONG_PTR dwNewLong )

hWnd - 프로시저를 바꾸려는 윈도우에 속한 클래스의 핸들

nIndex - MSDN 참고

GWL_EXSTYLE : Sets a new extended window style

GWL_STYLE : Sets a new Window style

GWLP_WNDPROC : Sets a new address for the window procedure.

GWLP_HINSTANCE : Sets a application instance handle.

...

dwNewLong - 대체할 값(프로시져)을 지정.

예)

원래번지 = SetWindowLongPtr(변경 윈도우, GWLP_WNDPROC, 서브클래스 프로시져);

위와 같이 하면, 변경 윈도우로 보내지는 모든 메시지는 일단 서브클래스 프로시져로 전달 될 것이다.

변경 윈도우는 일반적인 윈도우가 될 수도 있고, 버튼, 에디트박스와 같은 윈도우도 될 수 있다. 버튼이나 에디트박스가 변경 윈도우가 될 경우 그 윈도우에서 처리하고 싶은 이벤트, 메시지에 관련된 부분을 서브클래스 프로시져에 넣어주면 된다.

추가로 서브클래스 프로시져를 작성한다.

LRESULT CALLBACK 프로시져(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

{

switch(iMessage){

case XXX:

...

break;

}

return CallWindowProc(원래번지, hWnd, iMessage, wParam, lParam);

}

CallWindowProc() 는 위 예제의 서브클래스의 case 에 속하지 않은 메시지를 처리하는 부분이다. 이 메시지들은 lpPrevWndFunc에 정의된 윈도우 프로시져로 보내저 처리가 될 것이다.

LRESULT CallWindowProc (WNDPROC lpPrevWndFunc,

HWND hWnd,

UINT Msg,

WPARAM wParam,

LPARAM lParam )

lpPrevWndFunc - 서브클래스 등록(SetWindowLongPtr)시 리턴된 값으로 원래의 윈도우 프로시저(번지)

hWnd - 메시지를 받을 윈도우 프로시저의 핸들

Msg - 메시지 내용

wParam - 메시지의 추가적인 정보

lParam - 메시지의 추가적인 정보

예)

return CallWindowProc(원래번지, hWnd, iMessage, wParam, lParam);

윈도우즈 API 정복을 참고한 간단하게 본 서브클래스의 개념과 주요 함수들이다.

3. 레지스트리를 이용하여 DLL 인젝션하기.

- 전체시스템의 구성 정보는 레지스트리에 저장된다.

- 이 설정 값을 변경함으로써 시스템의 동작 방식을 변경할 수 있다.

'기타 > 리버스엔지니어링' 카테고리의 다른 글

올리디버거  (0) 2009.07.29
리버싱 관련 툴  (0) 2009.07.29
리버스엔지니어링이란 무엇인가?  (0) 2009.07.29

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

자바는 기존의 프로그래밍 언어인 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

종 류

장 점

단 점

Oracle

□ 많은 사용자가 존재함

□ 입증된 제품의 우수성

□ PC급에서 Mainframe급까지 모두 설치됨

□ 3rd Party의 강력한 지원

□ 분산처리 지원 기능의 우수성

□ SMP 및 MPP의 지원

□ 신제품의 출시가 늦어짐(버전 발표의 늑장)

□ DBMS를 운영하기 위하여 많은 하드웨어 자원의 필요

□ 복잡한 DBMS 관리

□ 가격이 동종의 DBMS보다 비쌈

□ 모든 제품에 Kernel이 필요

□ 애프터서비스의 부족

□ 배우기 힘든 제품 기능들의 존재

Sybase

□ Client/Server용으로 설계되어 성능과 분산처리 지원이 탁월

□ 타 DB에 비하여 DBMS를 운영하기 위하여 적은 하드웨어 자원만으로도 충분

□ 3rd Party 지원도구의 지원 우수

□ Open Server/MDI Gateway 지원

□ PowerBuilder와의 결합 및 지원 우수

□ Replication Server 특성 우수

□ Record Tracking 우수

□ 복잡한 DBMS 관리

□ 부족한 확장성

□ Sybase 자체 개발 등의 지원도구의 부족

□ 예전 버전에서의 표준 SQL의 지원 불량

□ Microsoft에 의한 대체 DBMS의 등장으로 독창성 훼손

Informix

□ 안정된 Kernel(시스템의 안정성)

□ 사용자들의 만족도 우수

□ Low end Unix에서의 운영 우수성

□ 풍부한 4GL 도구의 지원

□ 풍부한 경험을 가진 개발자 및 사용자의 존재

□ PC급 지원기능의 한계

□ VMS의 지원 불가

□ 3rd Party 지원도구의 부족

(ODBC를 통한 DB접속 의존)

□ 경쟁시장에서의 마케팅 부족

Ingres

□ 통합된 도구세트의 지원기능 훌륭

□ 사용자 정의 데이터 타입, 함수, 연산자 등의 지원

□ VMS, Unix 사용자의 큰 만족도

□ Replication Service기능의 우수

□ PC전략의 부재

□ 3rd Party 지원도구의 부족

(ODBC를 통한 DB접속 의존)

□ 도큐먼테이션 기능의 부족

□ 회사의 불확실한 미래 (CA의 인수후)

Microsoft

SQL Server

□ Sybase의 장점들을 물려 받음

□ 저렴한 제품 가격

□ Windows NT환경에서 최적의 기능 및 성능을 발휘하도록 설계됨(SMP, 하드웨어 확장성 우수)

□ Microsoft의 '토털 솔루션' 전략의 중심축

- Networking

- Database

- Tools

□ 단순한 데이터베이스 기능

□ Sybase의 특성들을 물려받음

(Microsoft의 Family로서의 기능을 충분히 하도록 범용 RDBMS의 기능을 대폭 축소)

□ Microsoft는 RDBMS만에 주력하는 회사가 아니므로 충분한 지원 및 더 나은 DBMS로의 발전전망 불투명

□ 최근의 Sybase의 신 기능의 결여

□ DBMS 전문가의 부족

□ 단순한 데이터베이스 기능

Progress

□ 사용자 만족도 우수

□ 통합 개발 지원 도구

□ DBMS의 안정성 우수

□ 소규모 Unix Platform들을 기반으로 할 때 운용성 우수

□ 3rd Party 지원도구의 부족

□ Server의 주요 기능들의 부족

- Replication

- SMP(Symmetrical Multi-Processor)

- MPP(Massive Parallel Processor)

- 개발지원 도구

- 성능튜닝 도구

□ 완전한 관계형 SQL API의조건 미흡

Qupta SQL

Base

□ 간단한 DBMS 관리

□ 통합 윈도우 개발 및 사용자용도구의 지원

□ IBM DB2와의 호환성

□ Client/server용으로의 구조의 우수성

□ 제품의 안정성 미흡

□ 3rd Party 지원도구의 부족

□ 제한된 호환성

□ Stored Procedure와 Trigger의 결여

□ Router의 높은 가격

□ 고객 지원의 미흡

DB2

□ IBM Product Line의 호환성

□ DRDA(Distributed Relational Database Architecture) 구조

□ 저렴한 가격

□ RDBMS와 Platforms의 안정성

□ CICS와의 통합사용이 가능

□ 원격관리의 우수성

□ Stored Procedure등의 기능 미흡

□ 제한된 호환성

□ 3rd Party 지원도구의 부족

□ OS/2의 성능의 문제점

□ 시장이 편중됨(IBM 위주)


+ Recent posts