C#/.NET(16): new 연산자
new 는 언제나 신기하다.
JAVA를 처음 접했을 때, new 연산자를 정말 신기하게 사용했던 기억이 있다. C#에서도 볼 수 있어 금방 적응해서 사용할 수 있을 것 같지만… 이것도 연구해보니 처음 사용해보는 유형이 있어 적응이 필요할 것 같다.
new 가 사용되는 경우
- 경우1: 인스턴스를 생성하는 경우
- 경우2: 상속받은 클래스에서 상속한 클래스의 메소드를 명시적으로 은닉해야하는 경우(*이번에 다루지 않음)
- 경우3: 제네릭 클래스의 형식 인수가 매개 변수가 없는 constructor를 가져야만 하는 경우
[경우1 - 예시 코드]
using System;
using System.Collections.Generic;
namespace NewOperator
{
class People
{
public string Name;
public People(string name)
{
Name = name;
}
}
internal class Program
{
static void Main(string[] args)
{
var obj1 = new People("이동규"); // var로 class 인스턴스 생성
People obj2 = new People("네이버"); // People로 class 인스턴스 생성
var animal = new Dictionary<int, string>(); // var로 dictionary 인스턴스 생성
animal[1] = "one";
animal[2] = "two";
var numbers = new int[] { 1, 2, 3, 4, 5 }; // var로 array 생성
var alphabets = new List<string>(); // var로 list 생성
alphabets.Add("one");
alphabets.Add("two");
Console.WriteLine(obj1.Name);
Console.WriteLine(obj2.Name);
Console.WriteLine($"{animal[1]}, {animal[2]}");
for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine(numbers[i]);
}
for (int j = 0; j < alphabets.Count; j++)
{
Console.WriteLine(alphabets[j]);
}
}
}
}
[경우3 - 예시 코드]
(순서 1)

(순서 2)

(완성 코드)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewOperator
{
public class LazyInitializer<T> where T : new() // 제약자로 추가
{
private T _value;
public T Get()
{
if(_value == null)
{
_value = new T();
}
return _value;
}
}
class Animal
{
public string Name;
public Animal(string name)
{
Name = name;
}
}
internal class Program1
{
static void Main(string[] args)
{
var obj = new Animal("rabbit");
// parameterless 생성자가 없기 때문에 객체 생성 불가
//var lazyInitializerForAnimal = new LazyInitializer<Animal>();
// parameterless 이기 때문에 객체 생성 가능
var lazyInitializerForList = new LazyInitializer<List<int>>();
}
}
}
댓글남기기