닷넷프로그래밍정복 김상형저 가메출판사

 

2.1 자동구현 프로퍼티

 get, set만 선언하면 프로퍼티로 사용할수 있는 기능이 지원된다. 단 자동구현 프로퍼티는 반드시 get/set 모두 있어야 한다.

ex)

class Human
{
    public string Name { get; set; }
    public int Age { get; set; }
}
namespace Example2
{
    class Program
    {
        static void Main(string[] args)
        {
            Human Lee = new Human();
            Lee.Name = "나영";
            Lee.Age = 18;

            Console.WriteLine("이름은 {0} 나이는 {1}", Lee.Name, Lee.Age);
        }
    }

 

2.2 초기자

객체초기자 - 클래스의 객체를 선언과 동시에 초기화하려면 생성자가 필요하고 생성자에 인수를 전달해야 한다. 객체초기자를 사용하면 생성자가 없어도 외부에서 필드나 프로퍼티에 원하는 값을 대입하여 객체를 초기화할수 있다.

형식 : new 클래스(생성자 인수) { 멤버 = 값, 멤버 = 값};

생성자 인수는 생략할수 있고 {}안에서는 명령문이 아니니까 ";"이 없어야 하나 {}다음엔 반드시 ";"이 와야 한다. 초기자의 대상은 public 이어야 한다.

 

중첩객체초기화 - 다른클래스에 중첩된 객체도 초기자 문법으로 초기화할수 있다.

ex.

class Human

{

public string Name;

public  int Age;

}

class Couple

{

public Human Husband;

public Human Wife;

}

위와 같이 클래스를 선언했을 경우 다음과 같이 초기화를 진행하게 된다.

static void Main()

{

Couple Inko = new Couple();

            Inko.Husband = new Human();
            Inko.Husband.Name = "차인표";
            Inko.Husband.Age = 40;
            Inko.WIfe = new Human();
            Inko.WIfe.Name = "신애라";
            Inko.WIfe.Age = 38;

            Console.WriteLine("남편 : {0}세 {1}, 아내 : {2}세 {3}", Inko.Husband.Name, Inko.Husband.Age,

                Inko.WIfe.Name, Inko.WIfe.Age);

}

 

초기자를 쓴다고 하면

 Couple Inko = new Couple
            {
                Husband = new Human { Name = "차인표", Age = 40 },
                WIfe = new Human { Name = "신애라", Age = 38 }
            };

이런식이 가능하다. 그리고 Couple class를 다음과 같이 선언했다면

class Couple

{

public Human Husband = new Human();

public Humna Wife = new Human();

}

 

Couple Inko = new Couple
            {
                Husband = { Name = "차림표", Age = 40 },
                WIfe = { Name = "신애라", Age = 38 }
            };

처럼 각 Human 타입을 생성하지 않아도 되는 편리함이 생긴다.

 

컬렉션초기자- 컬렉션 초기자를 사용하기 위해서는 ICollection<T> 를 상속받은 객체여야 하고 방법은 배열 초기화와 비슷하다

ex. List<string> ar = new List<string> {"노찬영", " 민혜경", "이단비"};

 

초기자의 혼용 - 객체 초기자와 컬렉션 초기자를 같이 사용할수 있다.

ex

class Bbar

{

public string Name;

public List<string> Idol = new List <string>;

}

 

stastic void Main()

{

var girls = new List<Bbar>

{

new Bbar { Name = "한가인", Idol = {"김동현", "장동건", "이정재" }},

new Bbar { Name = "한예슬", Idol = {"김동현", "비", "박시후" }},

new Bbar { Name = "한은정", Idol = {"김동현", "장근석", "지현우" }}

}

}

 

2.3 익명타입 - 딴 한번만 사용할 타입이라면 굳이 타입을 선언한 후 객체를 생성할 필요가 없으니 타입정의와 객체 생성을 한번에 처리하기 위한 타입.

형식 : var 객체 = new { p1 = v1, p2 = v2};

ex.

var Nam = new { Name = "남상미", Age = 26 };
Console.WriteLine("이름 {0 } 나이는 {1}", Nam.Name, Nam.Age);

익명타입은 주로 메소드 내에서 지역적으로 사용된다. 이름이 없으므로 메서드 바깥으로 전달하거나 컬렉션에 저장한다는가 할수는 없다. 그리고 LINQ에서 유용하다.

 

람다표현식

3.1 확장메소드 - 기존의 클래스는 그대로 유지한태로 메서드를 추가할수 있는 방법을 제공한다. 확장메서드 자체는 별로도 정의되지만 마치 클래스에 원래부터 속해 있는 메서드처럼 호출할수 있다.

확장메서드를 담는 정적클래스는 어디까지나 확장 메서드를 담는 통에 불과하므로 이름은 아무렇게나 붙여도 상관없다. 정적클래스는 외부의 네임스페이스에 선언되어 있어도 무관하다. using문은 네임스페이스 내의 정적 클래스를 모두 검색하여 정의되어 있는 확장 메서드를 자동으로 import한다. 또한 컴파일러는 확장 메서드를 호출할때  import된 모든 확장 메서드를 검색하여 위치를 자동으로 찾아낸다. 사용자가 할일은 확장메서드가 정의된 네임스페이스를 using 선언으로 import하는 것뿐이며 나머지 모든 처리는 컴파일러가 알아서 한다. 확장메서드는 실제로 클래스에 소속된 것이 아니다. 하지만 호출문법이 동일해서 외북에서 보기에는 마치

클래스에 소속된 인스턴스 메소드처럼 보인다. 그래서 기존의 완성된 클래스를 최종 사용자에게 혼란을 주지 않고 확장할수 있는 좋은 방법이다.

ex

public class Integer
{
    public int a;
    public Integer(int aa) { a = aa; }
    public int Add(int b) { return a + b; }
    public int Mul(int b) { return a * b; }
}

public static class IntegerEx
{
    public static int Sub(this Integer l, int b)
    {
        return l.a - b;
    }
}

처름 Integer class에서는 Sub가 구현되어 있지 않았다.

하지만

Integer Num = new Integer(3);
            Console.WriteLine("덧셈 : " + Num.Add(2));
            Console.WriteLine("뺄셈 : " + Num.Sub(2));
            Console.WriteLine("곱셈 : " + Num.Mul(2));

마치 원래 있던 것처럼 사용할수 있다.

 

3.2 람다표현식 > 코드를 별도의 메소드 정의 없이 인라인으로 바로 작성할 수 있는 방법이다. 익명메소드와 유사하지만 세가지가 다르다

  1. 인수 타입을 생략할 수 있다. 생략된 타입은 델리게이트의 타입을 따른다
  2. 본체에 명령문뿐 아니라 표현식도 쓸수 있어 좀 더 짧다
  3. 표현식 트리로도 변환할수 있다

형식 (인수) => 표현식 또는 명령문

ex. 익명 메소드로 표현하면

delegate int dele(int a);

dele d = delegate(int a) { return a + 1 };

람다표현식으로 하면

dele d= a => a + 1;

 

이 글은 스프링노트에서 작성되었습니다.

by 무위자연 2008. 8. 27. 11:39