CLOSE SEARCH
POSTS TAGGED WITH: C#

C# 배열

배열은 동일한 타입의 변수나 객체의 집합객체이며, 포함된 모든 요소들이 메모리의 연속적인 공간에 할당된다. 배열의 index를 통해 포함된 각 요소에 접근할 수 있다.
C#에서 배열을 지원하는 클래스는 Array 클래스로 형식은 아래와 같다.

public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable

 

– 배열의 선언 및 생성

배열의 요소가 값타입인 경우에는 배열의 생성시에 요소들의 메모리도 할당되지만 참조타입인 경우에는 초기화를 하지 않았다면 각 요소는 null값을 가지고 메모리는 할당되지 않는다.

 

– 배열 초기화

 

– index를 이용해서 각 요소에 접근

 

Delegate in C#

Delegate는 C#에서 함수를 캡슐화하는 기능을 제공한다.

1번~2번 라인은 델리게이트를 선언하는 부분이고 19~20번 라인은 델리게이트 객체를 생성하는 부분이다. 델리게이트 객체를 생성할 때에는 자신의 타입에 맞는 함수를 매개변수로 전달해야 한다. 객체를 생성한 후에는 함수를 호출하는 것과 동일한 방식으로 델리게이트 객체를 호출할 수 있다.

Boxing & Unboxing in C#

Boxing은 값타입을 참조타입으로 변경하는 것이고, 이와 반대로 참조타입을 값타입으로 변경하는 것을 Unboxing이라고 한다.

– Boxing
Boxing은 값타입을 참조타입으로 변경하는 것이므로, 스택에 있는 값을 힙에 새로운 공간을 생성한 후 복사한다. 이 공간을 Box라고 부른다.


– Unboxing
Unboxing은 Boxing된 참조타입을 이전 값 타입으로 다시 변경하는 것으로, 해당 참조가 대상으로 지정한 값타입을 Boxing 한 값인지 확인한 후, 힙에 존재하는 객체의 값을 스택에 있는 값으로 복사한다.


Boxing와  Unboxing을 거치면 결과적으로 메모리에 두개의 메모리가 생성된다. 개념적으로는 동일한 것으로 생각할 수 있지만 전혀 별개의 메모리이다.
또한 객체와 값 변환 사이에 올바른 데이터 타입을 사용해야 하며, 잘못된 데이터 타입을 사요하는 경우 System.InvalidCastException이 발생한다.

클래스의 경우에는 동일한 방색을 적용하는 경우 Upcasing, Downcasting이 발생한다는 점에 유의해야 한다.

 

Upcasting in C#

업케스팅은 하위클래스를 상위클래스의 형식으로 변환하는 것이다. 두 클래스가 상속관계에 있다면 암시적으로 변환된다.

 

아래의 함수와 같이 파라미터를 클래스의 최상위 클래스로 선언하면 Root나 Child, 혹은 그 하위 클래스를 파라미터로 넘길때 자동으로 업케스팅이 발생한다. 즉, 하나의 파라미터 형을 통해 여러가지 형식의 파라미터를 전달할 수 있게 되는 것이다.

 

업캐스팅과 반대의 걔념은 다운캐스팅이며, 업캐스팅된 객체를 원래의 형으로 변경하는 것이다.

Interface in C#

인터페이스는 함수의 프로토타입만을 포함하고 있는 클래스로 하나 이상의 클래스에서 공통적으로 사용하는 기능을 정의할 때 사용한다.

포함된 모든 멤버가 public 추상멤버이므로 객체를 생성할 수 없으며, 클래스와 달리 내부에 필드를 가질 수 없고, 멤버 앞에 public, protected, virtual 등과 같은 키워드를 사용할 수 없다. 또한 클래스의 경우 단일 상속을 원칙으로 하지만 인터페이스는 다중 상속이 가능하다.

 

일반적으로 인터페이스의 이름은 I<InterfaceName> 형식을 사용하는 것이 관례이다.

클래스에서 인터페이스를 구현하고자 한다면 상속과 유사하게 : 뒤에 인터페이스의 이름을 나열한다.

연산자 오버로딩

연산자 오버로딩은 하나의 연산자의 다수의 기능을 정의하는 기술이다.

연산자 오버로딩은 반드시 public static 형식을 가져야 한다.

 

 

 

C#에서의 포인터 사용

C#에서는 가비지 컬렉터를 통해 기본적인 메모리 관리를 해주기 때문에 포인터를 사용하지 않는 것이 좋다.

그렇지만 C#내에서 C나 C++로 구현된 코드를 사용해야 하는 경우에는 어쩔 수 없이 포인터를 사용해야 된다. C#에서는 사용자가 직접 메모리를 조작하는 것에 대해 안정성을 보장하지 않는다. 그래서 포인터를 사용하는 코드를 unsafe 코드라고 한다.  unsafe 키워드는 함수나 블럭에 적용할 수 있다.

– unsafe 함수

– unsafe 블록

힙 영역에 있는 메모리는 가비지 컬렉터에 의해 관리 되기 때문에 해제되는 시점을 정확히 할 수 없고, 또한 언제라도 조각모음을 통해 메모리의 위치가 변경될 수도 있다. 그렇게 때문에 힙 영역에 있는 메모리의 주소를 조작하는 것은 안전하지 못하다.

부득이하게 주소를 조작해야 하는 경우 가비지 컬렉터가 메모리의 위치를 변경하지 못하도록 지정해야 하는데 C#에서는 fixed 키워드를 통해 이런 기능을 제공한다. 이 키워드는 unsafe 블록 내부에서만 사용할 수 있다.

Property in C#

속성(Property)은 클래스의 private 멤버에 접근하는 Get함수와 Set함수의 구현을 일반화해 주는 기능으로 Smart Field라고도 한다.
구현 방식은 아래와 같다.

일반적인 Getter/Setter와 동일한 기능을 하며 set의 경우 value라는 키워드를 통해 기본 매개변수를 지원한다. 즉 value는 외부로부터 들어오는 값을 set으로 전달하는 역할을 한다.
반드시 get과 set을 모두 구현해야 하는 것은 아니며 읽기 전용 속성을 구현하고자 하는 경우에는 get만 구현하면 된다.

속성의 이름의 경우 일반적으로 멤버 이름과 동일하되 대문자로 시작하는 것이 관례이지만, 반드시 지켜야 하는 것은 아니다.

Enum in C#

열거형 상수의 값은 0부터 1씩 증가하면서 초기화된다. 그러므로 black은 실제로 0 값을, blue는 3 값을 가진다.

특정 열거형 상수를 원하는 값으로 초기화 하려면 아래와 같은 코드를 작성한다.

red의 오른쪽에 있는 상수들은 10을 기준으로 1씩 증가되는 값으로 초기화된다.

 

열거형은 정수형 자료형에서만 사용할 수 있다.