안녕하세요

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


페이지 목록

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로 생각하면 되겠다..