클래스의 객체 또한 배열로 생성할 수 있다.
하지만 값 타입과 차이점이 있기 때문에 정확하게 짚고 넘어가자.
값 타입 배열을 만들면 메모리가 배열의 선언과 동시에 생성된다.
하지만 객체 배열을 만들면 객체의 이름만 첨자 수 만큼 만들어 질 뿐 객체 자체의 메모리는 생성되지 않는다.
즉 객체의 메모리는 따로 생성해주어야 한다.
using System;
class Animal
{
private String kind;
private String name;
public Animal(String kind, String name)
{
this.kind = kind;
this.name = name;
}
public override string ToString()
{
return kind + " : " + name;
}
}
public class ObjectArrayTest01
{
static void Main()
{
Animal[] a = new Animal[3];
for (int i = 0; i < a.Length; i++)
{
try
{
Console.WriteLine("Animal[" + i + "]:" + a[i] + ", HashCode:" + a[i].GetHashCode());
}
catch (NullReferenceException e)
{
Console.WriteLine(e);
}
}
}
}
Animal 클래스형의 객체 배열을 생성하고, for문을 사용해서 배열 요소들의 해시코드를 출력한다.
이때 NullReferenceException엘에러가 발생한다.
이것은 null 객체를 참조했기 때문에 발생하는 에러이다.
메모리가 생성되지 않은 상태에서 객체를 참조하기 때문이다.
해시코드는 메모리가 생성될 때 객체에 부여되는 32비트 정수값으로 서로 다른 객체는 같은 해시코드를 부여받을 수 없다.
using System;
class Animal
{
private String kind;
private String name;
public Animal(String kind, String name)
{
this.kind = kind;
this.name = name;
}
public override string ToString()
{
return kind + ":" + name;
}
}
public class ObjectArrayTest02
{
static void Main()
{
Animal[] a = new Animal[3];
a[0] = new Animal("개", "진돌이");
a[1] = new Animal("고양이", "나비");
a[2] = new Animal("돼지", "꿀꿀이");
for (int i = 0; i < a.Length; i++)
{
Console.WriteLine("Animal[" + i + "]:" + a[i] + ", HashCode:" + a[i].GetHashCode());
}
}
}
각각의 배열 요소에 new 연산자를 사용해서 객체를 생성하고 해시코드를 출력하였다.
이번에는 에러가 발생하지 않고 각각의 배열요소가 해시콜드를 출력한다.
객체 배열은 같은 클래스 타입의 객체를 여러개 생성할 때 사용한다.
따라서 그 배열 요소들이 하나의 객체이기 때문에 일반 클래스를 생성할 때처럼 new 연산자를 사용해서 메모리를 생성해야 한다.
객체 배열은 배열의 생성과 메모리의 할당이 분리되어 있다
http://blog.naver.com/khagaa/30097427182
반응형
'프로그래밍(Programming) > C#' 카테고리의 다른 글
정적 생성자가 호출되는 시점 (0) | 2015.11.14 |
---|---|
AssemblyInfo.cs (0) | 2015.11.11 |
추상함수(abstract) (0) | 2015.11.11 |
GetHashCode() (0) | 2015.11.11 |
C# Linq 1강 - Linq 맛보기 (0) | 2015.09.10 |