기본적인 틀이 있는 템플릿을 소개한 웹페이지를 공유합니다.


시간 단축 많이 할 수 있겠죠?


https://code.tutsplus.com/articles/15-best-android-app-templates-of-2017--cms-29643

프로젝트를 복사하는 방법


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. 정상적으로 추가된걸 확인할수있다!!(+ 표시가 보인다)

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







여기가 옵션도 많이 제공하고(모든 사이즈 아이콘 생성), 심플하고 빠르다.

https://icoconvert.com/


완성된 아이콘은 여기서 확인

https://redketchup.io/icon-editor

* 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);
    }
}





+ Recent posts