728x90
300x250

[UI(User Interface), C++] 은행 통장명세서 및 계좌 구현, 사용자 인터페이스 설계

 

                                             은행 통장명세서 및 계좌 구현, 사용자 인터페이스 설계

                     Bank account details and account implementation, user interface design

 

                                                                                                  도도  {#i}

                                                                                              ( dodo at 127.0.0.1 )

 

사용자 인터페이스 설계를 소개하려고 한다. 일상생활에서 쉽게 살펴볼 수 있는 주제로 글을 담았다.

은행 통장명세서 및 계좌 구현 그리고 사용자 인터페이스 설계 등을 효율적으로 하는 방법과 더불어 몇 가지 가설을 바탕으로 공부를 진행하였다.

공부의 내용에는 크게 몇 가지 사항이 있는데 하나는 사회과학 관점에서의 가설을 바탕으로 한 몇 가지 공부를 수행하였다.

가설을 실질적인 사용자 체감 관점 기준으로 설계하려고 하였으며 학생, 직장인, 사업자 등의 체감적인 인터페이스를 실증적으로 다뤄보려고 하였다.

 

참고할 점: 정부 조직 개편 등이 있다면, 부처, 관계기관 등의 명칭이 달라질 수도 있음. 링크된 URL이 달라지거나 등의 현상이 발생할 수도 있음.
-> 시스템에 의한 예기치 못한 경우도 있어요.

 

글을 읽기 전에 도도는 연구원이냐? 아니에요.

 


1. 초록(Abstract)

 

사용자 인터페이스 설계에 앞서, 통장과 체크카드를 기준으로 작성하였다. 체크카드를 사용하면, 실시간으로 통장을 거쳐 현금이 인출된다.

이러한 기본적인 정보 등을 바탕으로 은행 통장명세서 및 계좌 구현, 사용자 인터페이스 설계에 대해서 공부하였다.

사용자 인터페이스에 대해서는 크게 통장을 바탕으로 하여 구조 등을 설계하였으며, 이를 바탕으로 통장 명세서를 도출하여 가설을 몇 가지 두고 실증에 대해서 논하게 되었다.

 


1-1. 금융관련 법규사항

 

http://www.law.go.kr/법령/금융실명거래및비밀보장에관한법률


도도의 글에서의 해당 공부는 이의 사실에 해당사항이 없다.

 

관련 법률에 관한 사항은 관계기관을 통해서 문의해보면 도움이 될 것으로 보인다.

 

 

이 공부와 관련된 개인정보보호법과 관련된 사항이다.
http://www.law.go.kr/법령/개인정보보호법/(14839,20170726)

 

도도의 글에서의 공부는 이의 사항에 해당이 없어요. 아래의 해명 글을 더보기를 통해서 살펴볼 수 있다.

 

 

관련 법률에 관한 사항은 관계기관을 통해서 문의해보면 도움이 될 것 같아요.

 

 


2. 사용자 인터페이스 설계(User interface design)

 

사용자 인터페이스 설계는 아래와 같이 수행할 수 있다.

사용자 인터페이스 설계를 Top-bottom Viewer Model 방식으로 하여 설계하였다.

 

그림 2-1. Top/Bottom Viewer Model - Adopted 도도(Dodo)

 

그림 2-1은 도도가 기존의 Top Bottom 방식 모델을 살짝 변형하여 Top/Bottom Viewer Model을 고안하였다.

사용 방법은 매우 간단하다. 사용자 시점과 개발자 시점 중간 사이를 설계자 시점이라고 봤다.

도도가 공부를 수행한 방법은 그림 2-1의 모델로 진행하였다.

 

개발자 표현에 세미로직(Semi-Logic)이라고 정의했는데, 개발자가 로직(Logic)을 설계하는 경우가 있음.
설계자는 인터페이스 범위를 벗어나지 못하지만, 개발자는 시야가 훨씬 크다.
그림 2-1을 보고 오해하지 않았으면 좋겠음.

 


3. 은행 - 통장 구현(Bank - Bankbook Implementation)

 

콘솔로 이러한 화면을 구현해보는 것이다. 굉장히 많은 시간이 소요될 것으로 보인다.

 

 

그림 3-1. 은행 통장 표지 설계하기 - 도도(Dodo)

 

 

그림 3-2. C++에서 구현했을 때 레이아웃의 예 - 도도(Dodo)

 

그림 3-2는 C++에서 수작업으로 레이아웃을 구현했을 때 이러한 레이아웃 구조를 가질 수 밖에 없을 것 같다.

 

글자 정렬 관련 함수: setw, seft, setprecision 

#include <iomanip>

main(){
     setprecision(3)
     cout.setf(ios::left);
     cout.setf(ios::right);
     setw(10)

}

 

 

co.kr이긴 한데, 법령에 의해서 설치가 된 특이한 은행이 있다.

1. 국가계열의 은행
우체국 은행과 IBK기업은행(이하 "중소기업은행")이다. IBK계열사 등에 대해서는 무관하다.
법령에 의해서 운영되는 은행은 "우체국예금", "KDB산업은행", "IBK기업은행"이다.
법인 형태로 운영되는 곳은 "KDB산업은행", "IBK기업은행"이 있다.

"기술보증기금, 한국주택금융공사"도 은행에 해당된다.

https://www.epostbank.go.kr/
https://www.ibk.co.kr/common/navigation.ibk?linkUrl=/intro/announce/history_01.jsp&pageId=IR01030100
https://www.kdb.co.kr/ih/wcms.do

http://www.law.go.kr/법령/중소기업은행법
http://www.law.go.kr/법령/우체국예금ㆍ보험에관한법률
http://www.law.go.kr/법령/한국산업은행법
http://www.law.go.kr/법령/기술보증기금법
http://www.law.go.kr/법령/한국주택금융공사법

2. 은행법에 의해 설치 또는 운영을 하는 은행(사업자로 운영하는 형태)

은행법에 적용받는 은행의 예를 들면, 다음과 같다.


[국내에 있는 은행]
1. DGB대구은행, BNK부산은행, 광주은행, 제주은행(신한은행), 전북은행(광주은행), BNK경남은행 (온/오프라인 점포 - 특정 지역에 위치함.)
2. KED하나은행, KB국민은행, Citibank, 한국수출입은행, 수협은행, SC제일은행, NH농협은행 (온/오프라인 점포)

3. 카카오뱅크 (온라인 점포)

http://www.law.go.kr/법령/은행법

 

3. 증권(Securities)

1. 삼성증권, 미래에셋증권, KB증권, 대신증권, NH투자증권, IBK투자증권 등의 많은 회사가 있다.


 

시중 은행이 많이 있으니 금융결제원 등을 참고하면 도움이 될 것이다.
은행 수수료에 관해서는 소개하지 않았다. 각 은행별로 정책이 다를 수 있어요.

 


4. 집에서 통근하는 학생 (집이 학교 옆에 사는 경우)

 

아래의 그림은 집이 학교 옆에 사는 경우에 대해서 설계하였다.

 

 

그림 4-1. 집에서 통근하는 학생 / "가정" - 도도(Dodo)

 

그림 4-1은 집에서 통근하는 학생을 가정하고 통장 내역을 사용자 인터페이스로 설계하였다.

현금흐름이 크게 그렇다.

 

해설1) 그림 4-1을 자세히 보면, "지로"가 있다. 지로 시스템에서의 오기입 환불금을 의미함.
해설2) 학교 식당의 경우, OOOO회사명으로 영수증이 잡히는 경우가 있음. 현찰로 거래할 경우 결제내역을 알 길이 없음.

 

학교가 집 근처일 때 버스도 탈 필요가 없는 경우

 

 

그림 4-2. 집에서 통근하는 학생의 통장내역서 - 도도(Dodo)

 

그림 4-2는 집에서 통근하는 학생의 통장내역서를 예시로 그려보았다.

통장내역서가 마지막 페이지에 도달하였을 때 어떻게 처리할 것인지 등에 대해서 심층적인 고민을 해볼 필요가 있다고 주장한다.

 

참고할 점: 현찰 사용에 대해서는 기입하지 않았음.
체크카드로 결제한 경우를 가정하고 이해하면 도움이 될 것으로 보인다.

 

집에서 버스를 타고 학교에 통학하는 학생도 있을 수가 있다.
산출식은 매우 단순하다.

"등교일수 * 왕복(2회) * 버스요금 = 계"로 산출할 수 있다.

 

 

그림 4-3. 통학하는 경우 - 도도(Dodo)

 

그림 4-3은 학생이 학교에 통학하는 경우를 가정하고 설계하였다.

 


5. 개별주거 - 거주자(학생 등)

 

개별주거라고 하면, 영외를 벗어나서 지내는 경우라고 정의하였다.

학생이 될수가 있고, 직장인이 될 수가 있고 경우의 수는 아래와 같은 수식으로 정의해볼 수 있다.

 

 

개별주거 생활을 한다고 가정했을 때 일어날 수 있는 현금흐름을 기준으로 설계를 해보았다.

 

 

그림 5-1. 타지역에서 개별거주하고 있는 경우 - 학생 / "가정" - 도도(Dodo)

 

그림 5-1는 타지역에서 개별거주하고 있는 학생이라고 가정하고 설계하였다.

 

해설
1. 선불버스: 시내,시외버스(City bus), 택시(Tax), 항공(Airport), 배(Ship), 기차(Train) 등의 운송수단(전국 공통 교통카드 사업자).
   => 국토교통부에서 관리하고 있다. http://cyber.molit.go.kr/traffic/main.jsp
2. EOO위원회: EOO위원회는 각종 자격증 시험이라고 가정하였음.
3. OO테크: OOO학생이 일용직으로 근무한 회사에서 일당을 넣어준 경우.

 

 

그림 5-2. 타지역에서 개별거주하고 있는 학생 - 도도(Dodo)

 

그림 5-2는 타지역에서 자취하는 학생이라고 가정하고 설계하였다.

2학기를 지냈다고 가정한다.

학생이 주거지를 퇴소하고, 생활관에 합격하여 생활관비를 납부하게 된 경우이다.

 


       한 명이 거주해야만 정상적인 공간일 수도 있지만, 경우에 따라서 8평 내에서 분할 거주자가 있을 수도 있음.

 

꼭 확인해야 할 것


-> 1. 전입신고와 관련된 사항 (정부 24)

http://www.gov.kr/main?a=AA020InfoCappViewApp&HighCtgCD=A01010&CappBizCD=13100000016&tp_seq=01

-> 2. 등기사항 관련 (법원 등기소)
http://www.iros.go.kr

 

 

[TV 수신료 등에 관한 것]

1. 병원비, 약제비 등에 관한 정보는 "건강보험심사평가원"에서 살펴볼 수 있다.
http://www.hira.or.kr/main.do

2. 과학기술정보통신부
주요 업무는 ICT, R&D, 과학기술정책 등의 업무를 담당하고 있다. http://www.msit.go.kr
-> TV 수신료 등에 관한 것도 관리를 하는 것으로 보인다.

3. 교육부
교육부가 학생에 관한 것은 담당하고 있을 것 같다.
http://www.moe.go.kr 

4. 예비군 훈련 / 민방위 훈련
예비군 훈련에 관한 것은 예비군 홈페이지나 국방부에 문의해보기 바란다.
https://www.yebigun1.mil.kr/

http://www.mnd.go.kr/mbshome/mbs/mnd/subview.jsp?id=mnd_011102030000 


국민재난안전포털이다.
http://m.safekorea.go.kr/

5. 장애인에 관한 사항

보건복지부를 참고하면 도움이 될 것으로 보인다.

http://www.mohw.go.kr 


6. 농축산 및 동물에 관한 사항
농림축산식품부에서 관할하고 있다.
http://www.mafra.go.kr,


동물 관리시스템 등도 운영하고 있다.
http://www.animal.go.kr

7. 학교 식당의 경우, OOOO회사명으로 영수증이 잡히는 경우가 있음. 현찰로 거래할 경우 결제내역을 알 길이 없음.
8. 임대 주택의 경우, 영수증, 세금계산서 등을 안 끊어주는 경우가 많음. 통장 거래가 많다. (월세 등의 존재를 알 수가 없음.)
9. 여성 및 가족에 관한 것
여성 가족부에 문의해보기 바란다. http://www.mogef.go.kr/


 

[보충]

 

아래의 그림은 학생이 타지역에서 거주할 경우, 주거 등에 관한 것이다.

 

 

그림 5-3. 대도심에 있는 건물들 - 도도(Dodo)

 

 

그림 5-4. 건물 사이에서 걸어서 이동하는 모습 - 도도(Dodo)

 

그림 5-3, 그림 5-4는 건물 사이에서 걸어가는 모습을 가정으로 두고 그려보았다.

 


6. 생활관에 거주하는 학생으로 전환 또는 직장인(이하 "회사 사택" 또는 "회사 생활관")

 

아래의 그림은 생활관에 거주하게 되었을 때 학생 기준에서 발생할 수 있는 현금흐름이 될 수 있다.

 

 

그림 6-1. 생활관에 거주하는 학생 - 도도(Dodo)

 

그림 6-1을 자세히 관찰해보면, 몇 가지 흥미로운 사실을 알 수 있다.

OO재단에 이자를 냈다. 학과O회비로 돈을 냈다. 택배를 통해서 물건을 보냈다.

"이삿집", "택배", "부모님 차량으로 이송" 등이 있을 수 있다.

 

회사 사택 또는 회사 생활관을 보유하고 있는 회사의 경우가 일부 있을 수 있음.

 

꼭 확인해야 할 것: 전입신고가 가능한지?
-> http://www.gov.kr/main?a=AA020InfoCappViewApp&HighCtgCD=A01010&CappBizCD=13100000016&tp_seq=01

학교 영수증에 관한 사항
- 그러나 세금계산서, 계산서 등이 아니라 A4용지에 출력해서 행정실에서 발행을 수기로 해주고 있다.
   학교에서 해주는 경우가 있고, 생활관에서 따로 별도로 해주는 경우가 있다.

- BTL 기숙사의 문제 등도 있다.

 

 


7. 직장인 - 자녀 중/고등학교 생활비

 

직장인으로 근무중이신 자녀 중/고등학교 학생의 생활비 시스템을 아래와 같이 사용자 인터페이스 관점으로 설계하였다.

 

 

그림 7-1. 직장인 부모님의 자녀 중/고등학생 학비 - 도도(Dodo)

 

그림 7-1은 직장인 부모님의 자녀 중/고등학생 학비를 설계하였다.

크게 어렵지 않는 구조로 설계가 가능하였다.

 

수입 구조는 간단하게 "월급"이 될 수 있다.

 

1. 단, 옷(품위유지비), 식료품 등은 산출하지 않았음.

 
[참고사항]

2. 생활법령에 의하면, "학원 또는 교습소"라고 표현한다.
http://easylaw.go.kr/CSP/CsmMain.laf?csmSeq=1140

 

가정의 예)

1. 유치원 교육비 등 
http://www.easylaw.go.kr/CSP/CnpClsMainBtr.laf?popMenu=ov&csmSeq=631&ccfNo=2&cciNo=3&cnpClsNo=1 생활법령
http://e-childschoolinfo.moe.go.kr/ 유치원 알리미
http://www.childinfo.go.kr/main.jsp 어린이집 유치원 통합정보공시


2. 병원비, 약제비 등에 관한 정보는 "건강보험심사평가원"에서 살펴볼 수 있다.
http://www.hira.or.kr/main.do

 

3. 고용 등과 관련된 사항 

고용노동부에서 관할하고 있다. "일자리창출" 등의 업무를 수행한다. http://www.moel.go.kr/index.do
실업자 급여, 직업훈련, 노동정책 관련 문의도 담당하고 있다.
실업급여를 지급받는 대상이 어떻게 되는지 문의를 해보면 많은 도움이 될 것으로 보인다.

=> 6개월 이상 직장에 재직한 사람에 한해서 실업급여를 받으려면, 직장에 다니고 만기 퇴사를 해야 한다. 회사를 중도퇴사 하면 받을 수 없다고 한다.

노동을 하는 도중에 다쳤을 경우, 근로복지공단에서 업무를 수행하고 있다. 문의해보기 바란다.
https://www.kcomwel.or.kr/kcomwel/main.jsp


4. 기획재정부
기획재정부에서는 조금 어려운 용어가 많으니 해석을 하면, "국가의 경제안살림"을 맡고 있다. 재정을 담당한다고 하면 이해가 될지는 모르겠다.
어려운 일들을 수행한다.

http://www.moef.go.kr/

5. 환경부
환경부에서는 육안으로는 잘 안 보이는 일을 수행한다.
"환경오염", "물 상하수도", "자원 순환" 등 많은 일을 수행하고 있다.

http://www.me.go.kr

6. 과학기술정보통신부
주요 업무는 ICT, R&D, 과학기술정책 등의 업무를 담당하고 있다. http://www.msit.go.kr 
-> TV 수신료 등에 관한 것도 관리를 하는 것으로 보인다.

7. 행정 / 지방세에 관한 사항
행정안전부나 관할 지방자치단체에 문의하기 바란다.
http://www.mois.go.kr

8. 국세에 관한 실무에 관한 사항
관할 지방세무서나 국세청을 통해서 문의하기 바란다. 상급기관은 기획재정부이다.
https://www.nts.go.kr/

9. 금전 거래 등으로 인해 신용이 불량한 상태가 되어버린 경우

신용회복위원회에 문의해보면 많은 도움이 될 것으로 보인다.
https://www.ccrs.or.kr/main.do
실무적으로 많은 기능을 하고 있다.

10. 장애인에 관한 사항

보건복지부를 참고하면 도움이 될 것으로 보인다.

http://www.mohw.go.kr 

11. 농축산 및 동물에 관한 사항

농림축산식품부에서 관할하고 있다.
http://www.mafra.go.kr,


동물 관리시스템 등도 운영하고 있다.
http://www.animal.go.kr

12. 바다에 관한 사항
해양수산부에서 운영하고 있는데, 도도는 바다생태 정보나라 사이트를 추천한다.
http://www.ecosea.go.kr/

13. 학교 영수증 관련(식당, 매점, 학비, 책값 등)
영수증 등을 발급해주지 않은 것으로 알고 있다. (중/고등학교) 통장 거래만으로 운영되고 있는 실정으로 알고 있다.
간이 영수증 형태로 학교 자체적으로 발행은 해주고 있는 경우가 있다. 그러나 세금계산서, 계산서 등이 아니라 A4용지에 출력해서 행정실에서
발행을 수기로 해주고 있다.

14. 여성 및 가족에 관한 것
여성 가족부에 문의해보기 바란다. http://www.mogef.go.kr/

 


8. 사업자 부모님 - 자녀 중/고등학생 학비

 

사업자 부모님 밑에서 성장한 아이의 중/고등학생 학비 등을 사용자 인터페이스 관점으로 설계하였다.

 

 

그림 8-1. 사업자 부모님의 자녀 - 도도(Dodo)

 

 

그림 8-2. 사업자 부모님의 자녀 - 도도(Dodo)

 

그림 8-2는 사업자 부모님의 자녀로 크게 될 경우를 가정하고 사용자 인터페이스 설계를 하였다.

 

[공부(Study) - 주안점]

cf-가정1) 
직장인 부모님은 급여를 받지만, 사업자는 거래처에서 거래금이 들어오거나 하루 일 매출이 나와야 급여를 받을 수 있다.

가설 변수)
변수1. 미미하긴 하지만, 매출이 있다는 가정으로 설계하였다.
변수2. 현실세계에서는 매출이 없을 경우도 있을 수 있다.

 

생활법령 > 학원의 설립 및 운영에서 보면, "학원 또는 교습소"라고 표현한다.
http://easylaw.go.kr/CSP/CsmMain.laf?csmSeq=1140

 

가정의 예)

1. 유치원 교육비 등 
http://www.easylaw.go.kr/CSP/CnpClsMainBtr.laf?popMenu=ov&csmSeq=631&ccfNo=2&cciNo=3&cnpClsNo=1 생활법령
http://e-childschoolinfo.moe.go.kr/ 유치원 알리미
http://www.childinfo.go.kr/main.jsp 어린이집 유치원 통합정보공시


2. 병원비, 약제비 등에 관한 정보는 "건강보험심사평가원"에서 살펴볼 수 있다.
http://www.hira.or.kr/main.do

 

3. 중소벤처기업부
중소기업(사업자)와 관련된 업무는 중소벤처기업부에서 담당하고 있다. 

http://www.smba.go.kr/site/smba/main.do#btn_topBarNav 

인력, 금융, 창업, 기술 등의 복합 업무를 관할하고 있다.
폐업과 기업해산과 청산에 관한 문의도 해보면 도움이 될 것으로 보인다.


4. 기획재정부
기획재정부에서는 조금 어려운 용어가 많으니 해석을 하면, "국가의 경제안살림"을 맡고 있다. 재정을 담당한다고 하면 이해가 될지는 모르겠다.
어려운 일들을 수행한다.

http://www.moef.go.kr/

5. 환경부
환경부에서는 육안으로는 잘 안 보이는 일을 수행한다.
"환경오염", "물 상하수도", "자원 순환" 등 많은 일을 수행하고 있다.

http://www.me.go.kr

6. 과학기술정보통신부
주요 업무는 ICT, R&D, 과학기술정책 등의 업무를 담당하고 있다. http://www.msit.go.kr 
-> TV 수신료 등에 관한 것도 관리를 하는 것으로 보인다.

7. 행정 / 지방세에 관한 사항
행정안전부나 관할 지방자치단체에 문의하기 바란다.
http://www.mois.go.kr

8. 국세에 관한 실무에 관한 사항
관할 지방세무서나 국세청을 통해서 문의하기 바란다. 상급기관은 기획재정부이다.
https://www.nts.go.kr/

9. 폐업/기업 해산에 관한 사항
제일 중요한 것이다. 경영을 독학으로 공부하거나, 주경야독 등으로 공부한 사람들도 있을 것으로 보인다.
국세청 홈택스(http://www.hometax.go.kr), 행정자치부 지방세정책과(http://www.mois.go.kr/frt/a07/searchStaff.do?selectedTeamId=1741232&orgnzt_id=1741232&mgrDetailFlag=Y), 법원 등기소(http://www.iros.go.kr) 또는 법원(https://www.scourt.go.kr)에 문의를 해보길 바란다.
실질적으로 폐업을 할 수 밖에 없는 상황에 닦쳤을 때 도와주는 곳에 대해서도 한번 문의를 해보기 바란다.
폐업 세무실무 등에 관해서도 문의해보면 도움이 될 것이다.

10. 금전 거래 등으로 인해 신용이 불량한 상태가 되어버린 경우

신용회복위원회에 문의해보면 많은 도움이 될 것으로 보인다.
https://www.ccrs.or.kr/main.do
실무적으로 많은 기능을 하고 있다.

11. 장애인에 관한 사항

보건복지부를 참고하면 도움이 될 것으로 보인다.

http://www.mohw.go.kr 

12. 농축산 및 동물에 관한 사항
농림축산식품부에서 관할하고 있다.
http://www.mafra.go.kr,


동물 관리시스템 등도 운영하고 있다.
http://www.animal.go.kr

13. 바다에 관한 사항
해양수산부에서 운영하고 있는데, 도도는 바다생태 정보나라 사이트를 추천한다.
http://www.ecosea.go.kr/

14. 여성 및 가족에 관한 것
여성 가족부에 문의해보기 바란다. http://www.mogef.go.kr/

 


9. 통장의 표지(앞면, 뒷면)

 

통장의 표지는 크게 두 종류로 구성될 수 있다.

앞면 표지와 뒷면 표지가 있다.

 

 

그림 9-1. 통장 앞면 / 뒷면 표지 - 도도(Dodo)

 

그림 9-1은 통장의 앞면 표지와 뒷면 표지에 관한 사용자 인터페이스 설계이다.

크게 어렵지 않게 만들 수 있을 것으로 보인다.

 


10. 부록1 - 사용자 인터페이스 총체적인 설계하기

 

사용자 인터페이스를 총체적인 관점으로 설계하는 방법에 대해서 소개하려고 한다.

일반 은행(카드) 시스템이 크게 비슷비슷할 것으로 보인다.

 

 

 

 

 

 

 

 10-1. 사용자 인터페이스 설계 - 도도(Dodo)

 

 10-2. 사용자 인터페이스 설계 - 도도(Dodo)

 

 10-3. 사용자 인터페이스 설계 - 도도(Dodo)

 

 10-4. 사용자 인터페이스 설계 - 도도(Dodo)

 

 10-5. 사용자 인터페이스 설계 - 도도(Dodo)

 

 

 10-6. 사용자 인터페이스 설계 - 도도(Dodo)

 

 

 10-7. 사용자 인터페이스 설계 - 도도(Dodo)

 

 

 10-8. 사용자 인터페이스 설계 - 도도(Dodo)

 

 

 10-9. 사용자 인터페이스 설계 - 도도(Dodo)

 

 

 10-10. 사용자 인터페이스 설계 - 도도(Dodo)

 

 

 

 10-11. 사용자 인터페이스 설계 - 도도(Dodo)

 

 10-12. 사용자 인터페이스 설계 - 도도(Dodo) 

 


11. 부록2 - 첨부(Attachment)

 

번호

파일명(Filename)

세부내용(Description)

작성일자(Create Date)

비고(Remarks)

1

UI-StudentBank.7z

UI-StudentBank.pptx

2018-08-21

 

2

bankDesign1.7z

bankDesign1.ai

2018-08-21

 

3

bankDesign2.7z

bankDesign2.ai

2018-08-21

 

4

bankDesign3-1.7z

bankDesign3-1.ai

2018-08-21

 

5

bankDesign3-2.7z

bankDesign3-2.ai

2018-08-21 

 

6

bankDesign3-3.7z

bankDesign3-3.ai

2018-08-21

 

7

bankDesign4_1.7z

bankDesign4-1.ai

2018-08-21

 

8

bankDesign4_2.zip

bankDesign4-2.ai

2018-08-21

 

9

bankDesign4_3.7z

bankDesign4-3.ai

2018-08-21

 

10

bankTitle.7z

bankTitle.ai

2018-08-21

 

11

bankDesign5-1.7z

bankDesign5-1.ai

2018-08-21

 

12

bankDesign6-1.zip

bankDesign6-1.ai

2018-08-21

 

13

bankDesign6-2.7z

bankDesign6-2.ai

2018-08-21

 

14

bankDesign6-3.zip

bankDesign6-3.ai

2018-08-21

 

15

csv.7z

type1-1.csv

type1-2.csv

type2-1.csv

type2-2.csv

type3.csv

type4.csv

2018-08-21

 

16

180822-select.7z

 180822-select.pptx

2018-08-22

 

17

180822-topBottom.7z

180822-topBottom.pptx

2018-08-22

 

 

 


12. 부록3 - 프로그래밍 설계(Design)

 

코드로 구현했을 경우를 대비하여 몇 가지 프로그래밍으로 설계하였다.

은행 계좌 시스템을 설계하는 데 프로세스를 생성할 것인지 쓰레드 방식으로 처리할 것인지 깊은 고민을 해보면 도움이 될 것이다.

 

개발환경: Eclipse Jee Photon, Mingw G++ Compliler, Microsoft Windows 10

 

그림 12-1. 메뉴 선택 설계하기 - 도도(Dodo)

 

그림 12-1은 메뉴 선택 기능을 설계하는 데 있어서 충분한 고민을 해봐야 할 것이다.

 

 

그림 12-2 프로그래밍 설계하기 / 은행 콘솔 표지 만들기 - 도도(Dodo)

 

그림 12-3 프로그래밍 설계하기 / 통장 내역 출력하기 - 도도(Dodo)

 

그림 12-4 프로그래밍 설계하기 / 은행 통장 내역 출력하기 - 도도(Dodo)

 

그림 12-5 프로그래밍 설계하기 / 은행 통장 내역 출력하기 - 도도(Dodo)

 그림 12-6 프로그래밍 설계하기 / 은행 통장 내역 출력하기 - 도도(Dodo)

 


13. 맺음글(Conclusion)

 

은행 명세서 및 계좌 구현이라는 실험 주제에서 얻을 수 있는 흥미로운 점은 다소 많이 있었다.

기대효과는 모른다. 좀 더 발전된 모습으로 좋은 공부를 수행할 것이다.

 

아무튼 이상으로 글을 마친다.

 


14. 참고자료(Reference)

 

1. Use the thread library,| MinGw, Last Modified 2008-10-27, Accessed by 2018-08-21, http://www.mingw.org/wiki/Use_the_thread_library

2. CreateThread function | Microsoft Docs, Last Modified 2018-08-10, Accessed by 2018-08-21, https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-createthread

3. 전입신고 | 민원안내 및 신청 | 민원24 | 정부24, Last Modified 2017-07-26, Accessed by 2018-08-22, http://www.gov.kr/main?a=AA020InfoCappViewApp&HighCtgCD=A01010&CappBizCD=13100000016&tp_seq=01

4. 인터넷 등기소 , Last Modified , Accessed by 2018-08-22, http://www.iros.go.kr

5. UI for Setting up a Checking account and Savings account for my bank project, Last Modified, Accessed by 2018-08-22, https://stackoverflow.com/questions/34164396/ui-for-setting-up-a-checking-account-and-savings-account-for-my-bank-project

6. 통장 - 위키백과, Last Modified 2018-06-07 09:21, Accessed by 2018-08-22, https://ko.wikipedia.org/wiki/통장

7. 중소기업은행법 | 국가법령정보센터, Last Modified 2017-07-26, Accessed by 2018-08-22, http://www.law.go.kr/법령/중소기업은행법

8. 우체국예금ㆍ보험에 관한 법률 | 국가법령정보센터, Last Modified 2017-07-26, Accessed by 2018-08-22, http://www.law.go.kr/법령/우체국예금ㆍ보험에관한법률

9. "지료(Giro)는" 금융결제원에서 통합납부 시스템을 운영하고 있다.

     지로란 "일상거래에서 발생하는 지급인과 수취인 간의 각종 대금결제를 현금이나 수표로 주고받는 대신에 금융회사의 계좌를 이용하여 결제할 수
     있도록 지로자금의 지급·수취정보 처리센터 역할을 수행하고 있다."

10. 지로업무 | 금융결제원, Last Modified , Accessed by 2018-08-22, http://www.kftc.or.kr/kftc/business/BusinessGiroInfo.do

11. 계좌정보통합관리서비스 | 금융결제원, Last Modified , Accessed by 2018-08-22, https://www.payinfo.or.kr/payinfo.html

     금융결제원에서는 계좌정보통합관리스 서비스를 운영하고 있다고 한다.

12. 학원의 설립ㆍ운영 및 과외교습 | 찾기쉬운 생활법령정보시스템, Last Modified, Accessed by 2018-08-22,  http://easylaw.go.kr/CSP/CsmMain.laf?csmSeq=1140

13. 대학알리미(AcademyInfo), Last Modified , Accessed by 2018-08-22, http://www.academyinfo.go.kr

14. 교육부(Ministry Of Education), Last Modified , Accessed by 2018-08-22, http://www.moe.go.kr/main.do?s=moe

15. 유치원 교육비 :: 영유아교육 | 생활법령정보, http://www.easylaw.go.kr/CSP/CnpClsMainBtr.laf?popMenu=ov&csmSeq=631&ccfNo=2&cciNo=3&cnpClsNo=1

16. 약제비 계산기 | 건강보험심사평가원, Last Modified , Accessed by 2018-08-22, http://www.hira.or.kr/rf/medicine/calculator/form.do?pgmid=HIRAA030037000000

17. 건강보험심사평가원, Last Modified , Accessed by 2018-08-22, http://www.hira.or.kr/main.do

18. 유치원 알리미, Last Modified , Accessed by 2018-08-22, http://e-childschoolinfo.moe.go.kr/#none

19. 어린이집 유치원 통합정보공시, Last Modified, Accessed by 2018-08-22, http://www.childinfo.go.kr/main.jsp

20. 국토교통부 - 교통정보, Last Modified, Accessed by 2018-08-22, http://cyber.molit.go.kr/traffic/main.jsp

21. 내일을 위한 고용노동부, Last Modified, Accessed by 2018-08-22, http://www.moel.go.kr/index.do

22. 중소벤처기업부, Last Modified, Accessed by 2018-08-22, http://www.smba.go.kr/site/smba/main.do#btn_topBarNav

23. 기획재정부, Last Modified, Accessed by 2018-08-22, http://www.moef.go.kr/

24. 환경부, Last Modified, Accessed by 2018-08-22, http://www.me.go.kr/home/web/main.do

25. 과학기술정보통신부, Last Modified, Accessed by 2018-08-22, http://www.msit.go.kr

26. 금융실명거래 및 비밀보장에 관한 법률 | 국가법령정보센터, Last Modified, Accessed by 2018-08-22, http://www.law.go.kr/법령/금융실명거래및비밀보장에관한법률

27. 개인정보보호법 | 국가법령정보센터, Last Modified 2017-07-26, Accessed by 2018-08-22, http://www.law.go.kr/법령/개인정보보호법/(14839,20170726)

28. 의무경찰 | 복무안내, Last Modified , Accessed by 2018-08-23, http://ap.police.go.kr/ap/main.do

29. 의무소방원 - 현역(전환복무) | 병무청, Last Modified, Accessed by 2018-08-23, https://www.mma.go.kr/contents.do?mc=mma0000504&num=3

30. 군인사법 | 국가법령정보센터, Last Modified 2018-01-16, Accessed by 2018-08-23, http://www.law.go.kr/법령/군인사법

31. 은행법 | 국가법령정보센터, Last Modified 2017-01-19, Accessed by 2018-08-23, http://www.law.go.kr/법령/은행법

32. 기술보증기금법 | 국가법령정보센터, Last Modified 2018-06-12, Accessed by 2018-08-23, http://www.law.go.kr/법령/기술보증기금법
33. 한국산업은행법 | 국가법령정보센터, Last Modified 2016-09-30, Accessed by 2018-08-23, http://www.law.go.kr/법령/한국산업은행법

34. 한국주택금융공사법 | 국가법령정보센터, Last Modified 2018-02-21, Accessed by 2018-08-23, http://www.law.go.kr/법령/한국주택금융공사법
35. 행정안전부, Last Modified , Accessed by 2018-08-23, http://www.mois.go.kr

36. 국세청, Last Modified, Accessed by 2018-08-23, https://www.nts.go.kr/

37. 행정안전부 지방세정책과, Last Modified, Accessed by 2018-08-23, http://www.mois.go.kr/frt/a07/searchStaff.do?selectedTeamId=1741232&orgnzt_id=1741232&mgrDetailFlag=Y

38. 근로복지공단, Last Modified, Accessed by 2018-08-23, https://www.kcomwel.or.kr/kcomwel/main.jsp

39. 신용회복위원회, Last Modified, Accessed by 2018-08-23, https://www.ccrs.or.kr/main.do

40. 대한민국 국방부, Last Modified, Accessed by 2018-08-23, http://www.mnd.go.kr

41. 예비군 훈련, Last Modified, Accessed by 2018-08-23, http://www.mnd.go.kr/mbshome/mbs/mnd/subview.jsp?id=mnd_011102030000

42. 국민재난안전포털, Last Modified, Accessed by 2018-08-23, http://m.safekorea.go.kr/idsiSFK/50/menuMap.do?w2xPath=/idsiSFK/wq/sfk/cs/contents/civil_defense/SDIJKM1205.xml

43. 정책 > 장애인 > 장애인정책 | 보건복지부, Last Modified, Accessed by 2018-08-23, http://www.mohw.go.kr/react/policy/index.jsp?PAR_MENU_ID=06&MENU_ID=063701

44. 보건복지부, Last Modified, Accessed by 2018-08-23, http://www.mohw.go.kr

45. 농림축산식품부, Last Modified, Accessed by 2018-08-24, http://www.mafra.go.kr

46. 동물보호관리시스템, Last Modified, Accessed by 2018-08-24, http://www.animal.go.kr/

47. 바다생태 정보나라(해양수산부), Last Modified, Accessed by 2018-08-24, http://www.ecosea.go.kr/

48. 여성가족부, Last Modified, Accessed by 2018-08-28, http://www.mogef.go.kr/

 


* 제1저자(Author) 도도는 http://yyman.tistory.com 운영자이다. 샵인클루드와 미개닉 등 샵인클루드족이다.

                                   - 제1저자 도도는 풍부한 실험을 하기 위해서 매우 안락한 상태에서 공부를 진행하였다.

 

* 교신저자(Corresponding author || Contact author)는 해당 없음. (N/A - Not Applicable)

* 도도(Dodo)는 http://yyman.tistory.com의 Editor(에디터)이다.

반응형
728x90
300x250

[네트워크(Networks)] C#, C++, Java에서의 소켓 프로그래밍

이번에 소개할 것은 C#, C++, Java에서 소켓 프로그래밍을 사용하는 방법에 대해서 소개한다.


1. 소스코드

C#에서의 소켓 프로그래밍 작성 예시이다.
IPv4 환경에서 확인함.

운영체제: Microsoft Windows 10
소프트웨어: Visual Studio Community 2015

 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace Example
{
    class ServerSide
    {
        public string data = null;

        public void listenSocket()
        {
            byte[] buf;
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 8088);

            server.Bind(ipEndPoint);
            server.Listen(10);

            System.Console.WriteLine("연결 요청(Connection Request)");

            // 클라이언트 연결 받음.
            Socket client = server.Accept();

            // 클라이언트의 데이터 - 보내기 / 받기
            buf = new byte[1024];
            client.Receive(buf);

            System.Console.WriteLine(Encoding.Default.GetString(buf));

        }
    }

    class ClientSide
    {
        public void listenSocket()
        {
            //IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
            //IPAddress ipAddress = ipHostInfo.AddressList[0];
            // IPEndPoint ipep = new IPEndPoint(ipAddress, 8088);

            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8088);
            String buf;
            Byte[] data;
           
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            client.Connect(ipep);

            Console.WriteLine("소켓 연결(Socket connect)");

            // 데이터 자료 바이트 형으로 받아오기
            data = new byte[1024];
            client.Receive(data);

            // 형 변환 -> getString() 형으로 인코딩
            buf = Encoding.Default.GetString(data);

            Console.WriteLine(buf);

            buf = "소켓 접속 확인 됐습니다.";
            data = Encoding.Default.GetBytes(buf);

            client.Send(data);
            client.Close();

            Console.WriteLine("아무 키나 눌러주세요.");
            Console.ReadLine();

        }
    }
}
 

 NetworkSide.cs

 

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

 namespace Example
 {
       class Program
       {
               static void Main(string[] args)
               {
                       ServerSide serverside = new ServerSide() ;
                       serverside.listenSocket();
               }
       }
 } 

Program.cs

[첨부(Attachment)]
network_csharp.7z


2. (Gpp)C++에서의 소켓 프로그래밍 작성 예시입니다. (리눅스에서만 가능)

C언어로 구현된 소켓 프로그래밍을 C++에서도 지원이 가능한 형태로 제작하였다.
IPv4 기반에 맞춰 작성함.

 

 

 

운영체제: 우분투(Ubuntu 16.04)
소프트웨어: Gpp, Gcc

 

 

/*
 *   Network.h
 */

 #include <iostream>
 #include <unistd.h>
 #include <netinet/in.h>
 #include <sys/socket.h>
 #include <sys/types.h>
 #include <arpa/inet.h>

 using namespace std;

 #ifndef SERVER_H_
 #define SERVER_H_

 // 0.
 class INetwork{
       virtual void listenSingleSocket() = 0;
 };

 // 1. 서버사이드(Server-Side)
 class Server : public INetwork{

 protected:

 private:
     int welcomeSocket, newSocket;

 public:
     Server(){
            this->welcomeSocket = 0;
            this->newSocket = 0;
     }

     void listenSingleSocket(){

           char buffer[1024];
           struct sockaddr_in serverAddr;
           struct sockaddr_storage serverStorage;
           socklen_t addr_size;

           welcomeSocket = socket(PF_INET, SOCK_STREAM, 0);

           serverAddr.sin_family = AF_INET;
           serverAddr.sin_port = htons(8000);
           serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

           int i = 0;

           while(i < sizeof(serverAddr.sin_zero) ){
                 serverAddr.sin_zero[i] = '\0';
                 i++;
           }

           bind(welcomeSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr) );

           if ( listen(welcomeSocket, 5) == 0 ){
                  cout << "Listening\n";
           }
           else
          {
                 cout << "Error\n";
          }

           addr_size = sizeof(serverStorage);
           newSocket = accept(welcomeSocket, (struct sockaddr *) &serverStorage, &addr_size);

           buffer[0] = 'H';
           buffer[1] = 'e';
           buffer[2] = 'l';
           buffer[3] = 'l';
           buffer[4] = 'o';

           send(newSocket, buffer, 13, 0);

     }

 };

 class Client : public INetwork{

 private:
         int clientSocket;
         char buffer[1024];
         struct sockaddr_in serverAddr;
         socklen_t addr_size;

 public:
         Client(){
               this->clientSocket = 0;
         }

         void listenSingleSocket(){

              clientSocket = socket(PF_INET, SOCK_STREAM, 0);

               serverAddr.sin_family = AF_INET;
               serverAddr.sin_port = htons(8000);

               serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

               int i = 0;
               while (i < sizeof(serverAddr.sin_zero)){
                      serverAddr.sin_zero[i] = '\0';
                       i++;
               }

                addr_size = sizeof(serverAddr);

                connect(clientSocket, (struct sockaddr *) &serverAddr, addr_size);

                // 문자열 전달 받음 - (unsigned) char[1024]
                recv(clientSocket, buffer, 1024, 0);
                cout << "데이터 전송 받은 문자:" << buffer << endl;
          }

};

#endif /* SERVER_H_ */

 Network.h

 #include <iostream>
 #include "Network.h"

 using namespace std;

 int main() {
        /*
        Server *server = new Server();
        server->listenSingleSocket();
        */

       Client *client = new Client();
       client->listenSingleSocket();
       return 0;
 }

 Program.cpp

[첨부(Attachment)]
Network-gpp.zip


3. 자바에서의 소켓 프로그래밍

싱글 쓰레드 타입으로 작성함. IPv4 환경에서 확인하였다.
IPv6는 확인하지 못함.

 

 

 

운영체제: Microsoft Windows 10 
소프트웨어: Eclipse Luna, JDK 1.81

 

 
 package Network;

 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.net.Socket;
 import java.net.UnknownHostException;

 public class ClientSide implements IHost{
 
        private Socket socket;
        private Host host;
 
        public ClientSide(){
            socket = null;
            host = null;
        }
 
        public Host getHost(){
            return host;
        }
 
        public void setHost(Host host){
            this.host = host;
        }
 
        public void listenSocket(){
  
            InputStream in = null;
            OutputStream out = null;
  
            BufferedReader br = null;
            BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter pw = null;
  
            String myMsg = null;  // 전달 메시지
            String echo = null;  // 받은 메시지
  
            try{
                 socket = new Socket( host.getIP() , host.getPort() );
    
                 in = socket.getInputStream();
                 out = socket.getOutputStream();
   
                 pw = new PrintWriter(new OutputStreamWriter(out));
                 br = new BufferedReader(new InputStreamReader(in));
   
                while((myMsg = input.readLine()) != null){
    
                      if ( myMsg.equals("/q")){
                            break;
                      }
    
                      pw.println(myMsg);
                      pw.flush();
    
                      echo = br.readLine();
                      System.out.println( "서버사이드 받은 메시지:" + echo );
     
                }
   
                pw.close();
                br.close();
                socket.close();
   
        }
        catch(UnknownHostException e){
                System.out.println("미확인 호스트: " + host.getIP() + ":" + host.getPort() );
                System.exit(-1);
        }
        catch(IOException e){
                System.out.println("입출력 안됨.");
                System.exit(1);
        }

    }
 
}

 ClientSide.java

 
 package Network;

 interface IHost{
        void setHost(Host host);
        Host getHost();
 }

 public class Host{
 
        private String ip;
        private int port;
 
        public Host(int port){
              ip = "";
              this.port = port;
        }
 
        public Host(String ip, int port){
                this.ip = ip;
                this.port = port;
        }
 
        public String getIP(){
                return this.ip;
        }
 
        public int getPort(){
                return this.port;
        }
 
 }

 Host.java

 
 package Network;

 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.net.ServerSocket;
 import java.net.Socket;

class ClientWorker implements Runnable{

         private int id;
         private Socket client;
         private String line;
 
         public ClientWorker(Socket client, int id){

              this.client = client;
              this.id = id;
         }
 
         public void run() {
  
             InputStream in = null;
             OutputStream out = null;
  
             PrintWriter pw = null;
             BufferedReader br = null;
  
             String recvStr = "";

             try{
                 in = client.getInputStream();
                 out = client.getOutputStream();
   
                 pw = new PrintWriter(new OutputStreamWriter(out));
                 br = new BufferedReader(new InputStreamReader(in));
   
             }catch(IOException e){
                 System.out.println("읽기 실패(Read Failed)");
                 System.exit(-1);
             }

             try {
   
                  while( (recvStr = br.readLine() ) != null ){
    
                        appendText(recvStr);
                        System.out.print( "쓰레드(Thread)" + id + ":" );
                        System.out.println(line);
                        pw.println(recvStr);
                        pw.flush();
                  }
   
                  client.close();
   
             } catch (IOException e) {
                   System.out.println("읽기 실패(Read Failed");
                   System.exit(-1);
             }
  
       }
 
        // 동기화 추가
        public synchronized void appendText(String strText){
  
              if ( line == null )
              {
                   line = strText;
              }
              else{
                   line = line + strText;
              }
        }
 
 }

 public class ServerSide implements IHost{

         private ServerSocket server;
         private Socket client;
         private Host host;
         private static int clientID;
 
         public ServerSide(){
                server = null;
                client = null;
                host = null;
                clientID = 0;
         }
 
         public Host getHost(){
                return host;
          }
 
          public void setHost(Host host) {
                 this.host = host;
          }
 
          // 싱글(Single)
          public void listenSingleSocket(){

                String line;
   
                InputStream in = null;
                OutputStream out = null;
  
                PrintWriter pw = null;
                BufferedReader br = null;
  
                String recvStr = null;
  
                try{   
                      server = new ServerSocket( host.getPort() ); 
                }
                catch(IOException e){
                      System.out.println("포트 " + host.getPort() + "번은 응답하지 않습니다.");
                      System.exit(-1);
                }
  
                try{
                      client = server.accept();
                }
                catch(IOException e){
                      System.out.println("응답 실패: 포트 " + host.getPort() + "번");
                      System.exit(-1);
                }
  
                try{
                      in = client.getInputStream();
                      out = client.getOutputStream();
   
                      pw = new PrintWriter(new OutputStreamWriter(out));
                      br = new BufferedReader(new InputStreamReader(in));
   
                }catch(IOException e){
                      System.out.println("읽기 실패(Read Failed)");
                      System.exit(-1);
                }

                try {
   
                     while( (recvStr = br.readLine() ) != null ){
     
                            System.out.print( "싱글" );
                            pw.println(recvStr);
                            pw.flush();
                    }
   
                   client.close();
                   server.close();
   
              } catch (IOException e) {
                     System.out.println("읽기 실패(Read Failed");
                     System.exit(-1);
              }
  
         }

        // 멀티(Multi-Threading)
        public void listenMutliSocket(){
   
              ClientWorker w = null;

              try{
                  server = new ServerSocket( host.getPort() ); 
              }
              catch(IOException e){
                  System.out.println("포트 " + host.getPort() + "번은 응답하지 않습니다.");
                  System.exit(-1);
              }
  
              try{
                   while(true){
   
                        w = new ClientWorker( server.accept(), clientID++ );
  
                        Thread t = new Thread(w);
                        t.start();
                   }
   
             }
             catch(IOException e){
                  System.out.println("응답 실패: 포트 " + host.getPort() + "번");
                  System.exit(-1);
             }
  
       }
  
       protected void finalize(){
  
             try{
                  server.close();
             }catch(IOException e){
                  System.out.println("소켓을 종료할 수 없습니다.");
                  System.exit(-1);
             }
  
       }

 }

 ServerSide.java

 package Network;

 public class Example{
 
        public static void main(String[] args){
  
             ServerSide server = new ServerSide();
             Host host = new Host(10001);
             server.setHost(host);
             server.listenMutliSocket();
        }
 }

 Example.java

[예제 - 첨부(Attachment)]
Network.zip


4. IPv4와 IPv6

 

네트워크와 관련된 주제로 IPv4와 IPv6에 대해서 소개한다.

 4-1. IPv4 

 IPv4는 인터넷 프로토콜의 4번째 판이며, 전 세계적으로 사용된 첫 번째 인터넷 프로토콜이다.

 과거에 인터넷에서 사용되는 유일한 프로토콜이였으나 오늘날에는 IPv6이 대중화되었다. IETF RFC 791(1981년 9월)에 기술되어 있다.

 IPv4는 패킷 교환 네트워크 상에서 데이터를 교환하기 위한 프로토콜이다. 데이터가 정확하게 전달될 것을 보장하지 않고,
 중복된 패킷을 전달하거나  패킷의 순서를 잘못 전달할 가능성도 있다. 데이터의 정확하고 순차적인 전달은 그보다 상위 프로토콜인
 TCP에서(그리고 UDP에서도 일부) 보장한다.

 IPv4의 주소체계는 총 12자리이며 네 부분으로 나뉜다. 각 부분은 0~255까지 3자리의 수로 표현된다. IPv4 주소는 32비트로 구성되어 있으며,
 현재 인터넷 사용자의 증가로 인해 주소공간의 고갈에 대한 우려가 높아지고 있다. 이에 따라 대안으로 128비트 주소체계를 갖는 IPv6가 등장하였다.

 중국의 경우 주소공간 고갈을 우려하여 일부에서 독자적으로 IPv9(십진제 인터넷 주소체계)과 숫자도메인(Digital Domain Name System, DDNS)이
 결합된 개념인 IP 주소와 도메인 이름이 동일한 네트워크 체제인 All-Digital-Domain-Address (ADDA)를 사용하기도 한다.

 2011년 2월 4일부터 모든 IPv4 주소가 소진되어 IPv4의 할당이 중지되었다.

 

CLASS 구성 범위
A 클래스 xxx.xxx.xxx.xxx 1.0.0.1 ~ 126.255.255.254 61.211.123.22
B 클래스 xxx.xxx.xxx.xxx 128.0.0.1 ~ 191.255.255.254 181.123.211.33
C 클래스 xxx.xxx.xxx.xxx 192.0.0.1 ~ 223.255.255.254 221.23.222.222
D 클래스 224.0.0.0 ~ 239.255.255.255
E 클래스 240.0.0.0 ~ 254.255.255.254

 그림 4-1-1. 쿼드 점으로 구분 된 IPv4 주소 표현을 이진 값으로 분해.

 이건 조금 해결할 수는 있을 듯하다. 다만 이것도 계산이 더럽다고 볼 수 있다.
 아래는 172에 대해서 해결한 것이다.

10 |  10  |  110  | 0  

  10 = | Flag |
  128번 = 000000
  129번 = 000001

   .........
  172번 = 101100

 

 4-2. IPv6

 인터넷 프로토콜 버전 6 (IPv6)은 네트워크상의 컴퓨터에 대한 식별 및 위치 시스템을 제공하고 인터넷을 통해 트래픽을 라우팅하는
 통신 프로토콜 인 IP (인터넷 프로토콜)의 최신 버전이다.

 
IPv6는 오랫동안 예상되었던 IPv4 주소 고갈 문제를 해결하기 위해 IETF (Internet Engineering Task Force)에서 개발되었다.
 
IPv6은 IPv4를 대체하기 위한 것이다. IPv6는 1998 년 12 월에 초안 표준이되었고, 2017 년 7 월 14 일에 인터넷 표준이 되었다.

 인터넷상의 모든 장치에는 식별 및 위치 정의를 위해 고유 한 IP 주소가 할당된다.
 
1990 년대의 상용화 이후 인터넷의 급속한 성장으로 인해 IPv4 주소 공간보다 장치를 연결하는 데 훨씬 많은 주소가 필요할 것이다.

 
1998 년까지 IETF (Internet Engineering Task Force)는 후임 프로토콜을 공식화했다.
 
IPv6은 128 비트 주소를 사용하며 이론적으로 2128 개 또는 약 3.4 × 1038 개 주소를 허용한다.

 
여러 개의 범위가 특수 용도로 예약되었거나 완전히 사용되지 않도록 실제 숫자가 약간 더 작다.
 
가능한 IPv6 주소의 총 수는 32 비트 주소를 사용하고 약 43 억 개의 주소를 제공하는 IPv4의 7.9 × 1024 배이다.
 
 
이 두 프로토콜은 상호 운용성을 위해 설계되지 않았기 때문에 IPv6 로의 전환이 복잡해졌다.
 
그러나 IPv4와 IPv6 호스트 간의 통신을 허용하기 위해 몇 가지 IPv6 전환 메커니즘이 고안되었다.

 IPv6은 더 큰 주소 지정 공간 외에도 다른 기술적 이점을 제공한다.
 
특히 인터넷을 통한 경로 집계를 용이하게 하는 계층적 주소 할당 방법을 허용하므로 라우팅 테이블의 확장을 제한한다.
 
멀티 캐스트 주소 사용은 확장되고 단순화되며 서비스 제공을위한 추가 최적화를 제공한다.

 장치의 이동성, 보안 및 구성 측면이 프로토콜 설계시 고려되었다.

 IPv6 주소는 그룹이 콜론으로 구분 된 네 개의 16 진수 8 개의 그룹으로 표시된다.
 (예: 2001:0db8:0000:0042:0000:8a2e:0370:7334).이 전체 표기법을 줄이는 방법이 있다.

 

그림 4-2-1. IPv6 주소 표현을 이진 형식으로 분해

 IPv6를 사람 손으로 푼다고 하면, 매우 많은 노가다가 필요하다.
 각 옥탯에 있는 16진수를 일일이 하나 하나씩 해결해야 한다.

4-3. IPv6의 패킷헤더

 



그림 4-3-1. IPv6의 패킷해더

 IPv6의 패킷해더이다. IPv6로 데이터를 송수신하면 이런 형태로 전송이 되는 것을 관찰할 수 있다.
 리눅스에 패킷 분석 툴킷이 있는데 한번 패킷해더를 추적해봐도 좋을 것이다. 

 이 패킷해더를 관찰하는 대표적인 툴킷(Tool-kits)으로 WireShark가 있다.

  
 그림 4-3-2. WireShark 시연 예

 [IPv4 to IPv6에 관한 이야기]

 IPv6를 실제로 사용하려면 많은 조건이 필요하다.
 IPv4에서 IPv6로 변환해줄 수 있는 변환장치 등이 필요하다.
 터널링도 하나의 기법이 될 수 있다.


5. 참고자료(Reference)

 

1. IPv4, Wikipedia, https://ko.wikipedia.org/wiki/IPv4, Accessed by 2018-07-27
2. IPv6, Wikipeida, https://en.wikipedia.org/wiki/IPv6, Accessed by 2018-07-27
3. IPv6 OSPFv3 ESP Packets and Decrypting with Wireshark, https://packetpushers.net/ipv6-ospfv3-esp-packets-and-decrypting-with-wireshark/, Accessed by 2018-07-27

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 쉬어가는 코너 (읽는 방법의 여러 종류)

 

이 방법은 이런 방법들이 있구나 이 정도로 읽어가시면 됩니다.

종류가 다양하는 사실만 아셔도 여러분에게 많은 도움이 되실겁니다.

 


1. MFC 방법

 

<대용량 파일 읽기(빠르게)> 
-> 파일 읽기는 자주 사용하는 명령 중 하나입니다.

참고로 CFile::Read를 사용하면 10MB정도 되는 파일을 읽으면 오래 걸립니다.

 

-> 메모리 맵 파일을 이용한 파일 읽기 방법을 소개하겠습니다.

 

BOOL OpenFiles(LPCSTR lpsz PathName)

  DWORD dwFileSize; 
  HANDLE hFile, hFileMap; 
  LPVOID lpvFile;
 
  hFile = ::CreateFile( lpszPathName, GENERIC_READ , 0, NULL
    OPEN_EXISTING, FILE_ATTRIBUTTE_NORMAL, NULL );
 
  if( hFile == INVALID_HANDLE_VALUE )
  {
    // 여기에서 에러 메세지 처리..
  }
 
  dwFileSize = ::GetFileSize(hFile, NULL);
 
  hFileMap = CreateFileMapping( hFile, NULL, PAGE_WRITECOPY, 0,
    dwFileSize, NULL );
 
  if( hFileMap == NULL )
  {
    CloseHandle(hFile);
    //여기에서 에러 메세지 처리..
  }
 
  lpFile = MapViewOfFile( hFileMap, FILE_MAP_COPY, 0, 0, 0 );
 
  if( lpFile == NULL )
  {
    CloseHandle( hFile );
    CloseHandle( hFileMap );
    //여기에서 에러 처리
  }
}


 


필요하신 분은 복사하셔서 사용하시면 됩니다.

 


2. C언어 방법

메모리 맵파일을 이용한 방법 외에 다른 방법 하나 소개합니다.

도스용 시절에 사용했던 fread함수를 사용한 것입니다.

물론 fread대신 다른 파일 읽기 함수를 사용해도 됩니다.

다만 사용자 편의를 위해서 추가로 만들어진 파일함수들은(파일함수뿐만 아니라 다른 것들도 마찬가지임.) 사용하긴 편하겠지만,

속도가 무척 느린 문제가 있습니다.


 

char *ReadFile( char *FileName )

  FILE *fp; 
  int FileSize; 
  char *buffer; 
  
  try
  {
      fp = fopen( FileName, "rb" );
      if( !fp ) throw "File Not Found!";
   
      FileSize = filelength( fileno(fp) );
      buffer = new char [FileSize+1]; 

      fread( buffer, FileSize, 1, fp );
      *(buffer + FileSize) = 0;
      fclose( fp );
      return buffer;
  } 
  catch( char *msg )
  {
      printf( msg );
      return NULL;
  }
}

 

이 두 가지 방법이 있는데, 구현할 때 잘 활용하면 좋을 거 같습니다.

 


3. 참고자료(Reference)

 

1. http://npteam.net/440, 접속일자 2015-03-27

반응형
728x90
300x250
[MFC] 윈도우 프로그래밍 기초 - 스크롤바(Scroll Bar) 제어

 

Visual Basic이나 다른 언어에서도 스크롤바 제어 기능이 있는데 MFC의 스크롤바 제어기능은 정말 강력합니다.

 

 

이 기능을 다 제어할 수 있습니다.

참으로 잠재력이 있는 친구입니다.

 

위의 그림의 기능을 하나 하나 다 구현할 수 있습니다.

 

우리는 이번 실습에서 스크롤바를 구현해보도록 하겠습니다.

 


1. 결과물

 

 

 


2. 실습

 

2-1. 레이아웃 설계

 

 

 

Control ID

 Caption

범주(T)

 맴버 변수(N)

 이벤트 처리기

 참고사항

 IDC_STATIC

 너의 몸무게

 

 

 

 

 IDC_STATIC

 너의 애인수

 

 

 

 

 IDC_STATIC

 사람갯수

 

 

 

 

 IDC_STATIC

 키

 

 

 

 

 IDC_BUTTON1

 확인해보기

 

 

 OnBnClickedButton1

 

 IDC_SIZEBAR

 해당없음

 VALUE

 m_size

 

스크롤 범위

 최소값 0

 최대값 255

 해당없음 

 CONTROL

 m_ScrollSize

 

 

 IDC_HONEYBAR

 해당없음

 VALUE

 m_honey

 

스크롤 범위

 최소값 0

 최대값 255 

 해당없음

 CONTROL

 m_ScrollHoney

 

 

 IDC_PEOPLEBAR 

 해당없음

 VALUE

 m_people

 

스크롤 범위

최소값 0

 최대값 255

 해당없음

 CONTROL

 m_ScrollPeople

 

 

 IDC_HEIGHTBAR

 해당없음

 VALUE

 m_height

 

스크롤 범위

 최소값 0

 최대값 255

 해당없음

 CONTROL

 m_ScrollHeight

 

 

 

CExampleDlg 클래스 뷰에서 WM_HSCROLL과 WM_VSCROLL을 OnAdd OnHScroll 추가를 클릭해서 아래의 그림처럼 만들어줍니다. 

 

 

 

 

 


2-2. 코드 구현

 


BOOL CExampleDlg::OnInitDialog()

{

       // 중략

 
        // TODO: 여기에 추가 초기화 작업을 추가합니다.
         m_ScrollSize.SetScrollRange(0, 255);
         m_ScrollHoney.SetScrollRange(0, 255);
         m_ScrollPeople.SetScrollRange(0, 255);
         m_ScrollHeight.SetScrollRange(0, 255);

        

         return TRUE;

}

(사용자 프로젝트명)Dlg.cpp -> BOOL CExampleDlg::OnInitDialog() - 스크롤 범위 지정

 

 

 

 


// CExampleDlg 대화 상자
class CExampleDlg : public CDialogEx

{

      // 중략

 

public:

      // 중략
       void CommonScroll(UINT nSBCode, UINT nPos, CScrollBar& pScrollBar);

      // 중략

}

 (사용자 프로젝트명).h에 함수 원형 만들어보기

 

사실은 이 함수 만든 이유가 OnHScroll ( ), OnVScroll ( )에 두번 구현하기 귀찮아서 함수 만든겁니다.

 


void CExampleDlg::CommonScroll(UINT nSBCode, UINT nPos, CScrollBar& pScrollBar){

 

  switch (nSBCode)
  {

 


             case SB_LINEUP:
                    pScrollBar.SetScrollPos(pScrollBar.GetScrollPos() - 1);
                    break;

 

             case SB_LINEDOWN:
                    pScrollBar.SetScrollPos(pScrollBar.GetScrollPos() + 1);
                    break;

 

             case SB_PAGEUP:
                    pScrollBar.SetScrollPos(pScrollBar.GetScrollPos() - 2);
                    break;

 

             case SB_PAGEDOWN:
                    pScrollBar.SetScrollPos(pScrollBar.GetScrollPos() + 2);
                    break;

 

             case SB_TOP:
                    pScrollBar.SetScrollPos(0);
                    break;

 

             case SB_BOTTOM: // Scroll - 아래 사진 참조
                    pScrollBar.SetScrollPos(pScrollBar.GetScrollLimit());
                    break;

 

             case SB_THUMBTRACK: // Scroll - Dragging
                    pScrollBar.SetScrollPos(nPos);
                    break;

 

             default:
                    break;
        }

 

 

* eg) Bottom (나머지 영역도 다 여기에 해당되는 조작을 의미함.)

 

 

 

 

 


}
{
       // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

       CommonScroll(nSBCode, nPos, *pScrollBar);

       UpdateData(TRUE);

       CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);

       UpdateData(FALSE);

 (사용자 프로젝트명)Dlg.cpp - OnVScroll ( ) 함수 코딩

 
void CExampleDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
        // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

        CommonScroll(nSBCode, nPos, *pScrollBar);
 
        UpdateData(TRUE);

        CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);

        UpdateData(FALSE);

}

 (사용자 프로젝트명)Dlg.cpp - OnHScroll ( ) 함수 코딩

 

 

 
void CExampleDlg::OnBnClickedButton1()
{
       CString strPeople, strHoney, strHeight, strSize;
       CString strResult;

 

       strPeople.Format(_T("사람의 수:%d\n"), m_people);
       strHoney.Format(_T("애인의 수:%d\n"), m_honey);
       strHeight.Format(_T("나의 키:%d\n"), m_height);
       strSize.Format(_T("나의 몸무게:%d\n"), m_size);

 

       strResult.Append(strPeople);
       strResult.Append(strHoney);
       strResult.Append(strHeight);
       strResult.Append(strSize);

 

       AfxMessageBox(strResult);

}

  (사용자 프로젝트명)Dlg.cpp - OnBnClickedButton1 ( ) 함수 코딩

 

 


3. 이론

 

a. 스크롤바 컨트롤 멤버 함수

CScrollBar 클래스를 사용함.

 

함수 

설명 

 int GetScrollPos()

 스크롤바의 현재 위치 값을 획득하기 위해서 사용

 int SetScrollPos(int nPos, BOOL bRedraw)

 스크롤바의 위치를 설정하기 위해 사용

 void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos)

 스크롤바의 범위(min, max)를 획득하기 위해 사용

 void SetScrollRange(int nMinPos, int nMaxPos)

 스크롤바의 범위(min, max)를 설정하기 위해 사용

 void ShowScrollBar(BOOL bShow = TRUE)

 스크롤바를 화면에 보이게 하거나 감추기 위해서 사용

 -> TRUE, FALSE

 BOOL EnableScrollBar(UINT nArrowFlags = ESB_ENABLE_BOTH)

 스크롤바의 양쪽 화살표 사용 여부

 -> TRUE, FALSE

 BOOL SetScrollInfo(LPSCROLLINFO lpScrollInfo, BOOL bRedraw)

 SCROLL_INFO 구조체를 사용하여 스크롤바의 범위와 위치를

 지정하기 위해 사용

 BOOL GetScrollInfo(LPSCROLLINFO lpScrollInfo, UINT nMask);

 SCROLL INFO 구조체 형태의 데이터를 매개변수로 전달하여

 스크롤바의 범위와 위치를 획득함.

 int GetScrollLimit ( )

 스크롤바의 이동 한계 값을 획득하기 위해서 사용.

 

b. 스크롤바 컨트롤 멤버 함수

 

 afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
 afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); 

nSBCode:스크롤바의 동작 코드

nPos: 스크롤바가 이동된 위치 값

pScrollBar : 메시지가 발생된 스크롤 바의 포인터 

 

반응형
728x90
300x250
[MFC] 윈도우 프로그래밍 기초 - 리스트박스 컨트롤(Listbox Control)

 

짬좀 차신 여러분 지금까지 오신 걸 환영합니다.

여러분들은 다양한 컨트롤들을 체험해보시고 계십니다.?

 

 

먼저

결과물을 확인해보겠습니다.

 


1. 결과물

 

 


2. 레이아웃 설계

 

 

알아서 디자인 하시는 거 알죠??

 

 컨트롤 ID

 CAPTION

 범주(T)

 맴버 변수(N)

 이벤트 처리기

 IDC_STATIC

 계급

 X

 X

 X

 IDC_STATIC

 이름

 X

 X

 X

 IDC_LIST1

 

 Control

 m_ListLevel

 X

 IDC_LIST2

 

 Control

 m_ListName

 X

 IDC_BUTTON1

 조회

 X

 X

 OnBnClickedButton1

 IDC_BUTTON2

 이름 선택 삭제

 X

 X

 OnBnClickedButton2 

 


3. 코드 작성

 

 // CExampleDlg 메시지 처리기

BOOL CExampleDlg::OnInitDialog()
{

            // 중략

            // TODO: 여기에 추가 초기화 작업을 추가합니다.
            m_ListLevel.InsertString(0, _T("이병"));
            m_ListLevel.InsertString(1, _T("일병"));
            m_ListLevel.InsertString(2, _T("상병"));
            m_ListLevel.InsertString(3, _T("병장"));

            

            m_ListName.InsertString(0, _T("도도1"));
            m_ListName.InsertString(1, _T("도도2"));
            m_ListName.InsertString(2, _T("도도3"));
            m_ListName.InsertString(3, _T("도도4"));

 

               return TRUE;

}

 (사용자 프로젝트명)Dlg.cpp - OnInitDialog() 함수 내 입력

 

 



{
        CString strTmp, strMsg;
        int levelidx = m_ListLevel.GetCurSel();
        int nameidx = m_ListName.GetCurSel();

 

        // 계급장
        if (levelidx != -1 && nameidx != -1)
       {
              m_ListLevel.GetText(levelidx, strTmp);

              strMsg.Append(strTmp + " "); // 1. strMsg에 m_ListLevel의 값 = 입력 추가

              m_ListName.GetText(nameidx, strTmp);

              strMsg.Append(strTmp);   // 2. strMsg에 m_ListName의 값 = 입력 추가

              AfxMessageBox(strMsg);   // 3. 출력

         }
         else
              AfxMessageBox(_T("선택 후 사용해라. 좋은 말할때"));


}


void CExampleDlg::OnBnClickedButton2()
{
         CString strMsg;
         int idx;

         idx = m_ListName.GetCurSel();

 

         if (idx == -1)
        {
               strMsg.Format(_T("idx:%d, 선택 후 사용하세요."), idx);
               AfxMessageBox(strMsg);
         }
         else
               m_ListName.DeleteString(idx);

 

}
 

 ExampleDlg.cpp -> 버튼 이벤트 처리
 -> OnBnClickedButton1(  ), OnBnClickedButton2(  )

 


4. 몇 가지 ListBox 소개

 

ListBox에서 컨트롤 맴버 함수에 대해 소개하겠습니다.

리스트박스 컨트롤은 CListBox 클래스를 사용하며, CListBox 클래스는 다음과 같은 멤버 함수들을 가지고 있습니다.

 

afxwin에 위치함.

함수 원형 

설명 

 int AddString(LPCTSTR lpszItem)

 리스트 박스의 문자열 항목을 추가할 때 사용함. (순서 상관없이)

 int InsertString(int nIndex, LPCTSTR lpszItem)

 리스트 박스의 문자열 항목 추가에 사용함. (특정 위치, 순서 있음.)

 int DeleteString(UINT nIndex)

 특정 위치의 항목을 삭제함.

 void ResetContent( )

 리스트 박스의 내용 초기화

 int GetCurSel( )

 리스트 박스 내 현재 선택한 값의 인덱스 값 반환

 int SetCurSel( int nSelect )

 특정 아이템을 선택함.

 -> 원하는 인덱스에 커서를 위치시키고 싶을 때

 void GetText(int nIndex, CString & rString)

 int GetText(_In_ int nIndex, _Pre_notnull_ _Post_z_ LPTSTR lpszBuffer) const;
 void GetText(int nIndex, CString& rString) const;
 int GetTextLen(int nIndex) const;

 특정 인덱스에 위치한 문자열을 획득

 ex) CString aaa;라고 선언

 

 m_List1.GetText( 0, aaa); 라고 하면

 가져올 수 있음.

 

 int GetTextLen(int nIndex) const;

 특정 인덱스의 문자열 길이를 반환

 

 콤보박스(ComboBox)는 사용법이 거의 같으므로 생략합니다.

 

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - Edit Control(에디트 컨트롤) - 택스트상자

 

이번에 만들 건 Edit Control입니다.

여러분은 아마 지금쯤이면 어느 정도 짬좀 찼을 거 같습니다.

 

 

이번에 만들 건 텍스트 상자라고도 볼 수 있는 Edit Control 입니다.

 

 

이렇게 생긴거 하나 만들어 보겠습니다.

 


1. 결과물

 

 

(레이아웃)

 

 

말 안해도 자동으로 레이아웃 그리고 계셔야 합니다.

 

짬 찼으니깐요.

자동으로 못 그리면, 다시 이전 강의로 돌아가세요. 제발~(Please)

 

컨트롤 ID

Caption

범주(T)

변수 이름(N)

최대 문자 수

이벤트 처리기이름 

ReadOnly

IDC_STATIC

입력

 

 

 

 

 

IDC_STATIC

출력

 

 

 

 

 

IDC_EDIT1

 

Value

m_strName

5

 

 

IDC_EDIT2

 

Value

m_printName

5

 

 True

IDC_BUTTON1

입력해보기

 

 

 

OnBnClickedButton

 

 


2. 소스 코드 작성

  
void CExampleDlg::OnBnClickedButton1()
{
      UpdateData(TRUE);
      m_printName = m_strName;
       UpdateData(FALSE);
}

 

코드 내용 - 이벤트 버튼에 관한 코드 

 


3. 설명 - UpdateData에 대해서

 

Visual Basic이나 다른 프로그래밍 언어에선 UpdateData() 이딴거 안써도 솔직히 바로 바뀝니다.

MFC는 불편합니다.

 

실시간 변화를 할 수 없기에 인위적으로 변화를 하도록 제어하고 있습니다.

깊은 의미는 동시접근을 임의로 하지 못하도록 마치 신호등처럼 제어하고 있습니다.

 

 

 

 

운영체제론이라는 책에서 배울 수 있습니다.

교착상태를 예방하기 위해 이러한 원리를 적용한 것입니다.

 

정확한 의미는 우리하고 관련없으므로 생략합니다.

 

 


UpdateData의 함수 원형은 아래와 같습니다.

 

BOOL UpdateData(BOOL bSaveAndValidate = TRUE);

 

-> bSaveAndValidate의 상태는

BOOL 형태이니깐

 

TRUE

 

OR

 

FALSE

 

두 가지 밖에 안됩니다.

 

TRUE 상태에선 변경 작업을 허용합니다.

FALSE 상태에선 변경 작업을 끝냅니다.

 


동작해보면 잘 돌아갑니다. 참 쉽죠??

 

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - (라디오 버튼) + 그룹박스

 

정말 쉽습니다.

 

http://yyman.tistory.com/506 / [MFC] 윈도우 프로그래밍 기초 - 체크 박스 + 버튼 응용 실습 예제

 

오늘 글의 초점은 아래의 결과물을 만드는 것입니다.

 


1. 결과물

 

결과물 먼저 볼까요?

 

 


2. 실습

 

a. 레이아웃 디자인

 

 

 

 

 앞에 글의 레이아웃 모습

 우리가 만들 레이아웃

 

현명하고 지혜로운 사람들은 잘 아시겠지만, 기존꺼 그대로 이어서 하시면 됩니다.

Radio 박스 레이아웃 설계만 하나 알려드리겠습니다.

 


a-1) Radio 박스 설계

 

* 이해를 위한 큰 나무 보기

 

 

* 주의사항 - Radio 박스는 체크박스 컨트롤과 달리 Group 항목을 설정해주지 않으면,

CButton 클래스 형식의 맴버 함수를 만들 수 없습니다.

추가된 라디오 버튼들을 하나씩 선택하여 속성 창에 있는 속성 항목에서 Group 항목을 True로 변경해야 합니다.

 

전 귀찮아서 위의 그림처럼 전체 다 선택했습니다. 그래도 상관없습니다.

 

 

 

 Group -> False 항목을

 

 True로 바꿔주고 변수 추가합니다.

 

 

컨트롤 ID 

 변수명

 Control 유형

 범주(T)

 변수 유형

 IDC_RADIO1

 m_RadioButton1

 라디오 박스

 Control

 CButton

 IDC_RADIO2 

 m_RadioButton2 

 라디오 박스 

 Control 

 CButton 

 IDC_RADIO3

 m_RadioButton3

 라디오 박스

 Control

 CButton

 IDC_STATIC1 

 

 그룹박스

 

 

 IDC_STATIC2 

 

 그룹박스

 

 

 

추가해서 만들 아이템의 구성요소입니다.

다 만들고 나면, 다시 Radio 1, 2, 3을 선택합니다.

 

아래와 같이 설정합니다.

 

 

 

 

 Group -> True 항목을

 

 False로 바꿔줍니다.

 

그러면 Radio 버튼 설계는 끝났습니다.

 


b. 코드

 

 

 

 (사용자 프로젝트명)ControlDlg.cpp

 

 

 

 

  (사용자 프로젝트명)ControlDlg.cpp 내에 BOOL CMFCControlDlg::OnInitDialog() 내부에 구현

 지난 번 강의에선 SetDlgItem( )로 컨트롤 Caption을 변경하였는데,

 이번에는 우리가 만든 변수를 직접 접근하여 변경하는 방법을 넣었습니다.

 같은 동작을 하니깐 오해하지 말고 두 가지 방법이 있구나 이 정도로 아셨으면 합니다.

 

 

 

 void CMFCControlDlg::OnBnClickedButton1()
 {
        // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

         CString szMsg_Name;
         CString szMsg_Menu;
         CString szMsg;

 

         if (m_CheckBox1.GetCheck() == BST_CHECKED)
         {
              GetDlgItemText(IDC_CHECK1, szMsg_Name);
              szMsg_Name.Append(_T("님\n"));
         }

         else if (m_CheckBox2.GetCheck() == BST_CHECKED)
         {
              GetDlgItemText(IDC_CHECK2, szMsg_Name);
              szMsg_Name.Append(_T("님\n"));
         }

         else if (m_CheckBox3.GetCheck() == BST_CHECKED)
        {
              GetDlgItemText(IDC_CHECK3, szMsg_Name);
              szMsg_Name.Append(_T("님\n"));
        }

 

         // 추가 - Radio 예제

        if (m_RadioButton1.GetCheck() == BST_CHECKED)
        {
              //GetDlgItemText(IDC_RADIO1, szMsg);
               m_RadioButton1.GetWindowTextW(szMsg_Menu);
               szMsg_Menu.Append(_T("- 요리 형"));
        }

         else if (m_RadioButton2.GetCheck() == BST_CHECKED)
        {
              //GetDlgItemText(IDC_RADIO2, szMsg);
               m_RadioButton2.GetWindowTextW(szMsg_Menu);
               szMsg_Menu.Append(_T("- 요리 형"));
         }

 

          else if (m_RadioButton3.GetCheck() == BST_CHECKED)
         {
               //GetDlgItemText(IDC_RADIO3, szMsg);
               m_RadioButton3.GetWindowTextW(szMsg_Menu);
               szMsg_Menu.Append(_T("- 요리 형"));
         }

 

         szMsg_Menu.Append(_T("\n음식하세요."));

         szMsg.Append(szMsg_Name);
         szMsg.Append(szMsg_Menu);

         AfxMessageBox(szMsg);

 

 }

 (사용자 프로젝트명)ControlDlg.cpp 내에 void CMFCControlDlg::OnBnClickedButton1() 내부에 구현

 

 지난 번 글에서는 GetDlgItem( )로 컨트롤 Caption의 값을 CString 형 변수에 전달하였는데,

 이번에는 만든 변수를 접근하여 가져오는 방법을 넣었습니다.

 

 

구현 끝... 수고하세요.

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 버튼 클릭 사용하기

 

"나는 착하다"라는 버튼 이벤트를 만드는 예제를 실습해보겠습니다.

 


1. 결과 - 완성 프로그램

 

 

 


2. 실습

 

 

이벤트 처리기 추가(A)를 클릭합니다.

 

 

 

추가 및 편집(A)를 클릭합니다.

 

 

이렇게 코드를 입력하면 결과물을 만들어낼 수 있습니다.

반응형

+ Recent posts