선행작업 

 - Flutter SDK 설치 (https://docs.flutter.dev/get-started/install)

 - Flutter 프로젝트 생성

 - Flutter 프로젝트 진입

 - FireBase CLI 설치 (https://firebase.google.com/docs/cli?hl=ko#setup_update_cli)

 

 

위의 내용이 진행되었으면

프로젝트 내 Terminal에 다음과 같이 작성

firebase login

로그인을 정상적으로 한 후,

dart pub global activate flutterfire_cli

Firebase_cli 활성화

flutter pub add firebase_core

Firebase_core 추가

flutterfire configure

Firebase 설정

- 설정 시 몇가지 설정하는게 Terminal에 나오는데 firebase에 추가된 프로젝트 목록 중, 사용할 프로젝트를 선택하면 된다.

 

 

 

main.dart파일 상단에 다음과 같이 추가

await Firebase.initializeApp(
  options: DefaultFirebaseOptions.currentPlatform,
);

 

해당 함수를 main 함수에서 호출해준다.

void main() async {
 WidgetsFlutterBinding.ensureInitialized();
 await firebaseInitializedApp;
 }

3번째 줄만 추가하면 firebase와 연동은 완료

 

'Programming > Flutter' 카테고리의 다른 글

Unable to boot the simulator  (0) 2024.03.07
블로그 이미지

SherryBirkin

,

IntelliJ에서 Android, iOS의 시뮬레이터를 실행할때 

 

Unable to boot the simulator라는 메시지를 띄우고 실행이 안될때가 있다.

 

 

해결방법

 - 애플버튼 -> 이 Mac에 관하여 - > 추가 정보 -> 일반 -> 저장공간설정 -> 개발자 -> xCode프로젝트 빌드파일 -> 프로젝트 빌드 데이터 및 인덱스 선택 후 삭제

 

 

'Programming > Flutter' 카테고리의 다른 글

Firebase 연동  (0) 2024.03.07
블로그 이미지

SherryBirkin

,

IMessageFilter 상속하여 새로운 Class 생성


Interface 된 함수를 생성하여 그안에 


KeyUp =>0x101,  KeyDown => 0x100


MouseDown, Up, Move 등 


제어하고자하는 Event를 등록한 후,


프로그램 실행시


Application.AddFilterMessage( IMessageFilter로 상속하여 만든 Class 객체 );


종료시에 RemoveFilterMessage해서 삭제해주도록 한다.


Alt는 동작되지 않음...



Sample Code

InputController.zip


메시지를 필터링하고 디스패치되지 않게 하려면 true이고 다음 필터 또는 컨트롤에 계속 사용하려면 false입니다.



일반적으로 사용하는 ProcessCmdKey를 재사용하면


KeyDown 이벤트는 정상적으로 동작하나


KeyUp은 동작 하지 않는다.



Event, w.Msg

WM_NULL 0
WA_INACTIVE 0
WM_CREATE 1
WA_ACTIVE 1
WM_DESTROY 2
WA_CLICKACTIVE 2
WM_MOVE 3
WM_SIZE 5
WM_ACTIVATE 6
WM_SETFOCUS 7
WM_KILLFOCUS 8
WM_ENABLE 10
WM_SETREDRAW 11
WM_SETTEXT 12
WM_GETTEXT 13
WM_GETTEXTLENGTH 14
WM_PAINT 15
WM_CLOSE 16
WM_QUERYENDSESSION 17
WM_QUIT 18
WM_QUERYOPEN 19
WM_ERASEBKGND 20
WM_SYSCOLORCHANGE 21
WM_ENDSESSION 22
WM_SHOWWINDOW 24
WM_WININICHANGE 26
WM_SETTINGCHANGE 26
WM_DEVMODECHANGE 27
WM_ACTIVATEAPP 28
WM_FONTCHANGE 29
WM_TIMECHANGE 30
WM_CANCELMODE 31
WM_SETCURSOR 32
WM_MOUSEACTIVATE 33
WM_CHILDACTIVATE 34
WM_QUEUESYNC 35
WM_GETMINMAXINFO 36
WM_PAINTICON 38
WM_ICONERASEBKGND 39
WM_NEXTDLGCTL 40
WM_SPOOLERSTATUS 42
WM_DRAWITEM 43
WM_MEASUREITEM 44
WM_DELETEITEM 45
WM_VKEYTOITEM 46
WM_CHARTOITEM 47
WM_SETFONT 48
WM_GETFONT 49
WM_SETHOTKEY 50
WM_GETHOTKEY 51
WM_QUERYDRAGICON 55
WM_COMPAREITEM 57
WM_GETOBJECT 61
WM_COMPACTING 65
WM_COMMNOTIFY 68
WM_WINDOWPOSCHANGING 70
WM_WINDOWPOSCHANGED 71
WM_POWER 72
WM_COPYDATA 74
WM_CANCELJOURNAL 75
WM_NOTIFY 78
WM_INPUTLANGCHANGEREQUEST 80
WM_INPUTLANGCHANGE 81
WM_TCARD 82
WM_HELP 83
WM_USERCHANGED 84
WM_NOTIFYFORMAT 85
WM_CONTEXTMENU 123
WM_STYLECHANGING 124
WM_STYLECHANGED 125
WM_DISPLAYCHANGE 126
WM_GETICON 127
WM_SETICON 128
WM_NCCREATE 129
WM_NCDESTROY 130
WM_NCCALCSIZE 131
WM_NCHITTEST 132
WM_NCPAINT 133
WM_NCACTIVATE 134
WM_GETDLGCODE 135
WM_SYNCPAINT 136
WM_NCMOUSEMOVE 160
WM_NCLBUTTONDOWN 161
WM_NCLBUTTONUP 162
WM_NCLBUTTONDBLCLK 163
WM_NCRBUTTONDOWN 164
WM_NCRBUTTONUP 165
WM_NCRBUTTONDBLCLK 166
WM_NCMBUTTONDOWN 167
WM_NCMBUTTONUP 168
WM_NCMBUTTONDBLCLK 169
WM_KEYFIRST 256
WM_KEYDOWN 256
WM_KEYUP 257
WM_CHAR 258
WM_DEADCHAR 259
WM_SYSKEYDOWN 260
WM_SYSKEYUP 261
WM_SYSCHAR 262
WM_SYSDEADCHAR 263
WM_KEYLAST 264
WM_IME_STARTCOMPOSITION 269
WM_IME_ENDCOMPOSITION 270
WM_IME_KEYLAST 271
WM_IME_COMPOSITION 271
WM_INITDIALOG 272
WM_COMMAND 273
WM_SYSCOMMAND 274
WM_TIMER 275
WM_HSCROLL 276
WM_VSCROLL 277
WM_INITMENU 278
WM_INITMENUPOPUP 279
WM_MENUSELECT 287
WM_MENUCHAR 288
WM_ENTERIDLE 289
WM_MENURBUTTONUP 290
WM_MENUDRAG 291
WM_MENUGETOBJECT 292
WM_UNINITMENUPOPUP 293
WM_MENUCOMMAND 294
WM_CTLCOLORMSGBOX 306
WM_CTLCOLOREDIT 307
WM_CTLCOLORLISTBOX 308
WM_CTLCOLORBTN 309
WM_CTLCOLORDLG 310
WM_CTLCOLORSCROLLBAR 311
WM_CTLCOLORSTATIC 312
WM_MOUSEMOVE 512
WM_MOUSEFIRST 512
WM_LBUTTONDOWN 513
WM_LBUTTONUP 514
WM_LBUTTONDBLCLK 515
WM_RBUTTONDOWN 516
WM_RBUTTONUP 517
WM_RBUTTONDBLCLK 518
WM_MBUTTONDOWN 519
WM_MBUTTONUP 520
WM_MBUTTONDBLCLK 521
WM_MOUSEWHEEL 522
WM_PARENTNOTIFY 528
WM_ENTERMENULOOP 529
WM_EXITMENULOOP 530
WM_NEXTMENU 531
WM_SIZING 532
WM_CAPTURECHANGED 533
WM_MOVING 534
WM_POWERBROADCAST 536
WM_DEVICECHANGE 537
WM_MDICREATE 544
WM_MDIDESTROY 545
WM_MDIACTIVATE 546
WM_MDIRESTORE 547
WM_MDINEXT 548
WM_MDIMAXIMIZE 549
WM_MDITILE 550
WM_MDICASCADE 551
WM_MDIICONARRANGE 552
WM_MDIGETACTIVE 553
WM_MDISETMENU 560
WM_ENTERSIZEMOVE 561
WM_EXITSIZEMOVE 562
WM_DROPFILES 563
WM_MDIREFRESHMENU 564
WM_IME_SETCONTEXT 641
WM_IME_NOTIFY 642
WM_IME_CONTROL 643
WM_IME_COMPOSITIONFULL 644
WM_IME_SELECT 645
WM_IME_CHAR 646
WM_IME_REQUEST 648
WM_IME_KEYDOWN 656
WM_IME_KEYUP 657
WM_MOUSEHOVER 673
WM_MOUSELEAVE 675
WM_CUT 768
WM_COPY 769
WM_PASTE 770
WM_CLEAR 771
WM_UNDO 772
WM_RENDERFORMAT 773
WM_RENDERALLFORMATS 774
WM_DESTROYCLIPBOARD 775
WM_DRAWCLIPBOARD 776
WM_PAINTCLIPBOARD 777
WM_VSCROLLCLIPBOARD 778
WM_SIZECLIPBOARD 779
WM_ASKCBFORMATNAME 780
WM_CHANGECBCHAIN 781
WM_HSCROLLCLIPBOARD 782
WM_QUERYNEWPALETTE 783
WM_PALETTEISCHANGING 784
WM_PALETTECHANGED 785
WM_HOTKEY 786
WM_PRINT 791
WM_PRINTCLIENT 792
WM_HANDHELDFIRST 856
WM_HANDHELDLAST 863
WM_AFXFIRST 864
WM_AFXLAST 895
WM_PENWINFIRST 896
WM_PENWINLAST 911
WM_USER 1024
WM_APP 32768


'Programming > C#' 카테고리의 다른 글

Virtual, Abstract, Interface  (0) 2017.11.06
DataSource Binding 방법  (0) 2017.10.31
Dictionary 탐색중 삭제하기  (0) 2017.08.17
캐스팅 as, is  (0) 2017.06.30
DataGridView 스크롤시 열 고정, 구분자  (0) 2016.12.22
블로그 이미지

SherryBirkin

,



출처 - http://www.nextree.co.kr/p6753/


1. UML

UML이란 Unified Modeling Language의 약자로 1997년 OMG(Object Management Group)에서 표준으로 채택한 통합모델링언어 입니다. 즉, 모델을 만드는 표준언어인 것입니다. 모델이란 것은 어떤 것을 실제로 만들 때 이렇게 만들면 잘 작동할지 미리 검증해 보는 것이며 실제 물건을 만드는 비용보다 비용이 훨씬 적을 경우에 모델을 만들어 설계를 검사합니다.

소프트웨어에서의 모델은 건축, 항공 등의 모델과는 좀 다른 면이 있습니다. 건물을 짓고, 항공기를 만드는 것과 설계를 그리고 만드는 것은 비용의 엄청난 차이가 있습니다. 하지만 UML 다이어그램을 그리며 모델을 만드는 일은 개발보다 비용이 적긴 하지만 훨씬 적게 드는 것이 아니며 때로는 오히려 개발보다 비용이 더 많이 들 수도 있습니다. 그래서 UML은 시험해 볼 구체적인 것이 있고, 그것을 코드로 시험해 보는 것보다 UML로 시험해 보는 쪽이 비용이 덜 들 때 주로 사용합니다. 이러한 목적으로 UML을 사용하는 유형에는 다음 3가지 정도가 있습니다.

  • 다른 사람들과의 의사소통 또는 설계 논의
  • 전체 시스템의 구조 및 클래스의 의존성 파악
  • 유지보수를 위한 설계의 back-end 문서

UML을 그리는데 가장 좋은 도구는 종이와 펜이라는 말이 있듯이 습관적으로 만드는 게 아니라 필요에 의해 만드는 것이 가장 좋은 것 같습니다.

2. Class Diagram (클래스 다이어그램)

[그림 1] UML 다이어그램의 종류 출처: http://www.ask.com/wiki/Unified_Modeling_Language#UML_2.x

UML은 구조 다이어그램 7개, 행위 다이어그램 7개로 총 14종류의 다이어그램이 있습니다. 구조 다이어그램은 시스템의 개념, 관계 등의 측면에서 요소들을 나타내고 각 요소들의 정적인 면을 보기 위한 것이고 행위 다이어그램은 각 요소들 혹은 요소들간의 변화나 흐름, 주고받는 데이터 등의 동작을 보기 위한 것으로, 클래스 다이어그램은 구조 다이어그램에 해당합니다. 클래스 다이어그램은 클래스 내부의 정적인 내용이나 클래스 사이의 관계를 표기하는 다이어그램으로 시스템의 일부 또는 전체의 구조를 나타낼 수 있습니다. 클래스 다이어그램은 의존 관계를 명확히 보게 해주며, 순환 의존이 발생하는 지점을 찾아내서 어떻게 이 순환 고리를 깨는 것이 가장 좋은지 결정할 수 있게 해줍니다.


[그림 2] 목적 별 클래스 다이어그램

UML은 목적에 따라 다르게 사용되는데, 크게 3가지로 개념, 명세, 구현의 차원들 입니다.먼저 개념 차원의 UML은 문제 도메인의 구조를 나타내며 사람이 풀고자 하는 문제 도메인 안에 있는 개념과 추상적 개념을 기술하기 위한 것입니다. 이것은 소스코드와 관계가 그렇게 깊지 않으며 오히려 사람의 자연언어와 더 관련이 있습니다. 또한 의미론적(언어의 뜻을 규정하는) 규칙에 그다지 얽매이지 않으며, 따라서 의미하는 바도 모호하거나 해석에 따라 달라질 수 있는 부분이 존재합니다. 
반면, 명세와 구현 차원의 UML은 소프트웨어의 설계 혹은 완성된 소프트웨어의 구현 설명 목적 등으로 사용하며 설계를 해서 소스코드로 바꾸거나 구현 된 소스코드를 설명하려고 사용하기 때문에 소스코드와 관계가 깊습니다. 이 두 차원의 클래스 다이어그램은 제약이 많아서 반드시 일정한 규칙과 의미론을 지켜야 합니다. 또한 모호성이 거의 없도록 하고 형식도 최대한 맞춰야 합니다.

앞으로 나올 내용들은 구조 다이어그램 중 하나인 클래스 다이어그램이며 그 중에서도 개념 차원은 배제하고 소스코드와 관계가 깊은 명세, 구현 차원에 해당하는 클래스 다이어그램만으로 한정 지어 소스코드와 어떻게 연관 되는지 이해해 보도록 하겠습니다. 따라서 개념 차원의 클래스 다이어그램과는 조금 다른 부분이 있을 수 있습니다.

3. 클래스 다이어그램의 요소(Element)

Class (클래스)

클래스는 보통 3개의 compartment(구획)으로 나누어 클래스의 이름, 속성, 기능을 표기합니다. 속성과 기능은 옵션으로 생략이 가능하지만 이름은 필수로 명시해야 합니다.

[그림 3] 클래스

클래스의 세부사항은 필드와 메서드의 Access modifier(접근제한자), 필드명(메서드명), 데이터타입, parameter(매개변수), 리턴 타입 등을 나타낼 수 있습니다. 클래스의 세부사항들을 상세하게 적는 것이 유용할 때도 있지만, UML 다이어그램은 필드나 메서드를 모두 선언하는 곳이 아니기 때문에 다이어그램을 그리는 목적에 필요한 것만 사용하는 것이 좋습니다. 추가로 보통 3개의 구획(compartment)을 사용 하지만 다른 미리 정의되거나 사용자 정의 된 모델 속성(비즈니스 룰, 책임, 처리 이벤트, 발생된 예외 등)을 나타내기 위한 추가 구획도 사용할 수 있다고 합니다.

Stereo Type (스테레오 타입)

스테레오 타입이란 UML에서 제공하는 기본 요소 외에 추가적인 확장요소를 나타내는 것으로 쌍 꺾쇠와 비슷하게 생긴 길러멧(guillemet, « ») 사이에 적습니다. 이 길러멧이란 기호는 쌍 꺾쇠와는 좀 다른 것으로 폰트 크기보다 작습니다. 종이나 화이트보드에 그릴 때는 상관없지만 공식적인 문서라면 이 기호를 구분해서 사용하는 것이 좋을 것 같습니다.

[그림 4] 스테레오 타입

위의 다이어그램은 인터페이스와 유틸리티 클래스를 표현하고 있으며 필드, 메소드 밑의 밑줄은 static(정적)필드 또는 메서드를, {readOnly}는 final 키워드를 사용하는 상수를 의미합니다. 스테레오 타입으로 많이 사용되는 것은 «interface», «utility», «abstract», «enumeration» 등이 있습니다.

Abstract Class/Method (추상 클래스 / 메서드)

추상클래스란 1개 이상의 메서드가 구현체가 없고 명세만 존재하는 클래스를 말합니다.

[그림 5] 추상클래스

추상 클래스의 이름과 메서드는 italic체나, {abstract} 프로퍼티를 사용하여 표기합니다. UML 툴에서는 italic체로 표기하는 것이 많지만 종이나 칠판에 그릴 때는 힘들게 italic체로 기울여서 적는 것 보다는 {abstract} 프로퍼티로 표기하는 것이 쉽고 명확할 것 같습니다. 또한 공식적인 것은 아니지만 스테레오타입을 사용하여 추상 클래스를 표기하기도 합니다.

4. 클래스간의 관계

클래스 다이어그램의 주 목적은 클래스간의 관계를 한눈에 쉽게 보고 의존 관계를 파악하는 것에 있습니다. 그렇기 때문에 클래스 다이어그램에서 가장 중요한 것이 클래스간의 관계입니다.

[그림 6] 클래스 관계 종류

위의 그림은 클래스간의 관계들의 종류와 표기법을 나타낸 것입니다. 이 외에 다른 표기법도 있습니다만 많이 사용된다고 생각하는 것들만 나타냈습니다.

Generalization (일반화)

Generalization은 슈퍼(부모)클래스와 서브(자식)클래스간의 Inheritance(상속) 관계를 나타냅니다. 여기서 Generalization이란 서브 클래스가 주체가 되어 서브 클래스를 슈퍼 클래스로 Generalize 하는 것을 말하고 반대의 개념은 슈퍼 클래스를 서브 클래스로 Specialize(구체화) 하는 것입니다. 상속은 슈퍼 클래스의 필드 및 메서드를 사용하며 구체화 하여 필드 및 메서드를 추가 하거나 필요에 따라 메서드를 overriding(오버라이딩) 하여 재정의 합니다. 또는 슈퍼 클래스가 추상 클래스인 경우에는 인터페이스의 메서드 구현과 같이 추상 메서드를 반드시 오버라이딩 하여 구현하여야 합니다.

[그림 7] Generalization

위와 같이 표기법은 클래스 사이에 실선을 연결하고 슈퍼 클래스 쪽에 비어 있는 삼각형으로 나타내고 자바에서는 extends 키워드를 사용하여 상속을 구현합니다.

Realization (실체화)

Realization은 interface의 spec(명세, 정의)만 있는 메서드를 오버라이딩 하여 실제 기능으로 구현 하는 것을 말합니다.

[그림 8] Realization

Realization을 나타내는 표기법은 2가지가 있습니다. 첫 번째는 인터페이스를 클래스처럼 표기하고 스테레오 타입 «interface»를 추가합니다. 그리고 인터페이스와 클래스 사이의 Realize 관계는 점선과 인터페이스 쪽의 비어있는 삼각형으로 연결합니다. 두 번째는 인터페이스를 원으로 표기하고 인터페이스의 이름을 명시합니다. 그리고 인터페이스와 클래스 사이의 관계는 실선으로 연결합니다. 
자바에서는 위와 같이 implements 키워드를 사용하여 인터페이스를 구현합니다.

Dependency (의존)

Dependency는 클래스 다이어그램에서 일반적으로 제일 많이 사용되는 관계로서, 어떤 클래스가 다른 클래스를 참조하는 것을 말합니다.

[그림 9] Dependency

위의 그림은 자바에서 참조하는 형태에 대해 코드를 보여주고 있습니다. 참조의 형태는 메서드 내에서 대상 클래스의 객체 생성, 객체 사용, 메서드 호출, 객체 리턴, 매개변수로 해당 객체를 받는 것 등을 말하며 해당 객체의 참조를 계속 유지하지는 않습니다.

[그림 10] Dependency Stereo Type

추가로 위와 같이 스테레오 타입으로 어떠한 목적의 Dependency인지 의미를 명확히 명시 할 수도 있는데 Dependency의 목적 또는 형태가 중요할 경우 사용할 수도 있을 것 같습니다.

Association (연관), Directed Association(방향성 있는 연관)

클래스 다이어그램에서의 Association은 보통 다른 객체의 참조를 가지는 필드를 의미합니다. 아래 클래스 다이어그램은 두 가지 형태의 Association을 나타내고 있습니다.

[그림 11] Assocication

첫 번째 다이어그램은 일반적인 Association으로 단지 실선 하나로 클래스를 연결하여 표기하고 두 번째 다이어그램은 Directed Association으로 클래스를 실선으로 연결 후 실선 끝에 화살표를 추가합니다. Association과 Directed Association의 차이는 화살표가 의미하는 navigability(방향성)인데 이것에 따라 참조 하는 쪽과 참조 당하는 쪽을 구분합니다. 두 번째 다이어그램은 User에서 Address 쪽으로 화살표가 있으므로 User가 Address를 참조하는 것을 의미합니다. Navigability가 없는 Association은 명시되지 않은 것으로 User가 Address를 참조할 수도, Address가 User를 참조할 수도, 또는 둘 다일 수도 있는 것을 의미합니다. 화살표 옆에 있는 –addresses는 roleName(역할명)을 나타내고 Address가 User 클래스에서 참조될 때 어떤 역할을 가지고 있는지를 의미합니다. 는 Multiplicity(개수)을 나타내는데 대상 클래스의 가질 수 있는 인스턴스 개수 범위를 의미합니다. 0…1 과 같이 점으로 구분하여 앞에 값은 최소값, 뒤에 값은 최대값을 의미하는데 *은 0…과 같은 의미로 객체가 없을 수도 있고 또는 수가 정해지지 않은 여러 개일 수도 있다는 것을 의미합니다. 이전에는 Multiplicity가 아닌 Cardinality로 불렸는데 "특정 집합 또는 다른 그룹에 있는 요소의 수"라는 Cardinality의 사전적 의미가 실제 인스턴스의 수가 아닌 가질 수 있는 범위를 지정하는 클래스 다이어그램에서의 의미에 적합하지 않다는 이유로 바뀌었습니다.

세 번째의 다이어그램은 두 번째의 다이어그램과 비슷한 의미를 가지고 있지만 다른 형태인 속성 표기법으로 나타낸 것입니다. 여기서 보는 바와 같이 roleName은 보통 클래스의 필드명이 됩니다. 속성 표기법이 두 번째 클래스 다이어그램과 조금 다른 점은 여러 개의 객체에 대한 Container(컨테이너)가 List라는 것까지 알려주고 있습니다.

그럼 두 번째와 세 번째의 다이어그램이 완전히 동일한 의미를 가지게 하려면 어떻게 해야 할까요?

[그림 12] Association Class

위와 같이 Association Class(연관클래스)를 사용하여 어떤 종류의 컨테이너 클래스가 사용되는지 까지 나타낼 수 있습니다. 하지만 사실 특이한 클래스도 아니고 자바에서 기본으로 제공되는 List를 저렇게 표기하는건 조금 귀찮은 일일 수 있을 것 같습니다. 그래서 스테레오 타입으로 표기할 수도 있습니다. 이로써 [그림11] 세 번째 다이어그램의 속성 표기법으로 표현된 것과 모든 의미가 같아졌습니다. 보통은 클래스의 속성이 기본 제공 클래스가 아니거나 중요 또는 강조하고 싶을 때 Association 관계로 나타냅니다. Association Class는 조금 다른 의미로도 사용될 수 있습니다. 예를 들어 학생과 수강과목 클래스가 Association 관계를 가지고 있는데 단순 Association 관계가 아니라 각 관계마다 해당 과목의 학점이라는 속성이 필요하다면 어떻게 나타낼 수 있을까요? 이럴 때도 Association Class를 사용하여 나타낼 수 있습니다.

[그림 13] Association Class

물론 grade라는 값을 Subject 클래스 자체의 속성으로 할 수도 있지만 Subject의 속성이라기 보다는 Student와 Subject 사이의 관계에 대한 속성이라는 관점에서 위의 다이어그램처럼 Association Class로 나타낼 수 있습니다.

[그림 14] Association Class Vs Association

또한 [그림13]의 Association Class를 풀어서 위처럼 Association 관계만으로도 나타낼 수 있습니다. [그림13]은 Student와 Subject의 관계를 나타내고 싶은데 그 관계에 대한 속성값으로 Grade가 있는 것이고 [그림14]는 단순 3개 클래스를 Association 관계로 나타낸 것처럼 의미는 조금 다를 수 있으나 구현되는 코드는 같을 것입니다.

[그림 15] Association Class Code

Aggregation (Shared Aggregation, 집합)

Aggregation은 Shared Aggregation이라고도 하며 Composition(Composite Aggregation)과 함께 Association 관계를 조금 더 특수하게 나타낸 것으로 whole(전체)와 part(부분)의 관계를 나타냅니다. Association은 집합이라는 의미를 내포하고 있지 않지만 Aggregation은 집합이라는 의미를 가지고 있습니다.

[그림 16] Aggregation

표기법은 위와 같이 whole과 part를 실선으로 연결 후 whole쪽에 비어있는 다이아몬드를 표기합니다. Part쪽에는 화살표를 명시하여도 되고 명시하지 않아도 됩니다. Aggregation의 다이아몬드가 이미 navigability의 방향을 표현하고 있기 때문입니다. 그런데 코드를 보시면 위에서 보았던 Association의 코드와 똑같습니다. Association과 Aggregation은 집합이라는 개념적인 차이는 있지만 코드에서는 이 차이를 구분하기 힘듭니다.

[그림 17] UML Aggreagtion 출처: OMG Unified Modeling Language Superstructure 2.4.1

위와 같이 UML은 집합이라는 개념 외에 명확한 Aggregation의 정의를 제공하지 않습니다. 그래서 여러 프로그래머나 분석가, 설계사가 Aggregation 관계에 대해 자기 나름의 정의를 내렸기 때문에 혼란이 생겼고 Aggregation은 사용하지 않는 것이 좋다고 합니다. 저도 이에 동의 하는 바이지만….. 아직도 논란이 되고 있는 부분이고 정확한 답을 내기는 어려울 것 같습니다.그리고 도서 “The Object Primer: Agile Model-Driven Development with UML 2.0(저자 Scott W. Ambler)”과 “UML 실전에서는 이것만 쓴다(저자 Robert C. Martin)”에 UML 2.0에서는 위의 문제 때문에 Aggregation이 제외 되었다는 말이 있습니다. 그래서 근거를 찾기 위해 이곳 저곳 찾아본 결과 처음엔 제외 되었다가 커뮤니티의 강력한 항의로 다시 들어왔다고 합니다. 실제로도 UML 1.x 버전에 비해 2.x 버전에는 Aggregation에 대한 내용이 많이 사라지긴 했지만 몇 군데 남아 있는 걸 확인했습니다.

[그림 18] Aggregation Dropped 출처: https://coderanch.com/t/154620/java-Architect-OCMJEA/certification/Association-Aggregation

Composition (Composite Aggregation, 합성)

Composition(또는 Composite Aggregation)도 Aggregation과 비슷하게 whole(전체)와 part(부분)의 집합 관계를 나타내지만 개념적으로 Aggregation보다 더 강한 집합을 의미합니다.

[그림 19] Composition

Composition의 표기법 또한 위와 같이 Aggregation과 비슷하지만 다이아몬드의 내부가 채워져 있다는 점만 다릅니다. 그럼 Composition의 개념과 코드에서는 Aggregation과 어떤 차이가 있는지 보겠습니다. Composition은 Aggregation보다 강한 집합이라고 했습니다. 여기서 강한 집합이란 part가 whole에 종속적이어서 part가 whole의 소유입니다. 반면 Aggregation은 part가 whole에 대해 독립적이어서 whole이 part를 빌려 쓰는 것과 비슷합니다. 이러한 의미 때문에 Aggregation과는 다르게 명확하게 나타나는 점이 있습니다.

  • 첫 번째, part를 가지는 whole 인스턴스가 part 인스턴스의 전체 수명을 책임진다.
  • 두 번째, part에 해당하는 인스턴스는 공유 될 수 없다.

첫 번째의 whole 인스턴스가 part 인스턴스의 전체 수명을 책임진다는 의미는 다음과 같습니다.

  • whole 인스턴스가 part 인스턴스를 생성
  • whole 인스턴스가 소멸되면 part 인스턴스도 함께 소멸
  • whole 인스턴스가 복사되면 part 인스턴스도 함께 복사

두 번째의 part에 해당하는 인스턴스는 공유 될 수 없다는 의미를 먼저 보겠습니다.

[그림 20] Shallow Copy

위의 예제는 클래스 다이어그램이 아닌 객체 다이어그램으로 [그림19]를 객체로 표현한 것입니다. 참조변수 userA가 참조하고 있는 user 객체를 clone하여 clonedUser 객체를 만들고 참조변수 userB에서 참조하고 있습니다. user객체는 제대로 복사가 됐지만 user객체 안에서 참조하고 있는 address는 clonedUser 객체도 똑같이 참조하고 있습니다. 이것을 shallow copy(얕은 복사)라고 하며 이 경우에 part에 해당하는 address 객체가 공유 된 것입니다. 또한 첫 번째 조건의 의미 중 whole 인스턴스가 복사되면 part인스턴스도 복사되어야 한다는 조건도 충족시키지 못했습니다.

[그림 21] Deep Copy Object Diagram

위의 다이어그램에서는 user 객체가 복사되어 clonedUser 객체가 생성될 때 user 객체가 참조하여 가지고 있는 address 객체 또한 같이 복사 되어 clonedUser 객체는 새로운 clonedAddress 객체를 참조하여 가지고 있습니다.

[그림 22] Deep Copy Code

Aggregation 관계와 Composition 관계를 UML 툴에서 그린 후 Code Generation을 하면 똑같은 코드가 생성됩니다. 하지만 Composition에서는 개발자가 구현해야 할 부분이 몇 가지 있습니다. 위에서 본 part에 해당하는 인스턴스가 공유되지 않게 하기 위한 Deep Copy 구현과 part를 가지는 whole 인스턴스가 part 인스턴스의 수명 전체를 책임져야 한다는 것에 따라 whole 클래스의 생성자 또는 기타 메서드 내에서 part 인스턴스를 생성해야 하고 외부에서 part 객체를 생성하지 못하도록 whole 클래스에는 part 인스턴스에 대한 setter가 있으면 안됩니다. 다른 언어에서는 생명주기와 관련된 다른 추가적인 것도 있겠지만 자바에서의 객체 소멸은 Garbage Collector가 수행하므로 part 인스턴스의 소멸은 신경쓰지 않아도 됩니다.


예제 자료


'Programming > Standard' 카테고리의 다른 글

정규표현식  (0) 2017.01.12
블로그 이미지

SherryBirkin

,

Interface - 여러클래스에 공통적인 기능을 추가 하기 위해 사용 

              (파생클래스에서 구현해야함 <interface에 정의된 것 전부>)


Abstract - 파생클래스에서 공유할 기본클래스의 공통적인 정의 제공하기 위해 사용

              (파생클래스에서 구현해야함 <Abstract 선언된 것>)


Virtual   - 메서드,속성, 인덱서 또는 이벤트 선언을 한정하는데 사용

             (파생클래스에서 Override 하여  따로 사용할 수 있음)




=> Virtual은 Override 하지 않아도 사용 가능한 완전한 class (그대로 사용가능)

     Virtual한정자가 달린 것들을 재정의하여 사용 가능.


=> abstract는 여러개의 파생 클래스에서 공유할 기본 클래스의 공통적인 정의만

    하고 ,파생클래스에서 abstract 한정자가 달린 것을 모두 재정의 해야함.


=> Interface는 abstract와 비슷하지만 멤버변수를 사용할 수 없다.



예제 소스

Oriented.zip

'Programming > C#' 카테고리의 다른 글

Input을 전체적으로 Control 하고싶은 경우  (1) 2017.12.26
DataSource Binding 방법  (0) 2017.10.31
Dictionary 탐색중 삭제하기  (0) 2017.08.17
캐스팅 as, is  (0) 2017.06.30
DataGridView 스크롤시 열 고정, 구분자  (0) 2016.12.22
블로그 이미지

SherryBirkin

,

GridView에서 특정 Data를 Binding하려면



그리드뷰에 DataBindings -> 고급



DataSource로 변경하고 바인딩할 데이터와 업데이트 모드를 설정한 다음


바인딩 해주면 해당 Data로 바인딩되어 Grdview에 자동적으로 출력한다.




List는 최초 한번만 GridView에 업데이트 되고 ReBinding하여도 

    Update되지 않음

  < 따라서, List => BindingList 를 써야 한다. >

   

'Programming > C#' 카테고리의 다른 글

Input을 전체적으로 Control 하고싶은 경우  (1) 2017.12.26
Virtual, Abstract, Interface  (0) 2017.11.06
Dictionary 탐색중 삭제하기  (0) 2017.08.17
캐스팅 as, is  (0) 2017.06.30
DataGridView 스크롤시 열 고정, 구분자  (0) 2016.12.22
블로그 이미지

SherryBirkin

,

Dictionary<Key, Value> 형태로 쓰게되는데


Key값으로 Loop(반복문)를 돌리고


해당Key만 삭제하면 된다.



foreach(string sKey in Dictionary.Keys.ToList())

{

      // Dictionary.Keys[sKey] == value;  <- Key로 찾은 Value

      Dictionary.Remove(sKey);           <- Key를 이용해서 Value 삭제

}



'Programming > C#' 카테고리의 다른 글

Virtual, Abstract, Interface  (0) 2017.11.06
DataSource Binding 방법  (0) 2017.10.31
캐스팅 as, is  (0) 2017.06.30
DataGridView 스크롤시 열 고정, 구분자  (0) 2016.12.22
Enum에서 정한 Name을 index로 가져오기  (0) 2016.12.22
블로그 이미지

SherryBirkin

,

캐스팅 as, is

Programming/C# 2017. 6. 30. 15:37

개체는 다형성이므로 기본 클래스 형식의 변수는 파생 형식을 가질 수 있습니다. 


파생 형식의 메서드에 액세스하려면 값을 파생 형식으로 다시 캐스팅해야 합니다. 그러나 이러한 경우 단순한 캐스팅을 시도하려면 <xref:System.InvalidCastException>이 throw될 수 있는 위험을 감수해야 합니다. 


이 때문에 C#은 is 및 as 연산자를 제공합니다. 이러한 연산자를 사용하면 예외를 throw시키지 않고 캐스트 성공 여부를 테스트할 수 있습니다. 

일반적으로 캐스트가 성공하면 실제로 캐스트 값을 반환하는 as 연산자가 훨씬 효율적입니다.


 is 연산자는 부울 값만 반환합니다. 따라서 이 연산자는 개체 형식을 결정하고 실제로 캐스트하지는 않는 경우에 사용할 수 있습니다.


as를 사용했을때 int, double, float등에 Null값을 넣을수 없지만

int? a  = 변수면 as int?;

앞뒤로 ?를 붙여주면 변수에 null값이 들어가게 된다.


class SafeCasting { class Animal { public void Eat() { Console.WriteLine("Eating."); } public override string ToString() { return "I am an animal."; } } class Mammal : Animal { } class Giraffe : Mammal { } class SuperNova { } static void Main() { SafeCasting app = new SafeCasting(); // Use the is operator to verify the type. // before performing a cast. Giraffe g = new Giraffe(); app.UseIsOperator(g); // Use the as operator and test for null // before referencing the variable. app.UseAsOperator(g); // Use the as operator to test // an incompatible type. SuperNova sn = new SuperNova(); app.UseAsOperator(sn); // Use the as operator with a value type. // Note the implicit conversion to int? in // the method body. int i = 5; app.UseAsWithNullable(i); double d = 9.78654; app.UseAsWithNullable(d); // Keep the console window open in debug mode. System.Console.WriteLine("Press any key to exit."); System.Console.ReadKey(); } void UseIsOperator(Animal a) { if (a is Mammal) { Mammal m = (Mammal)a; m.Eat(); } } void UseAsOperator(object o) { Mammal m = o as Mammal; if (m != null) { Console.WriteLine(m.ToString()); } else { Console.WriteLine("{0} is not a Mammal", o.GetType().Name); } } void UseAsWithNullable(System.ValueType val) { int? j = val as int?; if (j != null) { Console.WriteLine(j); } else { Console.WriteLine("Could not convert " + val.ToString()); } } }

블로그 이미지

SherryBirkin

,

■ 정규표현식
    정해진 패턴을 사용해서 패턴에 일치하는 데이터 검색을 지원하는 표현식

 

■ 정규표현식에 쓰이는 특수문자
   1. '.'
      임의의  문자
      ex) s.e -> sae, sbe, sce, sde ...
          .ce -> ace, kce, dce ...
 
   2. '*'
      바로 앞의 문자가 없거나 하나 이상
      ex) s*e -> e, se, see, ssse ...
          abc* -> ab, abc, abcc, abccc ...
          h*im -> im, him, hhim, hhhim ...

 

   3. '+'
      바로 앞의 문자가 하나 이상
      ex) s+e -> se, sse, ssse ...

 

   4. '?'
      바로 앞의 문자가 없거나 하나
      ex) th?e -> e, the 이 두가지표현이 유일하겠지.

 

   5. '^'      (문자열에 대한 녀석)
      바로 뒤의 문자열로 시작.
      ex) ^The.. 뒷부분부터 공백까지 검사. -> The girl is, Theather
          ^a?bc -> bc, abc ...
          ^.e -> he, me, request, settle ...
          ^s.e?.. e는 나와도 되고 안나와도 되고 -> sa, sae, sb, sbe ...

 

   6. '$'      (문자열에 대한 녀석)
      바로 앞의 문자열로 종료
      ex) a?bc$ -> eeabe, seebc, bc ..
          +.e$ -> onthetoe, bctae, appetittle ...
          s?c+$ -> e, se, ee, eee, seee, seee ...

 

   7. '[]'
      [] 안에 있는 문자 중 하나
      범위는 '-'로 지정
      ex) [ab]cd -> acd, bcd ..
          [a-z] -> 영문 소문자
          [a-zA-Z] -> 영문자........ 자바스크립트에서 어렵게 구현한 녀석들인데 간편하내~
          [0-9] -> 숫자
          ag[a-z] -> aga, agbcd, agzzz ...

          ^ab[cd]ef -> abcef, abdef ...
          ^[a-zA-Z] -> 영문자로 시작....
                       아이디 검사할 때 첫글자가 영문자와 '_' 만 쓰도록 할때는 ^[a-zA-Z_]
          ^[가-힣]  ->  한글로 시작해야 할 때
          [^a-zA-Z0-9]   ->   ^이 안으로 들어가면 제외의 의미가 된다는거~ 부정의 의미.. 영문자나 숫자로 시작 X
          [a-zA-Z0-9]$ -> 영문자나 숫자로 종료

          "[가-힣]"   ->  한글... 완성형만 가능해.. 가령, ㅋㅋㅋ 같은 녀석은 안된다는 거지.
          "[abc]"  ->   이 안에 있는 문자중에 하나. 즉, a b c 중에 하나의 문자란 말이지.
                        C#문법으로 치면 ("a" || "b" || "c")와 같은 개념이야..


    8. '{}'
       {} 앞의 문자나 문자열 출현 횟수, 스키마에서 min/maxoccur과 같은 개념으로 이해하렴.
       ex) a{2}b -> aab ... a가 꼭 2번 나와야 한다는 뜻.
           a{2,}b -> aab, aaab, aaaab ...  a가 최소 2번 이상 나오도록 하라는 뜻.
           a{2, 3}b -> aab, aaab   ... a는 최소 2번 최대 3번 나오도록 하라는 뜻.

 

    9. '()'
       ()안에 있는 문자를 그룹화
       ex) a(bc){2} -> abcbc  ... a다음 bc가 2번 나와야 한다는 뜻..
           a(bc)* -> abcbcbc ...  a다음 bc의 출현횟수는 무한대가 가능하다는 뜻.

 

    10. '|'
        or 연산자.......
        영어로만 아이디를 만들어라?      [a-zA-Z]+    공백이 없는 영어단어
        ex) he|she -> he, she is..
            (he|she)is -> heis, sheis ...


    11. 특수 문자 사용
        ^  []  $  ()  |  *  +  ?  {}  \
        앞에 \ 붙여서 사용
        ex) \*+  -> * 가 하나 이상 포함된 패턴...... * 나 ** 나 *** 별이 무한대로 계속도 가능하고 말야.

            \d : 순수한 숫자, 정수값, 0-9
            \d{2,3}-/d{3,4}-/d{4}  :   전화번호를 찾는 정규식이야... 여기서 하이퍼는 그냥 하이퍼(-)야.
                                       -? 하이퍼뒤에 물음표가 있으면 하이퍼가 있어도 되고 없어도 된다는 뜻.
            \D : 숫자가 아닌 나머지 모든 얘.
            \w : [a-zA-Z0-9] 의 줄임표현.
            \W : [^a-zA-Z0-9] 영문자와 숫자만 아니면 된다는 뜻.
            \s : 공백
            \S : 공백이 아닌 나머지 얘들.
      

 

     12. 문제
         1) 4.6% 라는 걸 찾겠다.
               [0-9]{1,3}\.?[0-9]*%

 

         2) 전화번호를 찾자.
                \d{2,3}-\d{3,4}-\d{4}
             [0-9]{2,3}-[0-9]{3,4}-[0-9]{4}


 

         3) url 주소를 가져와보자.
                http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

 

         4) 이름 : ( textBox    )
                [가-힣]{2,5}     ->   한글을 최소 2~5까지 입력가능하다는 뜻.

 

         5) 나이 : ( textBox    )
                [0-9]{1,2}       ->   숫자가 최소 1~2까지 입력가능하다는 뜻.
                1?[0-9]?[0-9]

 

         6) 민증번호
                [0-9]{6}-[0-9]{7}
             [0-9][0-9][01][0-9][0123][0-9]-[12][0-9]{6}



http://funny7103.blog.me/90027820184


'Programming > Standard' 카테고리의 다른 글

UML (Unified Modeling Language)  (0) 2017.11.06
블로그 이미지

SherryBirkin

,

dgv.Columns[index].Frozen = true; 

가장좌측에 이름이 있고 스크롤했다면 어떤건지 파악하기가 어렵지만

Frozen하면 고정되기때문에 파악이 쉬움.


dbView.Columns[index].DividerWidth = 수치;

index이전과 이후 사이의 구분자가 커져서 구분하기가 쉬워짐.



블로그 이미지

SherryBirkin

,