Queenut 2021. 12. 3. 00:21

 

 * Object 클래스

 : 모든 클래스의 기본이 되는 클래스. 모든 클래스는 object를 상속받는다.

 

- 박스화: 값형의 데이터를 객체형의 변수에 대입하는 것. object 클래스에는 참조형뿐만 아니라 값형의 데이터도 대입할 수 있다.

 

- 박스화 해제: 반대로 값형에 object형의 데이터를 대입하는 것. 형을 명확하게 하기 위해 형 변환 사용.

 

C#이 보이는 그림책 p171. b를 박스화한 후 박스화를 해제하고 값을 c에 대입했다.

 

 

 * 네임스페이스 (namespace)

 : 클래스나 구조체의 그룹. 참조는 '.'.

 만약 다른 네임스페이스 중 같은 이름의 클래스나 구조체가 정의되어 있다고 해도, 네임스페이스로 격리되어 있어 경합이 일어나진 않는다.

 네임스페이스 안에 네임스페이스를 만들 수 있다.

 

p173.

 

 * 시스템 (system)

 : 항상 using 뒤에 붙언 system. 이것은 system 네임스페이스를 말한다.

 많은 메소드가 시스템 안에 존재한다. ex) Console 클래스.

 

→ using

 : 뒤에 지정한 네임스페이스를 이용한다는 것을 선언한다. 프로그램 맨 앞이나 네임스페이스 블록 맨 앞에 명시한다.

사실 Console.WriteLine() 은 System.Console.WriteLine() 이 맞지만 맨 앞에 using system 이 붙기 때문에 시스템을 생략한다.

 네임스페이스명이 길어져서 사용하기 곤란할 때 별명을 붙일 수 있다.

 

p175. 오탈자(?)가 두 개나 있었다..

 

 

 * var (형 추론)

 : int나 string 대신 사용하면 형을 지정하지 않고 변수 선언이나 객체 생성을 할 수 있다.

 (C#이 컴파일 시 추측)

var x1 = 10;           // int 형이 된다.
var x2 = 10.0;         // double 형이 된다.
var str = "candy";    // string 형이 된다.

초기화하는 우변 값으로 형을 추측해서 변수 형을 결정한다. 때문에 추측할 우변이 없다면 오류가 난다.

 

var로 배열을 선언할 수 있다.

var animals = new [] { "cat", "bird", "dog" };

  // 이 둘은 같은 의미이다.

string [] animals = new string [] { "cat", "bird" , "dog" };

 

 

 * dynamic

 : 실행 시 동적으로 형이 결정되는 변수를 선언할 수 있다.

var와 다른 점은 var는 컴파일할 때 형이 결정되고, dynamic은 실행될 때 결정된단 점이다.

dynamic x;           //먼저 키워드로 변수를 선언한다.
if (DeteTime.Now.Second % 2 == 1)
{
       x = 1;          //int형이 됨.
}
else
{
       x = "제로";   //string형이 됨.
}

 

 

 * ExpandoObject

 : dynamic 과 사용하면 동적으로 멤버를 추가할 수 있는 오브젝트를 만들 수 있다.

p179. dynamic과 ExpendoObject

 

 

 

 * 확장 메소드

 : 상속하지 않고도 기존 클래스에 메소드를 추가할 수 있게 한다.

 

p180-181. 확장메소드

 

 

 

 * 객체 초기화자

초기화할 수 있는 것은 public 등의 수식자가 붙은 액세스 가능한 필드 와 속성

 

 

 * 익명 형

 : 이름 없는 클래스를 만들 수 있다.

var myanimal = new { age = 10, name = "tama" };

다만, 익명 형으로 만들어진 속성은 읽을수만 있다. 다음과 같이 값을 설정( myanimal.age = 20; )하면 에러가 난다.

 

 

 

 * 식 형식 멤버. ( => )

 : 메소드 본체가 식 하나뿐일 때, { } 대신 =>로 간단하게 사용할 수 있다.

class Animal
{
       public string name;
       public void print()
       {
             Console.WriteLine("이름 : " + name);
       }
}

    // 이 둘은 같다.

class Animal
{
       public string name;
       public void print() => Console.WriteLine("이름:" + name);
}



값을 반환하는 메소드의 경우,

class Calc
{
       public int Add(int a, int b);
       {
             return a + b;
       }
}

    // 이 둘은 같다.

class Calc2
{
       public int Add(int a, int b) => a+b;
}

return은 기술하지 않는다.

 

 

 

속성의 경우도 사용할 수 있다.

class Animal
{
       string name;
       public string name
       {
             get
             {
                   return name;
             }
             set
             {
             name = value;
             }
       }
}

    // 이 둘은 같다.

class Animal
{
       string name;
       public string name;
       {
             get => name;
             set => name = value;
       }
}

 

 

 

 * 예제 프로그램

 : 곤충을 기본 클래스로 두고 나비와 메뚜기를 파생 클래스로 만든다. 성장과정은 기본 클래스에서 정의하고 구체적인 방법을 상속 클래스에서 정의한다.

 

p186-187. 예제 프로그램.

 

 

 

 * is 와 as

 : 참조형을 대상으로 한 연산자.

 

 - is

 : 지정한 데이터형과 식의 형이 일치하는 경우 true 반환, 다를 경우 false 반환.

int a = 36;
string b = "책갈피";
Console.WriteLine(a is double);
Console.WriteLine(b is string);

결과: False
        True

파생 클래스의 객체를 기본 클래스에서 평가한 경우도 true가 나온다.

기본 클래스의 객체더라도 파생 클래스의 객체에 대해 참조가 저장되어 있다면 파생 클래스의 형을 비교대상으로 한다.

 

 - as

 : 지정한 데이터 형으로 변환한다.

 형 변환과 같지만 차이점은, 반환할 수 없을 때 형 변환은 오류를 반환하는데, as는 null을 반환한다.