View
System.Object
Equals
int B = 1;
Console.WriteLine("A = B");
비교 대상이 값 형식인지, 아니면 참조형식인지에 따라 비교대상이 달라진다.
참조 형식 -> 할당된 메모리 위치를 가리키는 식별자 값 끼리 비교한다. ( C 에서 포인터주소와 비슷해 보인다 )
값 형식 -> 해당 인스턴스의 값 끼리 비교한다. ( C 에서 변수 값의 비교와 비슷해 보인다 )
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
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
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
{
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;
}
}
{
private int water;
public Americano (int water) : base ( 3 )
{
this.water = water;
}
}