안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

2014년 11월 21일 금요일

[MFC] Listctrl Item 간 위치 변경

첨부화일을 참고하세요....... void MoveTo(CListCtrl* pList, int index1, int index2) // index1 < index2 이고.. { // index1의 item을 index2+1로 이동후 index1의 item은 지움.. if(index1==index2) return; int idx1 = index1; int idx2 = index2; if(index1 > index2) { idx1 = index2; idx2 = index1; } int nCount = pList->GetHeaderCtrl()->GetItemCount(); CString str; str = pList->GetItemText(idx1,0); pList->InsertItem(idx2+1, str); for(int k=1; kGetItemText(idx1,k); pList->SetItemText(idx2+1, k,str); } pList->DeleteItem(idx1); } void CABC11Dlg::OnButtonMoveup() { // TODO: Add your control notification handler code here CListCtrl *pList = &m_list; ///////////// POSITION pos = pList->GetFirstSelectedItemPosition(); if(pos == NULL) return; int PreIndex=-1; int Index; while(pos) { Index = pList->GetNextSelectedItem(pos); if( PreIndex+1 != Index) { MoveTo(pList, Index, Index-1); pList->SetItemState(Index-1, LVIS_SELECTED, LVIS_SELECTED); PreIndex = Index-1; } else PreIndex = Index; } } void CABC11Dlg::OnButtonMovedown() { // TODO: Add your control notification handler code here CListCtrl *pList = &m_list; //////// POSITION pos = pList->GetFirstSelectedItemPosition(); if(pos == NULL) return; vector IndexData; while(pos) { int Index = pList->GetNextSelectedItem(pos); IndexData.push_back(Index); } int size = IndexData.size()-1; int PreIndex=pList->GetItemCount(); int Index; for( ;0<=size ; --size) { Index = IndexData[size]; if(Index+1 != PreIndex) { MoveTo(pList, Index, Index+1); pList->SetItemState(Index+1, LVIS_SELECTED, LVIS_SELECTED); PreIndex = Index+1; } else PreIndex = Index; } } Vㅔ리 굳 출처: http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=50&MaeulNo=20&no=874306&ref=874281

[MFC] listctrl SetItemStatus 를 이용한 다중 선택

결국 for문인가.. int i = 0; for(i = 0; i<_lcDataReport.GetItemCount(); i++){ _lcDataReport.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED); } 출처: http://adnoctum.tistory.com/176

[MFC] ListCtrl 기본 예제

List Control List control은 아이콘, 작은 아이콘, 간단히, 보고서의 네 가지 형태로 데이터를 보여주는 컨트롤입니다. 이중 보고서 모드가 List control에 설정된 데이터를 가장 자세히 보여주는 모드입니다. 따라서 List control에 데이터를 설정할 때는 이 모드를 기준으로 하면 됩니다. 보고서 모드에는 하나의 아이템에 대해 가로줄로 여러 가지 데이터를 보여줄 수 있는데, 이러한 가루 줄을 각각 컬럼이라고 하고, 컬럼 맨 위에 각 컬럼의 제목을 표시하는 줄을 컬럼 헤더라고 합니다. |구현하고자 하는 기능| List control을 포함하는 대화상자를 만들어 보도록 합니다. 선택항목 삭제, 위로, 아래로 등을 이용해 위치를 바꾸고 삭제하는 프로그램을 만들어 보겠습니다. |App Wizard| 스켈레톤 코드를 생성한다. 프로젝트 생성 다이얼로그 형식의 프로젝트를 생성합니다. Project type Project name MFC AppWizard (exe) ListControl Step. 1 Dialog based |App Setup| 사용자 인터페이스 요소들을 시작적으로 디자인한다. 대화상자 리소스 디자인 위와 같이 대화상자에 List control을 올려놓고, List control의 속성을 설정합니다. List control의 속성을 아래에 정리 해 놓았습니다. 속성 정리 속성 의미 View Icon, Small Icon, List, Report 중 하나를 선택할 수 있습니다. Allign Left, Right 중 하나를 선택할 수 있으며, 아이콘 정렬의 기준을 설정합니다. Sort None, Ascending, Descending 중 하나를 선택할 수 있으며, 정렬 방법을 설정합니다. Single selection 오직 하나의 항목만 선택할 수 있도록 합니다. Auto arrange Icon 또는 Small Icon에서 아이콘들을 자동으로 정렬되도록 합니다. No label wrap 아이콘과 함께 쓰이는 텍스트가 한 줄로 쓰여지도록 합니다. Edit labels 텍스트를 편집할 수 있게 합니다. 이 스타일을 선택하면 텍스트 편집이 끝나면 LVN_ENDLABELEDIT 이벤트가 발생합니다. No column header Report에서 컬럼 헤더를 표시하지 않도록 합니다. No sort header 컬럼 헤더가 표시되더라도 동작하지 않도록 합니다. 보통 컬럼 헤더는 정렬 모드를 바꾸기 위해 사용됩니다. 속성 설정 컨트롤 ID Caption 기타 List control IDC_LIST1 [View] 속성 [Report] Push Button1 IDC_BUTTON_UP 위로 Push Button2 IDC_BUTTON_DOWN 아래로 Push Button3 IDC_BUTTON_DELETE 삭제 Push Button4 IDC_BUTTON_PRINT 출력 탭 순서 설정 순서가 중요한 프로그램이 아니어서 순서 지정 없이 진행합니다. |Class Wizard| AppStudio에서 시각적으로 디자인된 요소들을 실제 프로그램 코드와 연결 시킨다. 새로운 클래스를 정의한다. 각 컨트롤들의 메시지 핸들러를 재 정의한다. 컨트롤과 멤버 변수 연결 Class Wizard 의 Member Variables 에서 연결 시킨다. Control Type Member List control Control CListCtrl m_ctrlList CListCtrl의 주요 멤버 함수 List control에 컬럼 및 아이템을 추가 삭제등 한다. 멤버 함수 기능 InsertItem 새로운 항목을 추가 합니다. DeleteItem 지정된 항목을 삭제 합니다. DeleteAllitems 모든 항목들을 삭제 합니다. GetItemCount 항목의 개수를 얻습니다. SetItem GetItem 각각의 아이템의 정보를 설정합니다. 각각의 아이템의 정보를 얻습니다. SetItemText GetItemText 각각의 아이템의 텍스트를 설정합니다. 각각의 아이템의 텍스트를 얻습니다. InsertColumn 새로운 컬럼을 추가 합니다. DeleteColumn 지정된 컬럼을 삭제 합니다. SetImageList GetImageList 각각의 아이콘으로 사용될 이미지 리스트를 설정합니다. 각각의 아이콘으로 사용될 이미지 리스트를 얻습니다. List Control이 발생시키는 이벤트 List control이 발생시키는 주요 이벤트 이벤트 발생 시기 LVN_COLUMNCLICK 컬럼 헤더가 클릭 되었을 때 LVN_DELETEITEM 항목이 삭제 되었을 때 LVN_DELETEALLITEMS 모든 항목이 삭제 되었을 때 LVN_INSERTITEM 새로운 항목이 추가 되었을 때 LVN_ITEMCHANGED 선택된 항목이 다른 항목으로 변경 되었을 때 LVN_KEYDOWN 키보드가 눌렸을 때 메시지 핸들러 재 정의 각각의 버튼들의 메시지 핸들러를 재 정의 합니다. void CListControlDlg::OnButtonUp() { } void CListControlDlg::OnButtonDown() { } void CListControlDlg::OnButtonDelete() { } void CListControlDlg::OnButtonPrint() { } |코딩| 컨트롤 초기화 //컬럼을 생성합니다. BOOL CListControlDlg::OnInitDialog() { CRect rect; m_ctrlList.GetClientRect(&rect); m_ctrlList.InsertColumn(0, _T("이름"), LVCFMT_LEFT, 100); m_ctrlList.InsertColumn(1, _T("나이"), LVCFMT_RIGHT, 100); m_ctrlList.InsertColumn(2, _T("성별"), LVCFMT_CENTER, 100); m_ctrlList.InsertColumn(3, _T("전화"), LVCFMT_LEFT, rect.Width()-220); return TRUE; // return TRUE unless you set the focus to a control } 아이템 추가 //각 컬럼에 아이템을 추가한다. BOOL CListControlDlg::OnInitDialog() { CString str; for(int i=0; i<7; i++) { m_ctrlList.InsertItem(i, strName[i], rand()%5); str.Format("%d",rand()%100); m_ctrlList.SetItemText(i, 1, str); if(rand()%2 == 0) str="남자"; else str = "여자"; m_ctrlList.SetItemText(i,2,str); str.Format("%03d - %04d", rand()%1000, rand()%10000); m_ctrlList.SetItemText(i,3,str); } return TRUE; } 선택 항목 위로 //아이템을 선택하고 위로 버튼을 눌렀을 때를 처리한다. void CListControlDlg::OnButtonUp() { POSITION pos; while(pos = m_ctrlList.GetFirstSelectedItemPosition()) { int nSelItem = m_ctrlList.GetNextSelectedItem(pos); CString strTemp; strTemp = m_ctrlList.GetItemText(nSelItem-1, 0); if(!strTemp.IsEmpty()) { CString strName, strAge, strSex, strTel; strName = m_ctrlList.GetItemText(nSelItem,0); strAge = m_ctrlList.GetItemText(nSelItem,1); strSex = m_ctrlList.GetItemText(nSelItem,2); strTel = m_ctrlList.GetItemText(nSelItem,3); m_ctrlList.DeleteItem(nSelItem); m_ctrlList.InsertItem(nSelItem-1, strName, 0); m_ctrlList.SetItemText(nSelItem-1, 1, strAge); m_ctrlList.SetItemText(nSelItem-1, 2, strSex); m_ctrlList.SetItemText(nSelItem-1, 3, strTel); } else break; } } 선택 항목 아래로 //아이템을 선택하고 아래로 버튼을 눌렀을 때를 처리한다. void CListControlDlg::OnButtonDown() { POSITION pos; while(pos = m_ctrlList.GetFirstSelectedItemPosition()) { int nSelItem = m_ctrlList.GetNextSelectedItem(pos); CString strTemp; strTemp = m_ctrlList.GetItemText(nSelItem+1, 0); if(!strTemp.IsEmpty()) { CString strName, strAge, strSex, strTel; strName = m_ctrlList.GetItemText(nSelItem,0); strAge = m_ctrlList.GetItemText(nSelItem,1); strSex = m_ctrlList.GetItemText(nSelItem,2); strTel = m_ctrlList.GetItemText(nSelItem,3); m_ctrlList.DeleteItem(nSelItem); m_ctrlList.InsertItem(nSelItem+1, strName, 0); m_ctrlList.SetItemText(nSelItem+1, 1, strAge); m_ctrlList.SetItemText(nSelItem+1, 2, strSex); m_ctrlList.SetItemText(nSelItem+1, 3, strTel); } else break; } } 선택 항목 삭제 //아이템을 선택하고 삭제 버튼을 눌렀을 때를 처리한다. // 다중선택시 void GetIndex() { int nItemCount = m_ctrlList.GetSelectedCount(); POSITION pos = m_ctrlList.GetFirstSelectedItemPosition(); for (int i = 0; i < nItemCount; i++) { int nIndex = m_ctrlList.GetNextSelectedItem(pos); } } // 단일 선택 int GetIndex() { int nSelectedItem = m_ctrlList.GetNextItem( -1, LVNI_SELECTED ); CString strKey = m_ctrlList.GetItemText(nSelectedItem, 0); if ( strKey == "") { return -1; } return nSeletedItem; } // 다중 선택한거 골라서 삭제 int nItem; POSITION pos; pos = m_ctrlList.GetFirstSelectedItemPosition(); while (pos != NULL) { nItem = m_ctrlList.GetNextSelectedItem(pos); m_ctrlList.DeleteItem(nItem); pos = m_ctrlList.GetFirstSelectedItemPosition(); } 항목 삭제 //출력 버튼을 눌렀을 때를 처리한다. void CListControlDlg::OnButtonPrint() { int nSelItem = 0; CString strPrint, strTemp; while(1) { strTemp = m_ctrlList.GetItemText(nSelItem,0); if(strTemp.IsEmpty()) break; strTemp += " "; strTemp += m_ctrlList.GetItemText(nSelItem,1); strTemp += " "; strTemp += m_ctrlList.GetItemText(nSelItem,2); strTemp += " "; strTemp += m_ctrlList.GetItemText(nSelItem,3); strTemp += "\n"; strPrint += strTemp; nSelItem ++; } AfxMessageBox(strPrint); } 문자열 이용삭제 일반적으로 리스트 컨트롤에서 아이템을 지우려면 DeleteItem 이라는 함수를 사용합니다.하지만 이 함수가 지우고자하는 아이템의 인덱스를 요구하기 때문에 님이 사용하고자 하는 직접적인 형태는 아닌것 같네요.. 따라서 아이템 스트링을 가지고 삭제하고 싶다면 FindItem이라는 함수를 사용해서 먼저 해당 아이템의 인덱스를 얻은 후, DeleteItem을 사용하면 될것 같습니다. 해당 코드를 함수로 구성해 보면 다음과 같습니다... void 해당클래스::DeleteItemWithString(const char *parm_name) { LVFINDINFO find_item; find_item.flags = LVFI_STRING; find_item.psz = parm_name; int index = 리스트컨트롤.FindItem(&find_item); if(-1 != index) 리스트컨트롤.DeleteItem(index); } 이렇게 하면 리스트 컨트롤에서 지우고자 하는 아이템의 이름이 "홍길동" 이라면 다음과 같이 호출하면 됩니다. DeleteItemWithString("홍길동"); 체크 선택, 해제 m_ctrlList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES ); //출력 버튼을 눌렀을 때를 처리한다. void CListControlDlg::Secheck(BOOL _bisCheck) { int nCntlist = m_ctrlList.GetIemcount(); for(int i = 0; i < nCntlist; i++) { m_ctrlList.SetCheck(i, _bisCheck); } } 아이템 선택 // 1개 이상 선택 및 확인 POSITION pos = m_list.GetFirstSelectedItemPosition(); if (pos == NULL) { AfxMessageBox(_T("No items were selected!\n")); } else { while (pos) { int nItem = m_list.GetNextSelectedItem(pos); CString temp = m_list.GetItemText(nItem,0); } } temp.Format(_T("%s seq가 선택됨"),temp); AfxMessageBox(temp); 아이템 선택리스트 컨트롤 사용시 원하는 라인에 포커스 설정 및 라인 이동 Ex) CListCtrl m_list; m_list.SetItemState( -1, 0, LVIS_SELECTED|LVIS_FOCUSED ); m_list.SetItemState(nRow, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); m_list.EnsureVisible(nRow, FALSE); m_list.SetFocus(); // 깜박임 없이 마지막 라인으로 자동 스트롤 된다. m_list.SendMessage(WM_VSCROLL,SB_BOTTOM,NULL); 설명) SetItemState(옵션1, 옵션2, 옵션3) 옵션1 : 선택라인 옵션2 : 선택한 상태로 리스트를 출력(옵션3에서 나열된 옵션에서만 선택 가능) 옵션3 : 옵션2에서 선택할수 있는 옵션 나열 // 해당 라인으로 스크롤 이동 EnsureVisible // 해당 라인으로 포커스 설정 SetFocus 선택은 - SetItemState( nCount, LVIS_SELECTED, LVIS_SELECTED ); 비선택은 - SetItemState( nCount, 0, LVIS_SELECTED ); LVIS_SELECTED 는 선택 LVIS_FOCUSED 는 포커스.. - 키보드 로 이동한다거 할때 이넘을 기준으로 움직이는거임.. ps. 마우스로 클릭할경우에는 컨트롤키를 누르지 않은 이상 하나만 선택되고, 포커스가 맞춰지는데 위의 코드로 선택만 설정해주게 되면 기존에 선택된 아이템이 있을경우 추가로 선택이 되기때문에 기존에 선택된것들은 지우든지 한다. 물론 LVS_SINGLESEL 스타일이 적용되어있다면 관계없다. 쵝오로 잘 정리되어 있음 출처: http://izen8.tistory.com/696

[MFC] ListCtrl Row 순서 변경

최초 시도 시에는 InsertItem으로 넣은 후에 기존 Row를 삭제하는 방법을 선택 2,3번 변경시 3번을 2번 위치로 변경 index1 = 2; CString str = listctrl.GetItemText(index1,0); index2 = 3; listctrl.InsertItem(index2+1, str); listctrl.DeleteItem(index1); 하지만 위와 같이 동작할 때 이상하게 InsertItem의 위치가 틀어짐 그래서 다른 방법을 생각해 냄 일단 2번,3번 열의 데이터를 각각 저장 2번 열 데이터 저장 (CString str1) 3번 열 데이터 저장 (CString str2) 그리고 SetItemText로 데이터 변경 listctrl.SetItemText(index1,str2); listctrl.SetItemText(index2,str1); 미션 컴플리트

2014년 4월 29일 화요일

[VC2010] 디버그 기본 자료

VC 2010 디버깅 시에 필요한 기본 자료들이 들어 있는 파일입니다. 출처는 아래 홈페이지 입니다. 자료 첨부할려고 했는데 자료 첨부는 안되네요 아래 홈페이지에서 받으시면 됩니다. 출처 : http://vsts2010.tistory.com/693

2014년 4월 24일 목요일

[VS2010] 소스 제어 - 데이터베이스에 액세스할 수 없음

VC 6.0 => VC 2010으로 올리고 VC 6.0 Project를 여니깐 문제가 참 마니 나옵니다. 소스 제어 - 데이터베이스에 액세스 할 수 없음에 대한 MSDN의 설명이네요. 아래 내용을 분석해서 적용해 봐야겠네요 전문 복사합니다. 소스 제어 소개 Visual Studio 2008 다른 버전 Visual Studio 2005 이 항목은 아직 평가되지 않았습니다.- 이 항목 평가 업데이트: 2007년 11월 Visual Studio에서는 IDE(통합 개발 환경)에서 VSIP(Visual Studio Integration Protocol) 계층을 사용하여 소스 제어를 지원합니다. VSIP에서는 일반적으로 적합한 프로토콜에 맞게 작성된 플러그 인으로 구현되는 다양한 소스 제어 패키지를 호스팅할 수 있습니다. 소스 제어 플러그 인의 예로는 Visual SourceSafe에서 지원되는 SourceSafe LAN 플러그 인을 들 수 있습니다. 이 플러그 인에 대한 자세한 내용은 Visual SourceSafe 도움말을 참조하십시오. 참고: 소스 제어 패키지는 다른 유형의 소프트웨어 모듈로 구현될 수 있지만 Visual Studio에서는 소스 제어 패키지를 플러그 인으로 지칭합니다. Visual Studio 소스 제어는 단지 타사 소스 제어 플러그 인을 위한 환경이므로 플러그 인을 설치해야만 소스 제어 기능이 활성화됩니다. 타사 소스 제어 플러그 인을 사용하려면 일반적으로 타사 응용 프로그램 및/또는 소스 제어 플러그 인을 해당 클라이언트 및 서버 컴퓨터에 설치해야 합니다. 타사의 지침에 따라 플러그 인을 설치하면 Visual Studio에서 해당 플러그 인을 사용할 수 있습니다. 가능한 작업은 소스 제어 플러그 인에 따라 다릅니다. 패키지별 작업 정보는 타사 설명서를 참조해야 합니다. Visual Studio의 소스 제어 디자인에 대한 자세한 내용은 Visual Studio 도움말의 "개요(소스 제어)"를 참조하십시오. 또한 이 도움말 단원에서는 Visual Studio와 호환되는 타사 소스 제어 패키지를 개발하는 데 필요한 모든 정보를 제공합니다. Visual Studio의 소스 제어 지원에 대한 기본 사항 -------------------------------------------------------------------------------- Visual Studio에서는 기본적으로 Visual Studio 프로젝트, 솔루션, 파일, 관련 메타데이터의 버전 관리 및 조작, 소스 제어 플러그 인과 환경 옵션 설정, 플러그 인 전환, 데이터베이스 액세스 등의 소스 제어 지원을 제공합니다. Visual Studio의 소스 제어 기능을 사용하면 데이터베이스 액세스 제어를 위한 프로토콜이 적용됩니다. 이러한 프로토콜의 예로는 '잠금-수정-잠금 해제' 작업 스타일이 있으며 이 경우 파일을 수정하려면 우선 파일을 단독으로 체크 아웃해야 합니다. 소스 제어 플러그 인과 상호 작용하려면 Visual Studio 메커니즘의 소스 제어를 사용해야 합니다. 플러그 인을 지원하는 다른 클라이언트 응용 프로그램(예: Visual SourceSafe Explorer)을 사용하지 마십시오. Visual Studio에서 소스 제어 메커니즘을 적절히 사용하면 올바른 파일만 소스 제어에 추가되도록 할 수 있으며 Visual Studio 프로젝트와 솔루션이 올바른 플러그 인 관련 정보로 업데이트되도록 할 수 있습니다. 소스 제어 플러그 인 구성 및 전환 Visual Studio 소스 제어는 옵션 대화 상자의 소스 제어 항목을 통해 구성 및 플러그 인 전환을 지원합니다. Visual Studio의 도구 메뉴에서 옵션을 선택하면 이 항목에 액세스할 수 있습니다. 옵션 대화 상자를 사용하여 소스 제어에 사용할 플러그 인을 선택하고 해당 플러그 인에 맞는 환경 옵션을 설정합니다. Visual Studio IDE에서 소스 제어 기능을 활용하려면 먼저 다음 작업을 수행해야 합니다. •사용 가능한 소스 제어 플러그 인이 있는지 확인합니다. •사용하려는 소스 제어 플러그 인이 컴퓨터에 설치되어 있지 않으면 플러그 인을 지원하는 타사 제품을 설치하고 Visual Studio를 다시 시작한 후 이 제품을 등록합니다. •특정 플러그 인의 기능에 따라 소스 제어 데이터베이스를 만듭니다. •모든 팀 구성원에게 데이터베이스 위치에 대한 링크를 보냅니다. 데이터베이스 액세스 Visual Studio의 파일 메뉴에서 기본적인 데이터베이스 액세스 명령(예: 체크 아웃, 소스 제어에 추가)을 사용할 수 있습니다. 그러나 사용하려는 소스 제어 플러그 인을 선택해야만 이러한 명령이 활성화됩니다. 기본 데이터베이스 액세스 명령 중 하나를 사용하면 선택한 플러그 인에서 해당 타사 기능 및/또는 환경을 호출하여 관련 작업을 완료합니다. 일부 액세스 작업은 플러그 인만 선택해도 활성화되지만, 그밖의 작업은 Visual Studio의 솔루션 탐색기에서 Visual Studio 프로젝트, 솔루션 또는 파일도 선택해야만 활성화됩니다. 예를 들어, 소스 제어에 추가 명령은 플러그 인만 선택해도 사용할 수 있지만, 체크 인 명령은 솔루션 탐색기에서 항목을 선택해야만 사용할 수 있습니다. 소스 제어의 파일 처리 -------------------------------------------------------------------------------- Visual Studio 소스 제어에 추가할 수 있는 파일은 다음과 같습니다. •솔루션 파일(*.sln) •프로젝트 파일(예: *.csproj, *.vbproj 파일) •Visual Studio 프로젝트의 런타임 동작을 제어하는 데 사용되는 XML 기반의 응용 프로그램 구성 파일 소스 제어에 추가할 수 없는 파일은 다음과 같습니다. •솔루션 사용자 옵션 파일(*.suo) •프로젝트 사용자 옵션 파일(예: *.csproj.user, *.vbproj.user 파일) •웹 프로젝트의 가상 루트 위치를 제어하는 웹 정보 파일(예: *.csproj.webinfo, *.vbproj.webinfo) •빌드 출력 파일(예: *.dll 및 *.exe 파일) 네임스페이스 변경 전파 -------------------------------------------------------------------------------- Visual Studio 소스 제어는 소스 제어 플러그 인에서 네임스페이스 변경 전파를 지원합니다. 변경 전파는 작업 삭제, 이름 바꾸기 및 이동 작업에 적용됩니다. 변경 전파가 설정된 작업을 요청할 경우 이미 체크 인한 항목을 다른 사용자가 검색하면 소스 제어 플러그 인에서 소스 제어 항목의 작업 복사본, 데이터베이스의 마스터 복사본 및 다른 사용자의 복사본을 모두 변경합니다. 소스 제어에서 솔루션 및 프로젝트를 처리하는 방법 -------------------------------------------------------------------------------- 솔루션 또는 프로젝트를 소스 제어에 추가할 때 소스 제어 플러그 인은 추가할 항목의 통합 루트를 먼저 식별해야 합니다. 이 루트는 솔루션 또는 프로젝트를 구성하는 모든 작업 폴더 및 파일의 부모 디렉터리에 대한 경로입니다. 통합 루트는 일반적으로 디스크상의 물리적 경로에 매핑됩니다. 그러나 둘 이상의 디스크 드라이브에 있는 파일 또는 프로젝트가 솔루션에 포함된 경우에는 통합 루트를 물리적 폴더에 매핑할 수 없습니다. 솔루션은 여러 드라이브에 걸쳐 있을 수 있지만 소스 제어 통합 루트는 그렇지 않습니다. 이런 경우를 위해 Visual Studio 소스 제어는 상위 통합 루트의 개념을 지원합니다. 상위 통합 루트는 소스 제어 솔루션의 모든 프로젝트 및 파일이 위치하는 가상 컨테이너입니다. 고급 기능이 있는 소스 제어 플러그 인을 사용하여 솔루션을 추가하면 데이터베이스에 빈 솔루션 루트 폴더가 만들어집니다. 이 폴더에는 소스 제어 솔루션의 모든 항목이 포함됩니다. 기본적으로 이 폴더는 .root입니다. 참고: 단일 프로젝트를 소스 제어에 추가할 때는 .root 폴더가 만들어지지 않습니다. 솔루션 루트를 사용하면 다음과 같은 이점이 있습니다. •확인 메시지가 감소됩니다. 솔루션 루트는 솔루션에 추가할 수 있는 소스 제어 바인딩 수를 최소화하므로 소스 제어에 솔루션을 추가하고 다른 작업을 수행할 때 사용자에게 묻는 메시지가 최소화됩니다. •프로젝트를 캡슐화합니다. 솔루션 루트를 사용하면 하나 이상의 프로젝트가 여러 파티션 또는 컴퓨터에 있더라도 솔루션의 모든 프로젝트를 한 군데 모아 놓은 것처럼 쉽게 식별할 수 있습니다. .root 폴더를 만들지 않도록 설정할 수도 있지만 이러한 설정은 권장되지 않습니다. 자세한 내용은 방법: .root 폴더 만들기 사용 안 함을 참조하십시오. Visual Studio의 솔루션은 구조가 제대로 구성되는 경우도 있고 그렇지 않은 경우도 있습니다. 구조가 제대로 구성된 솔루션은 디스크상의 계층 구조가 솔루션 탐색기에서의 해당 구조와 일치하는 솔루션입니다. 제대로 구성된 솔루션에서 모든 프로젝트는 디스크에서 솔루션 폴더의 하위 폴더에 저장됩니다. 솔루션의 구조가 제대로 구성되면 소스 제어에 이 솔루션을 추가할 때 솔루션 제어 플러그 인은 *.root 폴더 아래에 하나의 폴더를 만들어 솔루션의 솔루션 파일(*.sln) 및 솔루션 사용자 옵션 파일(*.suo)의 마스터 복사본을 보관합니다. 마지막으로, 솔루션 제어 플러그 인은 소스 제어 데이터베이스에 프로젝트가 추가될 때마다 .sln 폴더 아래에 해당 폴더를 만듭니다. 솔루션 구조가 제대로 구성되어 있지 않으면 솔루션 제어 플러그 인은 솔루션 및 해당 초기 프로젝트에 대해 하나의 폴더를 만듭니다. 그리고 그 후에 추가되는 각 프로젝트에 대한 폴더가 솔루션 폴더 옆에 나란히 만들어집니다. 솔루션 또는 프로젝트의 뷰 -------------------------------------------------------------------------------- Visual Studio는 소스 제어 솔루션 또는 프로젝트에 대해 디자인 뷰, 소스 제어 뷰 및 실제 뷰의 세 가지 뷰를 제공합니다. 이러한 뷰의 개별 요소가 서로 1대1로 매핑되면 여러 가지 소스 제어 작업을 쉽게 수행할 수 있습니다. 그러나 Visual Studio의 기본 설정을 사용하여 솔루션과 프로젝트를 만들어 소스 제어에 추가하면 솔루션 탐색기 및 데이터베이스에서와 같은 방식으로 솔루션과 프로젝트를 디스크상에 구성할 필요가 없습니다. 솔루션 탐색기에서 볼 수 있는 솔루션 또는 프로젝트의 디자인 뷰는 솔루션 또는 프로젝트의 내용을 논리적으로 묘사합니다. 일반적으로 디자인 뷰에서는 논리 정연하게 의미를 전달합니다. 필요 없는 파일은 숨겨지고 여러 물리적 위치의 파일들이 단일 프로젝트 컨테이너 안에 포함됩니다. 독립 실행형 응용 프로그램(예: Visual SourceSafe Explorer)에서 볼 수 있는 솔루션 또는 프로젝트의 소스 제어 뷰도 역시 솔루션 또는 프로젝트의 논리 뷰입니다. 그러나 소스 제어 뷰는 논리 뷰와 완전히 동일하지는 않습니다. Windows 파일 탐색기에서 볼 수 있는 솔루션 또는 프로젝트의 실제 뷰는 그 구조가 논리 뷰 또는 소스 제어 뷰의 계층 구조와 다릅니다. 다음 지침을 따르면 소스 제어 솔루션 및 프로젝트의 디자인 뷰, 실제 뷰 및 소스 제어 뷰 간에 구조적인 상관성을 이룰 수 있습니다. •먼저 빈 솔루션을 만들고 프로젝트를 솔루션에 추가합니다. 이렇게 하면 솔루션과 해당 프로젝트 간의 논리적 부모-자식 관계를 저장소에 유지할 수 있습니다. 그런 다음 솔루션을 소스 제어에 추가하면 디스크상의 솔루션 계층 구조가 소스 제어 뷰 및 디자인 뷰에 미러링됩니다. •각 솔루션의 이름은 포함된 각 프로젝트의 이름과 다르게 하며 솔루션의 내용을 반영할 수 있도록 지정합니다. •소스 제어 솔루션 또는 프로젝트에는 링크 파일을 추가하지 않습니다. •가능하면 솔루션 또는 프로젝트의 모든 파일을 하나의 디스크 드라이브에 저장합니다. 소스 제어 연결 및 바인딩 -------------------------------------------------------------------------------- Visual Studio에서 연결은 Visual Studio와 데이터베이스 서버 간의 라이브 데이터 링크입니다. 솔루션 또는 프로젝트를 소스 제어에 추가하면 소스 제어 플러그 인은 그 항목과 모든 해당 내용을 디스크에서 데이터베이스로 복사합니다. 솔루션 또는 프로젝트 파일을 포함하는 각 폴더에 대해 소스 제어 폴더가 하나씩 만들어집니다. 항목을 추가한 후에는 솔루션 또는 프로젝트의 로컬 작업 복사본이 데이터베이스의 해당 버전에 바인딩됩니다. 모든 소스 제어 솔루션에는 소스 제어 바인딩이 하나 이상 있습니다. 그러나 항목은 여러 개의 바인딩을 가질 수 있으며 데이터베이스에 대해 여러 개의 연결을 필요로 합니다. 바인딩 및 연결의 수는 처음에 솔루션을 만든 방법과 해당 프로젝트 및 파일이 모두 동일 파티션에 저장되었는지 여부에 따라 다릅니다. 바인딩 및 연결을 설명하기 위해, 여러 개의 프로젝트가 포함된 올바른 형식의 소스 제어 솔루션을 여러 개의 방이 있는 집에 비유해 보겠습니다. 집을 건축할 때 하나의 방에서 외부로 연결되는 하나의 고속 데이터 라인를 설치한다고 합시다. 방화벽이 구성된 라우터를 설치하여 다른 방에도 데이터 공급이 이루어지게 하고 하나의 인터넷 서비스에 가입하여 인터넷에 연결합니다. 소스 제어 바인딩은 집에 설치한 하나의 데이터 라인에 비유할 수 있습니다. 소스 제어 솔루션을 열면 바인딩을 통해 연결이 이루어집니다. 그러면 디스크에 있는 솔루션의 작업 복사본과 데이터베이스에 있는 솔루션의 마스터 복사본 사이에 핸드셰이크가 설정됩니다. 구조가 제대로 구성되지 않은 소스 제어 솔루션은 모든 방이 인터넷에 직접 연결된 집에 비유할 수 있습니다. 이 경우, 데이터 라인이 하나만 연결된 집보다 인터넷 요금도 많이 들고, 유지 관리 비용도 높고, 다른 인터넷 서비스로 전환할 때도 훨씬 번거롭고 시간이 오래 걸립니다. 그러므로 솔루션 및 해당 프로젝트가 하나의 소스 제어 바인딩을 공유하는 것이 이상적입니다. 하나의 바인딩을 사용하는 솔루션은 여러 개의 바인딩을 사용하는 솔루션에 비해 관리가 용이하며 다음과 같은 장점이 있습니다. •오프라인 작업을 위해 소스 제어에 대한 연결을 끊기가 쉽습니다. •네트워크에 다시 연결한 후 데이터베이스에 연결하기가 쉽습니다. •한 단계에서 분기하기가 쉽습니다. 프로젝트를 추가하기 전에 빈 솔루션을 만들면 하나의 바인딩을 사용하는 다중 프로젝트 솔루션을 만들 수 있습니다. 솔루션-프로젝트 쌍을 만들 때 새 프로젝트 대화 상자에서 솔루션용 디렉터리 만들기 옵션을 선택해도 이 작업을 수행할 수 있습니다. 한 단계에서 솔루션-프로젝트 쌍을 만들고 새 프로젝트 대화 상자에서 솔루션용 디렉터리 만들기를 선택하지 않으면(기본적으로 선택되어 있지 않음) 솔루션에 두 번째 프로젝트를 추가할 때 두 번째 바인딩이 만들어집니다. 초기 프로젝트와 솔루션에 대해 하나의 바인딩이 만들어지고, 다른 프로젝트를 추가할 때마다 추가 바인딩이 만들어집니다. 소스 제어 용어 -------------------------------------------------------------------------------- Visual Studio 설명서에서는 여러 용어를 사용하여 소스 제어 기능과 개념을 설명합니다. 다음 표에서는 일반적인 용어 몇 가지를 정의합니다. 기본 버전 로컬 버전이 파생된 파일의 서버 버전입니다. 바인딩 디스크에 있는 솔루션 또는 프로젝트의 작업 폴더를 데이터베이스에 있는 해당 폴더와 연관시킨다는 의미입니다. 분기 소스 제어에서 사용 중인 공유 파일 또는 프로젝트의 새 버전(또는 분기)을 만드는 프로세스입니다. 분기가 만들어지면 소스 제어의 두 버전은 특정 시점까지 기록을 공유하며 그 시점 이후에는 각각 별도의 기록을 갖습니다. 충돌 두 명 이상의 개발자가 동일한 파일을 체크 아웃하여 편집한 경우 동일한 코드 줄에 대해 서로 다른 내용을 적용하려고 할 때 발생합니다. 연결 소스 제어 클라이언트(예: Visual Studio)와 소스 제어 데이터베이스 서버 간의 라이브 데이터 링크입니다. 데이터베이스 모든 마스터 복사본, 기록, 프로젝트 구조 및 사용자 정보가 저장되는 위치입니다. 하나의 프로젝트는 항상 하나의 데이터베이스 내에 포함됩니다. 여러 프로젝트가 하나의 데이터베이스에 저장될 수도 있고, 여러 데이터베이스가 사용될 수도 있습니다. 데이터베이스를 리포지토리 또는 저장소라고도 합니다. 사용 기록 처음에 파일을 소스 제어에 추가한 후 파일의 변경 내용에 대한 기록입니다. 버전 제어를 사용하면 파일 기록에서 임의의 시점으로 되돌아가 그 시점의 상태로 파일을 복구할 수 있습니다. 레이블 특정 버전의 소스 제어 항목에 지정된 사용자 정의 이름입니다. 로컬 복사본 사용자의 작업 폴더에 있는 파일이며 체크 인할 때까지 변경 내용이 저장됩니다. 로컬 복사본을 작업 복사본이라고도 합니다. 마스터 복사본 작업 폴더에 있는 파일의 로컬 복사본과 별개로, 가장 최근에 체크 인된 소스 제어 파일 버전입니다. 마스터 복사본을 서버 버전 또는 데이터베이스 버전이라고도 합니다. 병합 수정된 버전의 파일 두 개 이상을 하나의 새로운 파일 버전으로 결합하는 프로세스입니다. 이러한 병합은 동일한 파일의 여러 버전 또는 동일한 파일 버전의 변경 내용에 영향을 줄 수 있습니다. 공유 파일 둘 이상의 소스 제어 위치에서 여러 개의 파일 버전을 가지는 파일입니다. 공유 파일을 복사본 또는 바로 가기라고도 합니다. 솔루션 루트 소스 제어 솔루션의 모든 항목이 들어 있는 데이터베이스의 빈 폴더입니다. 기본적으로 이 폴더는 .root입니다. 상위 통합 루트 소스 제어 솔루션의 모든 프로젝트 및 파일이 위치하는 가상 컨테이너입니다. 예를 들어, [SUR]:\는 [SUR]:\C:\Solution\ProjOne 및 [SUR]:\D:\ProjTwo에 위치한 프로젝트들을 포함하는 소스 제어 솔루션의 상위 통합 루트입니다. 통합 루트 소스 제어 솔루션 또는 프로젝트의 모든 작업 폴더 및 파일에 대한 부모 디렉터리 경로입니다. 예를 들어, C:\Solution은 C:\Solution, C:\Solution\ProjOne 및 C:\Solution\ProjTwo에 위치한 파일들을 포함하는 소스 제어 솔루션의 통합 루트입니다. 작업 폴더 소스 제어 항목의 로컬 복사본이 저장되는 위치이며 일반적으로 사용자의 컴퓨터에 있습니다. 작업 폴더를 작업 영역이라고도 합니다. 출처 : http://msdn.microsoft.com/ko-kr/library/ms171339(v=vs.90).aspx

2014년 4월 22일 화요일

[VS2010] warning MSB8012

풀 경고 메세지는 warning MSB8012: TargetExt(.dll)이(가) Linker의 OutputFile 속성 값(....)과 일치하지 않습니다. 이를 수정하려면 $(OutDir), $(TargetName) 및 $(TargetExt) 속성 값이 %(Lib.OutputFile)에 지정된 값과 일치해야 합니다. 여기서 (....) 은 (.ocx) (.dll) 일 수 있다. 보통 VC6 에서 개발된 것을 VS2010 컴파일 할때 나는 warning 이다. MSB8012 이 발생하는 이유 : Link.OutputFile 은 등록정보의 링커 -> 일반 -> 출력 파일 에 선언된 값으로 기본값으로 이 값은 $(TargetPath) 와 같은 $(OutDir)$(TargetName)$(TargetExt)이다. 그러나 이전버전에서 어플리케이션을 변환할 때 다른 고객들은 다른 방법으로 형식화된 값들을 가지고 있을 수 있기때문에, 변환을 위해 $(TargetName) 과 $(TargetExt) 가 가르키는 정확한 값을 밝힐 수 있도록 Link.OutputFile 을 분석할 수 있는 쉬운 방법이 없었음. 이 문제를 해결하기위해 MS는 변환을 하는동안 Linker.OutputFile 값을 보존하기로 결정한다. : 변환후에 $(TargetName) 은 기본값으로 $(ProjectName) 으로 설정된다. $(TargetExt) 는 각 어플리케이션 형식에 맞는 기본값을 가짐. 즉 동적 라이브러리 *.dll, 정적 라이브러리 *.lib, 어플리케이션 *.exe과 같으며, Link.OutputFile 값은 그대로 보존된다. 이 때, Link.OutputFile 과 $(TargetPath) 가 같지 않으면 변환 로그에 경고 MSB8012 가 발생하게 된다. MSB8012 은 아래와 같이 하면 해결될 수 있다. 먼저 프로젝트 ->속성 에서 링커 -> 일반 -> 출력 파일 을 확인 하여 출력파일 과 확장명이 뭔지 확인한다. : $(OutDir), $(TargetName) 과 $(TargetExt) 는 "일반" 등록정보 페이지에서 "출력 디렉토리", "대상 이름", "대상 확장명" 로 확인할 수 있다. 위 출력파일과 다르다면 같게 수정하여 컴파일 해본다. 그럼 잘 된다..^^ 출처: http://www.isfull.com/bbs/board.php?bo_table=tb01&wr_id=19

[VS2010] LINK : fatal error LNK1123: COFF로 변환하는 동안 오류가 발생했습니다. 파일이 잘못되었거나 손상되었습니다.

CVTRES : fatal error CVT1100: 리소스가 중복되었습니다. 형식:MANIFEST, 이름:1, 언어:0x0409 LINK : fatal error LNK1123: COFF로 변환하는 동안 오류가 발생했습니다. 파일이 잘못되었거나 손상되었습니다. 아래 다양한 해법이 있는데 내가 직면한 문제는 VC 6.0 -> VC2010으로 Upgrade 이 후 나타난 문제였다. Manifest 의 ID가 중복으로 지정되게 된다고 하는데 주석처리하라는 답변과 Manifest를 아니오 하라는 답변이 있었다. 이 중 Manifest 를 아니오 선택하는 방법을 선택하였다. 방법 1.프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 방법: 프로젝트 속성 페이지 열기를 참조하십시오. 2.구성 속성 노드를 확장합니다. 3.링커 노드를 확장합니다. 4.매니페스트 파일 속성 페이지를 선택합니다. 5.매니페스트 생성 속성을 수정합니다. 출처: http://msdn.microsoft.com/ko-kr/library/f2c0w594.aspx 그 후에도 실행은 되지 않지만, Manifest Error는 사라진다.... 안되네... 아래는 참조 사이트 해당 문제의 해답은 서비스 팩 업데이트 입니다. 링크 : http://www.microsoft.com/ko-kr/download/details.aspx?id=23691 출처: http://6495ed.tistory.com/10 그 외 2가지 경우의 수가 더 있다. VS2010에서 발생한 현상! MSDN에서의 오류 정의! COFF로 변환하는 동안 오류가 발생했습니다. 파일이 잘못되었거나 손상되었습니다. 개체 또는 리소스를 COFF(Common Object File Format)로 변환하지 못했습니다. 이 도구에서는 모든 입력 파일의 형식이 COFF여야 합니다.입력 파일 형식이 COFF가 아닌 경우에는 LINK가 32비트 OMF 개체를 COFF로 자동 변환하거나 이 도구가 CVTRES.EXE를 실행하여 리소스 파일을 변환합니다. 해결방법!! 3가지가 있는데 조건이 조금씩 다르다. 3가지의 조건이 조금씩 다르다. 1. vc++6.0 에서 vs2010으로 변환시 나오는 문제점 1>LINK : fatal error LNK1123: COFF로 변환하는 동안 오류가 발생했습니다. 파일이 잘못되었거나 손상되었습니다. - 무슨 이유인지 모르나 리소스파일 변환시 ID 중복을 시키는 것 같음. - resource.h 에서 해당 ID(MANIFEST 관련 ID) 주석처리 출처 : http://m.blog.daum.net/oranewbie/9069278 2. vs2010자제적인 문제점 - 속성-> 매니페스트 도구 -> 입력 및 출력 -> 매니페스트 포함 (아니오)로 변환시에 오류 해결 출처 : http://blog.naver.com/coman77/50044865923 3. vs2012를 깔고 vs2010일 경우, .NET Framework 4.5가 깔려있는 경우 vs2012님 께서 .Net Framework 를 4.5로 자동 업데이트 시키는데 이때 VS2010과 .NET 4.5의 호환성이 좋지 않다. 사실 VS2012를 사용하면 되지만 부득이하게 VS2010을 사용할 경우 VS2012 SP1을 깔거나 VS2012 제거 후 .NET4.5를 제거하고 .NET4.0을 설치!! 출처 : http://selky.iptime.org/wordpress/?p=13087 그리고 다른 해결책 VS2003 버전으로 작성된 프로젝트를 VS2005로 변환을 하였다. 몇가지 에러가 발생하면서.. 수정을 하고 있느데.. 아래와 같은 신기한 오류가 발생하였다. CVTRES : fatal error CVT1100: 리소스가 중복되었습니다. 형식:MANIFEST, 이름:1, 언어:0x0409 LINK : fatal error LNK1123: COFF로 변환하는 동안 오류가 발생했습니다. 파일이 잘못되었거나 손상되었습니다. 난생 처음 보는 오류~ 오류 내용을 보면 리소스가 중복되었단다.. 그러나 프로젝트에 특별히 추가한 리소스는 없는 상태였고, 혹시나 하는 생각에 resource.h를 열어 보았다. 역시나 중복되는 것은 없네~ 검색을 좀 해보니.. 역시나 비슷한 경우가 있는데, 딱히 해결책은 별로 없다.. 무슨 manifest 파일을 지우라는 소리에 지웠다가.. manifest 파일이 없다는 소리만 나오고.. 그러다 오류 메세지를 잘 보니.. 중복된게 manifest 파일인거 같다.. 음.. rc 파일을 직접 열어서 살펴보니.. 역시나.. 41번째 줄쯤에 한번 정의 되어 있고.. 3 TEXTINCLUDE BEGIN "CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST ""res\\\\MiniCalendar.exe.manifest""\r\n" "\0" END 끝부분에 또 정의가 되어 있다 ㅋㅋ CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "res\\MiniCalendar.exe.manifest" 느낌상 마지막에 정의된 것을 주석처리 했다.. (아마도 2003에서 2005로 변환중에 발생하는 오류가 아닌가 싶다~ ) 그러니 빌드 성공~ ^^ 출처: http://hanburn.tistory.com/63

[VS2010] strncat_s 함수

출처: http://metalkim.tistory.com/206

[VS2010] 외부 Lib를 Project에 Add하는 방법

edit Additional Dependencies and puts wsock32.lib in it. 추가 종속성을 수정하고 해당 lib를 거기에 넣어라. and also add the path of lib in Link->general-> additional library directories 프로젝트 -> 속성 -> 링크 -> 일반 -> 추가 라이브러리 디렉터리에 해당 폴더를 추가해라. 출처: http://stackoverflow.com/questions/10847076/how-do-i-add-a-lib-file-to-link-in-visual-c-2010

2014년 4월 2일 수요일

[JAVA] HashMap

JAVA 실기 시험을 치게 되었는데

Hashmap 을 응용하는 문제가 나왔다.


개념적인 이해만 하고 있던 녀석이라 직접 보니 막막,, 결국 Arraylist로 풀어 버리고 말아서

오늘 검색을 해보았다.

구글에서 검색하니 상위에 위치한 이 블로그의 글로 배워보고자 한다.]


자바/Java 자바 HashMap 이란?


자바를 사용하면서 HashMap이란 용어를 한번쯤을 들어 보셨을 텐데요. 그 HashMap에 대해서 알아보는 시간을 가져 보겠습니다. HashMap이란 Map인터페이스의 한종류로써 Key와 Value 값으로 데이터를 저장하는 형태를 가지고 있습니다.

그러면 가만, Map이란 녀석을 무엇일까요? Map이란 놈은 키(Key) , 값(Value) 을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스들을 구현하는 데 사용 되는 녀석 입니다. 쉽게 말해 key, value 값으로 저장하는 List 형태의 조상이라고 생각 하시면 됩니다.

Map에 종류에는 Hashtable, HashMap, LinkedHashMap, SortedMap, TreeMap 등이 있습니다. 역시 이들 객체들 또한 key, value로 데이터를 저장하게 됩니다. 그 중에서 오늘은 HashMap에 대해서 다뤄 볼껀데요. HashMap또한 Map인터페이스를 구현한 녀석이기 때문에 Map의 속성을 모두 가지고 있고, 저장 방식 또한 동일 합니다. 그리고 해싱(hashing)이란 검색 방법을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보여줍니다.

HashMap에서 한가지 주의 하실 점이 map에 데이터를 등록할 때 , key값은 중복이 되지 않고 , value값은 중복이 허용된다는 점입니다. 예를들어,

map.put("호랑이" , "힘90")
map.put("여우" , "힘90")
map.put("호랑이" , "힘80")
(최종 호랑이 key에 저장된 value는 "힘80"으로 나중에 입력된 key의 value로 덮어 씌어 집니다.)
 


이런형태로 key 값이 중복 되어선 안된다는 점입니다. 하지만 value값 ("힘90")은 중복을 허용 합니다. 다시말해 key값을 컬렉션 내의 유일한 key여야 하고, value값은 같은 값이 여러개가 있어도 상관없다는 말입니다.


그러면 HashMap의 기본적인 사용방법을 알아보겠습니다.
TestHashMap 
.java 파일 




public class TestHashMap {

public static void main(String[] args) {
                   // HashMap에 Data 넣기 (Key , Value) 형태  
HashMap<String , Integer> map = new HashMap<String , Integer>();
map.put("김태희", new Integer(90));
map.put("전혜빈", new Integer(80));
map.put("유인나", new Integer(100));
map.put("아이유", new Integer(90));
  // HashMap에 포함된 Key 중에 "유인나"라는 키를 가질 경우 true 리턴 (없을 경우 false) 
if(map.containsKey("유인나")){
System.out.println("유인나 최고");
}
 // HashMap에 포함된 Key , Value를 Set에 담고 iterator에 값을 Set 정보를 담아 준다.  
Set<Entry<String, Integer>> set = map.entrySet();
Iterator<Entry<String, Integer>> it = set.iterator();
 // HashMap에 포함된 key, value 값을 호출 한다. 
while (it.hasNext()) {
Map.Entry<String, Integer> e = (Map.Entry<String, Integer>)it.next();
System.out.println("이름 : " + e.getKey() + ", 점수 : " + e.getValue());
}
 // Map에서 저장된 Key들을 가져올 Set을 만든다.  
Set<String> set2 = map.keySet();
System.out.println("참가자 명단 : " + set2);
// Map에 저장된 value값들 Collection<Interger> 형태로 얻어 오고 iterator에 담는다.    Iterator<Integer> it2;
Collection<Integer> values = map.values();
it2 = values.iterator();
int total = 0;
while (it2.hasNext()) {
Integer i = (Integer)it2.next();
total += i.intValue();
}

 
// 결과 출력  
System.out.println("총점 : " + total);
System.out.println("평균 : " + (float)total/set.size());
System.out.println("최고점수 : " + Collections.max(values));
System.out.println("최저점수 : " + Collections.min(values));
}
}
 





결과 화면


유인나 최고
이름 : 김태희, 점수 : 90
이름 : 유인나, 점수 : 100
이름 : 아이유, 점수 : 90
이름 : 전혜빈, 점수 : 80
참가자 명단 : [김태희, 유인나, 아이유, 전혜빈]
총점 : 360
평균 : 90.0
최고점수 : 100
최저점수 : 80


 


기본적으로 사용 방법 이러한 방식 입니다. 원하는 Set을 가져온후 iterator를 사용해서 List를 출력하는 방식 입니다. iterator는 Collection에 포함된 객체들에 접근할 수 있는 인터페이스라고 생각 하시면 됩니다. 보통 map에서 사용하는 entrySet() 이나 keySet() 메서드는 반환타입이 Set인 데이터들을 반환해 주는데요.

Set이라는 인터페이스는 Collection인터페이스를 구현한 클래스이기 때문에, iterator를 사용해서 접근 할수 있는 것 입니다. 아래는 HashMap 의 생성자와 메서드 정리 표 입니다.

생성자/메서드설명
HashMap()HashMap 객체를 생성한다.
HashMap(int initialCapacity)지정된 값을 초기용량으로 하는 HashMap 객체 생성한다.
HashMap(int initialCapacity , float loadFactor)지정된 값을 초기용량과 load factor의 HashMap 객체 생성한다.
HashMap(Map m)주어진 Map에 저장된 모든 요소를 포함하는 MashMap 을 생성한다.
void clear()HashMap에 저장된 모든 객체를 제거한다.
Object clone()현재 HashMap을 복제하여 반환한다.
boolean containsKey(Object key)HashMap에 지정된 키(key)가 포함되어 있는지 알려준다. (포함되어 있으면 true)
boolean containsValue(Object key)HashMap에 지정된 값(value)가 포함되어 있는지 확인한다. (포함되어 있으면 true)  
Set entrySet()HashMap에 저장된 키와 값을 엔트리(키와 값의 결합)의 형태로 Set에 저장하여 반환한다.
Object get(Object key)지정된 키(Key)의 값(객체)을 반환한다.
boolean isEmpty()HashMap이 비어 있는지 확인한다.
Set keySet()HashMap에 저장된 모든 키가 저장된 Set을 반환 한다.
Object put(Object key, Object value)HashMap에 키와 값을 저장 한다.
void putAll(Map m)Map에 해당하는 모든 요소를 HashMap에 저장 한다.
Object remove(Object key)HashMap에서 지정된 키로 저장된 값(객체)를 제거한다.
int size()HashMap에 저장된 요소의 개수를 반환한다.
Collection values()HashMap에 저장된 모든 값을 컬렉션 형태로 반환한다.

 // HashMap에 포함된 Key , Value를 Set에 담고 iterator에 값을 Set 정보를 담아 준다.  
Set<Entry<String, Integer>> set = map.entrySet();
Iterator<Entry<String, Integer>> it = set.iterator();
 // HashMap에 포함된 key, value 값을 호출 한다. 
while (it.hasNext()) {
Map.Entry<String, Integer> e = (Map.Entry<String, Integer>)it.next();
System.out.println("이름 : " + e.getKey() + ", 점수 : " + e.getValue());
}
 // Map에서 저장된 Key들을 가져올 Set을 만든다.  
Set<String> set2 = map.keySet();
System.out.println("참가자 명단 : " + set2);
// Map에 저장된 value값들 Collection<Interger> 형태로 얻어 오고 iterator에 담는다.    Iterator<Integer> it2;
Collection<Integer> values = map.values();
it2 = values.iterator();
int total = 0;
while (it2.hasNext()) {
Integer i = (Integer)it2.next();
total += i.intValue();
}

내가 시험 중에 막혔던 부분은 이 부분이다. 이 부분을 알고 갔더라면 하는 아쉬움이 남는다.

위를 보니 Set<Entry<String,Integer>> 로 Set을 정의 하는데 Set에 대해서도 공부가 필요해 보인다.

위에 쓰인 Entry가 생소한 개념이라 공부가 필요하네요.

Set을 이용해 Map의 정보를 가져온 다음 그 Set을 Iterator를 이용해서 검색을 하게 되네요.

자바를 잘하려면 Iterator 사용이 필수적이겠네요.

자바 공부 시작하려니 어렵네요.

좋은 정보 감사합니다.



[JAVA] JDK와 JRE의 차이

코딩을 해도 기본적인 개념이 부족하다고 느끼게 된다.

JDK는 SDK와 비슷하게 Java Development Kit으로 Java 개발을 해줄 수 있게 해주는 Tool이다

그에 비해 JRE는 Java Runtime Environment로 Java를 실행할 수 있는 환경을 만들어 주는 것이다.

한글과 컴퓨터로 생각 한다면

한글과 컴퓨터 자체가 JDK 이고 한글과 컴퓨터 Viewer를 JRE로 생각하면 되겠다..

2014년 2월 19일 수요일

[XML] XML내의 특수 문자를 사용하게 해주는 문법

IBSheet는 기본적으로 MSXML을 사용하고 있습니다.

XML의 데이터 영역(PCDATA)에 특수문자를 사용하면 XML 오류가 발생합니다.
이때 특수 문자를 처리하는 방법은 두가지가 있습니다.

특수문자를 변환문자(이스케이프문자)로 변환하는 방법과 CDATA Section을 이용하는 방법입니다.

1. 변환문자(이스케이프문자)를 사용하는 방법
아래 변환문자는 게시판 표시 관계상 글자 사이 공백을 두었습니다.
& -> &amp;
< -> &lt;
> -> &gt;
위 3가지 외에도 MSXML 2.0 이전에서는 아래 두문자도 같이 바꿔야 합니다.
' -> &apos;
" -> &quot;
예) 
XML : <TD>사장 &amp; 사원</TD>
결과 : 사장 & 사원

2. CDATA Section을 이용하는 방법
예) 
XML : <TD><![CDATA[사장 & 사원]]></TD>
결과 : 사장 & 사원

두가지 방법 모두 사용할수 있으나 IBSheet는 두번째 방법을 권장합니다.
첫번째 방법은 조회된 데이터 하나에 대해서 적어도 3번의 replace 조작이 필요하므로 그것보다는 특수문자를 그대로 사용하는 CDATA section 쪽이 조회속도를 더 빠르게 할수 있습니다.

출처: http://202psj.tistory.com/581

[XML] XML 형식으로 엑셀 파일 불러오기

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook
  xmlns:x="urn:schemas-microsoft-com:office:excel"
  xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">

<Styles>
 <Style ss:ID="Default" ss:Name="Normal">
  <Alignment ss:Vertical="Bottom"/>
  <Borders/>
  <Font/>
  <Interior/>
  <NumberFormat/>
  <Protection/>
 </Style>
 <Style ss:ID="s27">
  <Font x:Family="Swiss" ss:Color="#0000FF" ss:Bold="1"/>
 </Style>
 <Style ss:ID="s21">
  <NumberFormat ss:Format="yyyy\-mm\-dd"/>
 </Style>
 <Style ss:ID="s22">
  <NumberFormat ss:Format="yyyy\-mm\-dd\ hh:mm:ss"/>
 </Style>
 <Style ss:ID="s23">
  <NumberFormat ss:Format="hh:mm:ss"/>
 </Style>
</Styles>

 <Worksheet ss:Name="Sheet1">
  <ss:Table>
   <ss:Row>
    <ss:Cell  ss:StyleID="s27"><Data ss:Type="String">PID</Data></ss:Cell>
    <ss:Cell  ss:StyleID="s27"><Data ss:Type="String">JIRA_ID</Data></ss:Cell>
    <ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
<ss:Cell  ss:StyleID="s27"><Data ss:Type="String">Filepath</Data></ss:Cell>
   </ss:Row>
   <ss:Row>
    <ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
   </ss:Row>
   <ss:Row>
    <ss:Cell><Data ss:Type="Number">9300073</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-42</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String"></Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
   </ss:Row>
   <ss:Row>
    <ss:Cell><Data ss:Type="Number">9300159</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-41</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String"></Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">NCFTEST-40</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">코리아
df</Data></ss:Cell>
<ss:Cell><Data ss:Type="Number">9276614</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">2014-02-05 오후 12:23:37</Data></ss:Cell>
    <ss:Cell><Data ss:Type="String">N/A</Data></ss:Cell>
   </ss:Row>
  </ss:Table>
 </Worksheet>
</Workbook>

위 양식대로 작성을 하고 excel.xml 등 .xml 확장자 명으로 저장하면

위 내용이 excel 형식으로 나타나게 됩니다.