View

상속 (2)

sm_amoled 2019. 1. 2. 15:58
300x250


System.Object

Equals

값을 비교하여 Boolean 값을 반환하는 메서드.

int A = 0;
int B = 1;

if(A.Equals(B))                  True/False를 반환한다.
    Console.WriteLine("A = B");
        

비교 대상이 값 형식인지, 아니면 참조형식인지에 따라 비교대상이 달라진다.


참조 형식 -> 할당된 메모리 위치를 가리키는 식별자 값 끼리 비교한다. ( C 에서 포인터주소와 비슷해 보인다 )

값 형식 -> 해당 인스턴스의 끼리 비교한다. ( C 에서 변수 값의 비교와 비슷해 보인다 )


GetHashCode

특정 인스턴스의 4 byte int 식별자를 가져오는 메서드. ( 주민등록번호, 식별자는 인스턴스가 할당된 메모리의 위치를 가리킨다 )
GetHashCode와 Equals 메서드는 서로 연관된 메서드 -> Equals 메서드를 재정의할때는 GetHashCode 메서도 또한 재정의가 필요하다.

참조 형식-> 내용이 똑같더라도 다른 식별값을 반환한다.
값 형식-> 인스턴스에 저장된 값이 같으면 같은 식별값을 반환한다.


'4 byte int' 라는 크기의 한계로 중복되는 식별자가 배정될 수도 있다.


using System;

namespace CsharpStudy
{
   
class MainClass
    {
       
static void Main(string[] args)
        {
           
short numb1 = 245;
           
short numb2 = 32750;
           
short numb3 = 245;

           
Console.WriteLine(numb1.GetHashCode());
           
Console.WriteLine(numb2.GetHashCode());
           
Console.WriteLine(numb3.GetHashCode());

           
Book book1 = new Book(12345);
           
Book book2 = new Book(12345);

           
Console.WriteLine(book1.GetHashCode());
           
Console.WriteLine(book2.GetHashCode());
        }
    }

   
class Book
    {
       
int numb;

       
public Book(int Numb)
        {
            numb = Numb;
        }
    }
}


[결과]


16056565        <- 

2146336750

16056565        <- 같은 값이 저장된 값 형식은 같은 식별자 값을 가진다.

739731549

679893951       <- 같은 값이 저장된 참조 형식은 다른 식별자 값을 가진다.


System.Array

모든 배열은 System.Array로부터 상속을 받아, System.Array의 속성과 메서드를 이용할 수 있다.

[속성]
arr.Rank     : 차원 수 ( demension ) 를 반환
arr.Length  : 요소 수 ( element ) 를 반환

[인스턴스 메서드]
arr.GetValue ( i ) : i 번째 인덱스의 배열 요소의 값을 반환

[정적 메서드]
Array.Sort ( arr ) : 배열 요소의 값을 순서대로 정렬
Array.Copy ( orig_arr, copied_arr, Length ) : 배열의 내용을 다른 배열로 복사

using System;

namespace CsharpStudy
{
   
class MainClass
    {
       
private static void OutputArrayInfo(Array arr)
        {
           
Console.WriteLine("배열의 차원 : " + arr.Rank);
           
Console.WriteLine("배열의 요소 : " + arr.Length);
           
Console.WriteLine();
        }

       
private static void OutputArrayElements(string title, Array arr)
        {
           
Console.WriteLine("[" + title + "]");

           
for (int i = 0; i < arr.Length; i++)
            {
               
Console.Write(arr.GetValue(i) + ", ");
            }

           
Console.WriteLine();
           
Console.WriteLine();
        }

       
static void Main(string[] args)
        {
           
bool[,] boolArray = new bool[,] { { true, false }, { false, false } };
            OutputArrayInfo(boolArray);

           
int[] intArray = new int[] { 5, 4, 3, 2, 1, 0 };
            OutputArrayInfo(intArray);

            OutputArrayElements(
"원본 intArray", intArray);
           
Array.Sort(intArray);
            OutputArrayElements(
"Array.Sort intArray", intArray);

           
int[] copyArray = new int[intArray.Length];
           
Array.Copy(intArray, copyArray, intArray.Length);

            OutputArrayElements(
"intArray로부터 복사된 copyArray", copyArray);
        }
    }
}


배열의 차원 수 : 2

배열의 요소 수 : 4


배열의 차원 수 : 1

배열의 요소 수 : 6


[원본 intArray]

5, 4, 3, 2, 1, 0, 


[Array.Sort 후 intArray]

0, 1, 2, 3, 4, 5, 


[intArray로부터 복사된 copyArray]

0, 1, 2, 3, 4, 5, 



this

클래스 내부 코드에서 객체 자기자신을 가리키는 방법
자기 클래스에서 인스턴스 멤버를 호출할 때 this.field 또는 this.method 의 방법으로 호출할 수 있다.

class A
{
int numb;

public void Method(int numb)
{
    this.numb = numb;
}
}

이와 같은 방법으로 매개변수와 멤버변수 구분을 위해 사용할 수도 있다.


인스턴스 멤버 ( new ) 에는 this를 사용할 수 있지만, 정적 멤버 ( static ) 에는 this를 사용할 수 없다. ( this는 자기 객체를 가리켜 인스턴스 멤버를 호출하는 예약어이나, 정적멤버는 하나만 존재하는 인스턴스 외부의 멤버이므로 불가능하다고 생각된다 )



[참고사항]


인스턴스 메서드는 해당객체를 가리키는 인스턴스 변수를 C#컴파일러가 자동으로 인자로 전달한다. 


coffee.Offer();            

    

이 문장이 자동으로 다음 문장으로 바뀌어 컴파일 된다.


coffee.Offer(coffee);



public class Coffee
{
    public void Offer() 
    { 
        ...
    }

이 메서드 선언문은 자동으로 인자가 추가되어 컴파일 된다.

    public void Offer(Coffee this) 
    { 
        ...
    }
}


base

자기자신의 클래스 인스턴스를 가리키는 this 와 달리, base 예약어는 부모 클래스를 명시적으로 가리킨다.
부모 클래스의 멤버를 사용할 때 base가 생략된 상태로 사용해도 컴파일러가 찾아서 지정해주기에 멤버 사용에는 지장이 없다..

private으로 선언된 필드를 생성자에서 초기화시키는 부모 class가 있다고 가정할 때, 자식 클래스를 생성할 때는 부모 클래스의 생성자도 함께 호출될 것이다. 
이때, 자식 클래스는 private 으로 선언된 부모멤버를 초기화 할 수 없으므로 에러가 발생한다.

        public class Coffee
        {
            private int shots;

            public Coffee(int shots)
            {
                this.shots = shots;
            }
        }

        public class Americano : Coffee    <- 에러 발생 ( 정식 매개 변수 shots에 해당하는 제공된 인수가 없다 )
        {
            private int water;

            public Americano (int water)    
            {
                this.water = water;
            }
        }


-> 자식의 생성자는 자식클래스만 담당하고, 부모 클래스는 부모의 생성자가 담당하면 에러가 나지 않을 것이다.

        public class Americano : Coffee
        {
            private int water;

            public Americano (int water) : base ( 3 )    
            {
                this.water = water;
            }
        }
부모의 생성자가 필요로 하는 인수를 자식 생성자에서 전달해주어 부모 클래스는 부모의 생성자가 담당하게 만들 수 있다. 








320x100

'Develop > C# 과 객체지향' 카테고리의 다른 글

타입 확장 (1)  (1) 2019.01.07
다형성  (0) 2019.01.04
상속 (1)  (0) 2019.01.01
캡슐화  (0) 2018.12.30
클래스  (0) 2018.12.29
Share Link
reply
반응형
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31