[Day 43]


object 는 Object 와 동일한 것으로 모든 클래스의 부모이다. 한 개체를 생성하면 그 개체의 부모인 Object 의 개체도 함께 생성된다.

모든 클래스는 직 간접적으로 object를 상속하게 된다.


중요 Method

GetHashCode()     개체 고유 번호

GetType()            개체 형태

Equals()              같은 개체인가 비교

ToString()            개체에 대한 정보



형변환 에는 캐스팅, 프로모션, 박싱, 언박싱 등이 포함된다.



대체 프로모션 캐스팅 박싱 언박싱이 뭐지.. 한줄씩만이라도 설명을 달아줬으면 이해하기 좋았을텐데 ㅡㅡ

다시금 이 책의 불친절함을 느끼며 구글링한 결과를 첨부.


Promotion, Casting (from : http://movefast.tistory.com/7)


Promotion 자동타입변환

- 프로그램 실행 중에 자동으로 타입 변환이 일어나는 것을 의미.


큰 크기의 타입 ← 작은 크기의 타입    (여기서 크기는 사용하는 메모리 크기를 말함)


byte > short > int > long > float > double 순서 또는 char> int 순서로 자동 타입 변환이 일어난다.



Casting 강제 타입변환

- 큰 데이터 타입을 작은 데이터 타입으로 쪼개어 강제로 저장하는 것을 의미.


큰 크기의 타입 → 작은 크기의 타입


위와 반대의 순서로 강제 타입 변환이 일어난다.


예를 들어,


int i = 271445124;

byte b = (byte) i;


위의 경우 끝의 1 byte만 byte 타입 변수에 담게 된다. 

즉, 변환되어질 데이터보다 큰 것을 강제 타입 변환을 할 때 기존의 값을 보존되지 않는다.


※ 주의 사항


int > float 로 강제 타입 변환을 할 때,


float : 부호(1비트) + 지수(8비트) + 가수(23비트)


로 구성되어 있기 때문에 int 값이 123456780 처럼 가수 23비트로 표현불가능한 숫자일 경우 근사값으로 변환된다.

이 점은 정밀도 손실을 발생시키기 때문에 모든 int 값을 안전하게 실수 타입으로 변환시키려면 double 타입을 사용하는 것이 현명하다.


double : 부호(1비트) + 지수(11비트) + 가수(52비트)


그 이유는 int 값은 4바이트 = 32비트 이므로 double 의 가수 52비트보다 항상 작기 때문에 정밀도 손실없이 변환이 가능하다.


지수, 가수란? (http://thrillfighter.tistory.com/349)



음.. 역시 프로그래밍은 뭔가 철저하구먼



박싱과 언박싱 (from : http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=671)


"박싱 / 언박싱은 성능에 좋지 않습니다"


Boxing 값 형식을 참조 형식으로 변환하는 것


스택에 있는 데이터가 힙으로 복사됨. 박싱은 묵시적으로 일어나며 명시적으로 해도 무방.

값 형식인 정수형 자료 int 를 참조형식인 object 객체로 할당하게 되면 자동으로 박싱이 일어남.


int i = 123;

object o = i;    // Boxing (묵시적 변환)


UnBoxing    참조 형식을 값 형식으로 변환하는 것.


힙에 있는 데이터가 스택으로 복사 됨. 언박싱은 명시적으로 변환해줘야 함.

박싱된 객체를 다시 값 형식으로 변환하면 언박싱이 일어남.


int i = 123;

object o = i


int j = (int) o;    // Unboxing (명시적 변환)


※ Unboxing 은 Boxing 한 객체에 대해서만 가능

※ Unboxing 은 Boxing 하기 전 형식을 준수해야 함.


MSDN 에서는 이 과정에 대한 비용을 다음과 같이 설명하고 있습니다

boxing  unboxing 과정에는 많은 처리 작업이 필요합니다값 형식을 boxing할 때는 완전히 새로운 개체가 
만들어져야 하며이러한 작업에는 할당 작업보다 최대 20배의 시간이 걸립니다. unboxing을 할 때는 캐스팅 
과정에 할당 작업보다 4배의 시간이 걸릴 수 있습니다


언제 왜 사용하는지는 너무 복잡하니 링크 참고.

여기 C# 기초강좌들이 있으니 방문해볼 것. (내 눈엔 기초같이 안보이지만..)

http://www.mkexdev.net/Article/ArticleList.aspx?parentCategoryID=1&categoryID=5



위 사이트에 발췌한 Overloading 과 Overriding 에 대한 글. (책보다 훨씬 이해가 잘되네.. 하하 ^^)


오버로딩, 오버라이딩 그리고 new ( from : http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=190)


Overloading 

C# 오버로딩  기법을 사용하면 동일한 이름의 메서드를 여러개 사용할 수 있다.

C# 컴파일러는 동일한 이름을 가진 두개 이상의 메서드가 있을 경우 이 메서드들의 파라메타들의 정보를 기준으로 메서드를 식별한다.


메서드 시그너처 - 메서드 이름, 파라메타 정보(타입, 개수) 를 말한다. 메서드 시그너처는 클래스 내에서 유일해야 한다.


C# 컴파일러 입장에서는 각기 다른 메서드로 식별되지만, 사용자 입장에서는 동일한 이름으로 접근할 수 있도록해서 편의성을 제공


Overriding

클래스의 상속과 연관이 있다. 부모로부터 상속되어진 메서드를 재정의 할 때 사용하는 기법이다.

부모 클래스에서는 자식 클래스에서 재정의 할 수 있도록 virtual (또는 abstract) 메서드로 정의하고,

자식클래스에서는 이렇게 정의된 가상 메서드를 override (재정의) 하면 된다.


이런 메서드 재정의 기법은 객체지향의 다형성을 가능하게 한다.

동일한 타입의 객체로 서로 다른 일을 할 수 있도록 하는 다형성은 아주 유용한 개념.


New

오버라이딩 처럼 클래스의 상속과 관련이 있고, 부모 클래스에 정의된 메서드를 숨기는 역할을 한다.

new 를 통해서 부모 클래스의 메서드를 새로 정의할 때는 부모 메서드가 virtual 이거나 아니거나 상관이 없다.

부모 클래스의 메소드를 자식 클래스에서 그대로 상속받도록 하지 않고 새로이 정의해서 사용한다고 해석될수 있다.


오버라이딩과 new의 차이점

언뜻 봐서는 별반 달라보이지 않지만, 이 들은 아주 큰 차이점이 있다.

new 는 객체를 생성할 때 자식타입으로 생성해도 부모타입으로 접근하게 되면 여전히 부모 클래스에 정의된 메서드가 호출된다.


하지만 오버라이딩은 부모타입으로 메서드에 접근하더라도 인스턴스가 생성된 자식타입의 메서드가 호출되도록 하여

객체의 다형적인 동작이 가능토록 한다.




[Day 44]


is 키워드를 이용하면 구체적인 타입을 알 수 있다.


example )

if (obj is string) { string tt = (string) obj; }



[Day 45]


as 키워드는 참조 타입에만 사용할 수 있으며, is 와 캐스팅을 합한 키워드이다.

Unboxing 할때는 as 사용 불가.



[Day 46]


ArrayList 는 Array + List로 배열과 비슷하면서 순서대로 저장하고 사용할 수 있는 클래스이다.

네임스페이스는 System.Collections 이다.

Array 는 크기가 고정되어 있지만, ArrayList 는 크기가 유동적이다.

Array 는 Index 를 사용한다. Array m 의 3번째 element는 m[3] 으로 표시한다.

ArrayList 는 3번째 element 를 list[3] 으로 사용하여 Array의 Index를 흉내낸 듯한 Indexer 를 사용한다.


중요 Method

Array list = new ArrayList(10)        기본으로 10개를 저장할수 있도록 선언. Capacity 라고 함.

list.Clear();                                   초기화

list.Add(object o);                         순서대로 저장함

list[i] as XXX;                                list에 저장된 i 번째 element 를 return 한다. indexer라고 하며 array 처럼 사용할수 있다. 저장할 떄 object로 promotion 됨.

list.Reverse();

list.ToArray();

list.Count;

list.IndexOf(object o)

list.Sort();

list.Insert (int index, object o);

list.RemoveRange(int index, int count);



[Day 047]


ArrayList 와 IEnumerator


ArrayList 와 배열은 IEnumerator 인터페이스를 사용하여 크기를 몰라도 사용할 수 있다. System.Collections 네임스페이스에 있다.

IEnumerator 는 iterator pattern 을 적용한 것으로 크기를 몰라도 사용할 수 있다.


예를 들어, 구슬 주머니에 구슬이 몇개 있는지 몰라도 손을 넣어서 잡히는 것이 있으면 꺼내고, 없으면 끝낸다.

'구슬 주머니에 손을 넣고 구슬을 잡는다' 는 MoveNext() 메서드 역할을 하고, '잡힌 구슬을 주머니에서 꺼낸다' 는 Current 프로퍼티 역할을 한다.


중요 Method

ArrayList list = new ArrayList(10);                            ArrayList 나 배열에서 IEnumerator 를 얻는다.

string[] list = {"A", "B", "C", "D"};

IEnumerator iters = list.GetEnumerator();


iters.MoveNext()            남은 것이 있는가?

iters.Current as XXX       남은 것 중 하나를 꺼내의 원래의 참조 타입 모습 (XXX) 으로 as 캐스팅한다.

'Study > Programming' 카테고리의 다른 글

[C# 200제] Day - 5  (0) 2018.01.04
[C# 200제] Day - 4  (0) 2018.01.03
[C# 200제] Day - 3  (2) 2018.01.02
[C# 200제] Day - 2  (0) 2018.01.01
[C# 200제] Day - 1  (0) 2017.12.31

+ Recent posts