프로젝트를 복사하는 방법


1. 복사하려는 프로젝트 디렉토리를 통째로 복사, 붙여넣기 한다

(경로상 같은 디렉토리에 위치시켜야 작업이 수월)



2. 복사한 디렉토리의 이름을 적절하게 변경

3. 복사한 디렉토리 안의 AAAA.csproj(위에서는 ConsoleApplication1.csproj) 의 이름을 적절하게 변경

(보통 2번과 3번의 이름을 같게 하죠?)


4. 솔루션을 열어, 복사한 프로젝트 추가 (솔루션 우클릭, 추가, 존재하는 프로젝트)



추가된 모습


5. 완료!!



* 하지만 새로 추가된 프로젝트가 소스컨트롤(저는 VSTS를 사용중입니다.[현재는 Azure DevOps로 이름이 바뀜]) 에 추가 불가능한 상태

보통 새로운 파일을 추가하면 아래처럼 V표시 또는 +표시가 나타나야 하는데,, 기존 프로젝트를 복사해서 만들어 그런건지, 소스컨트롤이 인식을 못한다.


* 해결법

File - Source Control - Advanced - Change Source Control 클릭해서 확인해보면 새로 추가한 프로젝트만 Invalid 상태인 것을 확인할 수 있다!!


1. 창 상단에 보이는 Unbind 버튼을 눌러 바인드를 해제한다


2. 솔루션 탐색기 창에서 바인드 해제한 프로젝트 우클릭 - Source Control - Add Selected Projects to Source Control

(아래 캡쳐는 대략적인 메뉴 위치를 설명하기 위한거라 이름이 다름..)


3. 정상적으로 추가된걸 확인할수있다!!(+ 표시가 보인다)

이제 체크인 하면 저장소에 반영됨!!







* Deep copy(깊은 복사)란?

Swallow copy(얕은 복사) 와 대비되는 개념으로 객체의 참조를 복사하는 것이 아니고 객체 자체를 복사한다!!


* 어떻게 하냐?

- List의 ConvertAll<T> 메서드를 활용

- String type 리스트(List<string>)의 경우 (string은 immutable 타입이기 때문에 아래와 같이 해도 된다!)

var deepList = list.ConvertAll(s => s);


- Custom object 리스트(List<TestObject>)의 경우

var deepList = list.ConvertAll(o => new TestObject(o.TestValue));



* 예제

class Program
{
    private class TestObject
    {
        public TestObject(int value)
        {
            TestValue = value;
        }
        public int TestValue { get; set; }
    }

    static void Main(string[] args)
    {
        var obj1 = new TestObject(1);
        var obj2 = new TestObject(2);

        var list = new List<TestObject>();
        list.Add(obj1);
        list.Add(obj2);

        // Swallow copy
        TestObject[] swallowArray = new TestObject[2];
        list.CopyTo(swallowArray);

        // Deep copy
        var deepList = list.ConvertAll(o => new TestObject(o.TestValue));

        list[0].TestValue = 99999;

        for (int i = 0; i < list.Count; i++)
        {
            Console.WriteLine($"Original list [{i}] : TestValue {list[i].TestValue}");
        }

        for (int i = 0; i < swallowArray.Length; i++)
        {
            Console.WriteLine($"Swallow Copy [{i}] : TestValue {swallowArray[i].TestValue}");
        }

        for (int i = 0; i < deepList.Count; i++)
        {
            Console.WriteLine($"Deep Copy [{i}] : TestValue {deepList[i].TestValue}");
        }
    }
}


* 결과



* 다른 방법!

다음과 같이 Serialization(직렬화) 를 이용하여 깊은 복사를 수행하는 방법도 있다!! (이 방법이 더 유용할듯)

public static T DeepCopy<T>(T obj)
{
    using (var stream = new MemoryStream())
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(stream, obj);
        stream.Position = 0;

        return (T)formatter.Deserialize(stream);
    }
}





코드 작성시 사용하는 유용한 툴 하나 소개합니다.


이름은.. CodeAlignment!!


이름 그대로, 코드를 정렬해주는 툴인데요,

저는 이런저런 변수 선언시, 특히 상수나 문자열 값들을 보기 좋게 정렬하는 데 사용합니다.


* 설치하기

Visual Studio - 도구 - 확장 프로그램 - "CodeAlignment" 검색

(왼쪽 항목에서 [Online] 항목을 선택한 후 검색해 주세요)


Download 버튼을 클릭하면 아래와 같이 워런티 관련(노 워런티!) 창이 뜨는데, Install 버튼을 눌러주면 설치가 완료됩니다



인스톨 후 비주얼 스튜디오를 반드시 재시작 해야한다는 점 참고하세요!! (빨간 네모 표시)


재시작 후, 툴바에 아래와 같은 아이콘들이 생긴다면 설치가 정상적으로 된것!!




* 사용하기

아래와 같이 여러 개의 변수를 선언해놓았는데, 비주얼 스튜디오의 일반 정렬 방법은 예쁘지 않죠

정렬해주고 싶은 영역을 선택 후, 저는 "=" 문자 기준으로 정렬해 보겠습니다.

= 버튼(빨간 네모 표시) 을 클릭해 줍니다.


짠! 클릭 한번으로 각 변수들이 보기 좋게 정렬이 됐습니다.


굉장히 쉽고 유용한 툴인데요, "=" 문자 기준 정렬 말고도 다른 정렬 방법도 가능합니다, 자세한 사항은 웹사이트에서 확인해 보세요

http://www.codealignment.com/


* 단축키

Most of the shortcuts will require a manual step by you. You'll have to remove the key bindings from Ctrl =.

라고 써있네요, 기존에 [컨트롤] + [=] 키가 매핑이 되어 있다면 제거해야 한다는 얘기!


 Align by... (Dialog)

 Ctrl + Shift + =

 Align by position... (Dialog)

 Ctrl + =, Ctrl + Backspace

 Align by Equals

 Ctrl + =, Ctrl + =

 Align by m_

 Ctrl + =, Ctrl + m

 Align by "

 Ctrl + =, Ctrl + '

 Align by .

 Ctrl + =, Ctrl + .

 Align by Space

 Ctrl + =, Ctrl + Space


(영문판 기준) Tools > Options > Environment > Keyboard. 항목에서 "AlignBy" 로 검색하면 단축키 변경 가능합니다.

+ Recent posts