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)

image-20220702211842766

(순서 2)

image-20220702213642406

(완성 코드)

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>>();
		}
	}
}

태그: ,

카테고리:

업데이트:

댓글남기기