Study/.NET (C#, WPF, Unity)

[C#] 문법 공부중입니다

BlueBright 2018. 5. 17. 15:09

.NET Framework : MS에서 제공하는 Windows 프로그램 개발 및 실행환경

 WPF

 Win Forms

 ASP.NET

 

.NET Core : Windows 외의 운영체제가 .NET을 사용할 수 있도록 하는 프로젝트

 UWP

 ASP.NET Core

 

XAMARIN

 iOS, Android, OS X

 

.NET Standard : .NET Framework와 .NET Core의 표준

 

닷넷 구조

 

 

  • using : C언어의 #include와 비슷한 개념

 

  • 세미콜른 : (코드 여러줄 입력하고) 문장의 끝 부분에 붙이면 된다. 특수한 경우에는 세미콜른을 사용하지 않는다.

 

  • 네임스페이스 (namespace) : 성격이나 비슷한 일을 하는 클래스, 구조체, 인터페이스 등을 묶는 역할 (대형마트에서 품목별 물건 분류 같은 것),
    클래수, 구조체, 인터페이스 같은 것들을 구별한다고 생각하면 된다. (예를 들어 메서드 이름이 같을 경우, 네임스페이스를 이용하여 구분할 수 있다.) 
    Java에서는 package와 비슷하다고 생각하면 된다.

    다만, Java에서는 package private (키워드 없음)이라는 접근 제한자가 존재하지만 C#에서는 namespace의 접근을 제한하는 키워드는 없다.

 

  • unsigned : 보통 C에서는 앞에다가 붙이지만, C#에서는  키워드 앞에 u만 붙인다. 다만 byte의 경우 배이스가 부호 없는 정수이고, sbyte 키워드가 부호가 있는 정수
    • 예: uint

 

  • Application Class : 윈도우 응용 프로그램을 시작하고 종료하는 메소드 제공, 윈도우 메시지를 처리

 

  • partial Class : 분할 클래스, 클래스 구현이 길어질 경우 여러 파일에 걸쳐 구현하기 위한 기능. 키워드 partial 을 대상 클래스들 앞에 붙여야 한다.
    • WPF에서 MainWindow 클래스가 디자인과 스크립트 코드가 있는 대표적인 Partial class.
      public partial class MainWindow <- 이런 형식 

 

  • Nullable : 값 형식의 변수에는 선언과 동시에 값 할당이 강제 되는데, 이를 피하기 위해 변수에 할당된 메모리 공간을 비워놓을 수 있게함. (int, float, double 등)
    예) int? abc = null;

 

  • var : 초기화되는 데이터 값에 따라서 컴파일러가 데이터 타입을 자동으로 해석하는 변수. 단, 선언과 동시에 초기화 해야 하며, 지역변수에서만 사용가능하다. (근데 C#은 전역변수를 못 만들게 했다는 설이.......) 
    예) var abc = 5; // abc는 int 형식
    var def = "What the hell"; // def는 string 형식

 

  • goto : 중첩 반복문 탈출에 도움이 된다. 해당 구문을 사용해도 되냐에 대해서는 의견이 분분함.

 

  • params : 가변인자 키워드. 변수 앞에 붙여 쓴다. 변수는 배열형이어야 한다.

 

  • 명명된 매개변수 : 메소드 호출 시 매개 변수의 이름에 근거해서 데이터를 할당

    예)

    static void PrintProfile(String name, string phone)

    {

    Console.WriteLine("Name:{0}, Phone:{1}, name, phone);

    }

     

    static void Main(string[] args)

    {

    PrintProfile(name : "홍길동", phone : "011-098-1234");

    }

    (이 방법은 프로퍼티 개념과 가깝다)

    this.serialPort1 = new SerialPort { 
     PortName = "COM3", 
     BaudRate = 12800, 
     DataBits = (int)8, 
     Parity = Parity.None, 
     StopBits = StopBits.One, 
     ReadTimeout = (int)500, 
     WriteTimeout = (int)500 
     };



  • 선택된 매개변수 : 메소드 선언시 매개변수 값을 초기화하면서 선언하는 방법 
    예)

    void add(int a, int b = 10)

    {

    Console.WriteLine("{0},{1}",a,b);

    }

     

 

  • 소멸자 : 클래스 앞에 ~ 붙이면 된다. 가비지 콜렉터에 의해서만 호출 가능. 가비지 콜렉터의 성능이 좋기 때문에 구현하지 않는 것이 오히려 더 좋다.

 

  • internal : 같은 어셈블리에 있는 코드에 대해서만 public으로 접근가능. 다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을 가짐.
    같은 어셈블리 ≒ 같은 프로젝트라고 생각하면 된다.
    특수한 경우로 한 어셈블리에 InternalsVisibleTo 속성을 지정하여 다른 어셈블리의 접근을 허용하면, 지정된 다른 어셈블리에서도 외부의 internal 클래스를 사용할 수 있다.

 

  • protected internal : 같은 어셈블리에 있는 코드에 대해서만 protected로 접근가능. 다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을 가짐. 같은 어셈블리 ≒ 같은 프로젝트라고 생각하면 된다.

 

 

  • 상속 : 클래스 오른쪽에 콜른(:)을 붙이고 Base 클래스를 쓴다.

 

  • sealed : (밀봉된, 봉인된) 해당 클래스가 상속이 불가능하도록 하는 키워드 class 앞에다 붙임 (JAVA에 final과 비슷한 성격)

 

  • is : 객체가 해당 형식에 해당하는지 검사하여 boolean 형으로 리턴함 (Java에 instance of와 비슷한 성격)

 

  • as : 형식 변환 연산자와 같은 역할.(형변환)  단, 형변환 연산자가 변환에 실패하는 경우 예외를 던지지만 as 연산자는 객체 참조를 null로 만들어 버림.

 

 

 

 

  • 프로퍼티 : getter와 setter를 좀 더 깔끔하게 구현 가능

    <기본>

private string Name{

get{

return name;

}

set{

name = value;

}

}

 

<자동 구현>

 

private string name

{

get; set;

}

 

 

 

 

< XDocument , XmlDocument > 

XmlDocument : .NET 3.0 이하일 경우 사용, classic DOM API

XDocument : LINQ to XML

 

https://stackoverflow.com/q/1542073/7017299

 

 

 

 

< ElementAt() ? [] operator >

  • []
    • IList<T>
    • 인덱서를 이용하기 때문에 cost가 적음
    • .NET 3.5이하 부터 지원하는 기능
  • ElementAt
    • IEnumerable<T>
    • cost가 많기 때문에 가급적 사용을 피하는 것이 좋음.

https://stackoverflow.com/q/5326874/7017299

 

 

 

<ref, in, out>

참조로 값을 전달 (C, C++의 포인터라 생각하면됨)

메서드 내부 인수 전달 전 초기화

인수 전달 후 초기화 또는 쓰기 (수정)

ref OO (반드시 해야함) O (가능)
in OO (반드시 해야함) X (불가능)
out X OO (반드시 해야함)

 

 

< const, readonly >

 

  • const : 컴파일 타임 상수. static을 내포하고 있다.
  • readonly : 런타임 상수. 생성자 단계에서 초기화
    • static readonly : 스태틱 생성자에서 초기화 가능. 클래스 이름으로 접근가능

const는 컴파일 상수기 때문에 변경되면 재컴파일이 필요하다.

따라서 (거의) 고정 불변의 상수(예 : 파이)는 const로 설정하고, 그 이외에는 가능한 readonly를 사용하자

 

 

<Linq>

Linq를 이용하여 클래스에 있는 속성의 (또는 프로퍼티) 값을 변경하는 것은 불가.

다만, 속성 값이 변경된 새로운 객체 (리스트 같은 거)를 새로 생성은 가능

 

예를 들면, "공" 클래스에 대한 리스트를 가지고 있을 때,

리스트 내부의 "공" 클래스의 속성인 "크기"값을 각각 linq를 이용하여 직접 변경은 불가하고

"크기" 값이 변경된 새로운 리스트를 생성하는 것은 된다.

(그런데 다른 방법이 있을지도...)

 

 

 

<Window / Page / UserControl>

  • Windows : 말그대로.. (프로그램) 창 ???
  • Page : Window 내부에 소속. 인터넷 페이지 처럼 생각하면됨. 하나의 Window에 다른 내용을 표시할 때 유용함
  • UserControl : 재사용이 가능한 컴포넌트

 

 

 

< 기본 적으로 세팅해야 할 것 >

 

객체 복사 관련 함수 설정 ICloneable

 

 

 

<Reformat, Refactoring>

  Visual studio에서 클래스를 Refactoring (이름 바꾸기 같은거)를 할 때,

코드 내부를 수정하는 것 보다는 차라리 파일 명을 바꾸는 것이 더 좋다.

  솔루션(sln)파일 또는 프로젝트(proj) 파일 내부에 소스코드 관계도를 파일명으로 설정하기 때문에

파일명을 바꾸게되면 파일명과 관련된 참조 이름도 바꿀 것인지 묻는 대화상자가 같이 뜨게된다.

  "예"를 클릭하면 다른 소스코드에 있는 클래스명도 자동으로 refactoring이 된다.

 

 

 

 

 

< 참고 링크 >

 

https://www.toptal.com/c-sharp/top-10-mistakes-that-c-sharp-programmers-make

http://www.csharpstudy.com/algo/qa.aspx?Id=1&pg=0

https://dobby-the-house-elf.tistory.com/159

www.ikpil.com/1162

stackoverflow.com/q/12206120/7017299

icodebroker.tistory.com/