1. 객체를 제대로 만드는 방법
C#에서 new 연산자는 마법 버튼 같은 거야. 이걸 누르면 도면(우리 클래스)이 진짜 인스턴스(객체)로 바뀌어서 쓸 수 있게 돼. 쉽게 말하면: 클래스는 무엇을 할 수 있고 어떤 속성이 있는지 정해주고, new는 그 객체를 컴퓨터 메모리에 만들어 주는 거지.
new 연산자 없이 클래스는 그냥 건물 없는 설계도야: 구경만 할 수 있고, 토론만 할 수 있지, 뛰어다니거나 알칸타라 소파에 차를 쏟을 순 없어.
클래스가 피자 레시피라면, new 연산자는 그 레시피로 진짜 맛있는 피자를 만들어주는 요리사야. 객체는 그 결과물: 박스에 담긴 피자, 이제 먹을 수 있지.
문법
이 강력한 new를 어떻게 쓰는지 보자. 예를 들어 Contact라는 클래스가 있다고 해보자:
Contact cont = new Contact();
- Contact 왼쪽은 우리가 만드는 변수 타입이야.
- cont는 변수 이름 (나중에 디버깅할 때 고생 안 하려면 의미 있게 짓자).
- new Contact() — new 연산자를 호출해서 Contact 타입 객체를 만드는 거야.
메모리에서
이 코드를 실행하면, 운영체제가 새 객체를 위한 메모리 공간을 예약하고, 그 객체가 "사는" 주소(참조)를 돌려줘. 이 참조가 cont 변수에 저장되는 거지.
도식
+------------------+ +--------------------+
| 변수 cont | ---------> | Contact 객체 |
+------------------+ +--------------------+
|
| (이름, 전화번호, 이메일 등 포함)
|
주소
2. 연락처 객체 만들기
이전 예제에서 이런 클래스를 만들었어:
public class Contact
{
public string Name;
public string Phone;
public string Email;
}
이제 Contact 타입의 새 객체를 만들어보자:
Contact friend = new Contact();
friend.Name = "이반 이바노프";
friend.Phone = "+1-999-123-45-67";
friend.Email = "ivan@example.com";
Console.WriteLine($"이름: {friend.Name}, 전화번호: {friend.Phone}, 이메일: {friend.Email}");
여기서 무슨 일이 일어나냐면:
- new Contact()로 객체를 만든다.
- 필드에 값을 넣는다.
- 데이터를 화면에 출력한다.
예시 2:
여러 연락처를 다뤄보자 — 객체 하나 더 만들어보자:
Contact boss = new Contact();
boss.Name = "아나스타시아 세르게예브나";
boss.Phone = "+1-888-765-43-21";
boss.Email = "nastya@company.com";
Console.WriteLine($"상사: {boss.Name}, 전화번호: {boss.Phone}");
마치 각 친구마다 설문지를 채우는 것 같지 않아? 객체가 딱 그래: 만들어진 각 인스턴스는 자기만의 값을 갖고, 다른 객체와는 따로 저장돼!
3. 객체 배열 사용하기
연락처가 한두 개가 아니라 열 개쯤 필요하다면, 배열에 담는 게 합리적이지:
Contact[] contacts = new Contact[3]; // 3개 객체용 배열
contacts[0] = new Contact();
contacts[0].Name = "데니스";
contacts[0].Phone = "+7-911-111-22-33";
contacts[1] = new Contact();
contacts[1].Name = "마리야";
contacts[1].Phone = "+7-915-123-45-67";
contacts[2] = new Contact();
contacts[2].Name = "표트르";
contacts[2].Phone = "+7-921-543-21-00";
// 모두 화면에 출력
for (int i = 0; i < contacts.Length; i++)
{
Console.WriteLine($"연락처 {i+1}: {contacts[i].Name}, {contacts[i].Phone}");
}
중요: 배열의 각 요소마다 new를 써야 해! 배열을 만든다고 객체까지 만들어지는 건 아니고, 참조를 위한 공간만 준비되는 거야.
4. new 연산자와 기본값
가끔 이런 질문이 있어 — Contact 타입 변수를 선언만 하고 new로 객체를 할당하지 않으면 어떻게 될까?
Contact someContact;
someContact.Name = "오류"; // 컴파일 오류!
만약 이렇게 쓴다면:
Contact someContact = null;
그리고 someContact.Name에 접근하려고 하면, 프로그램이 유명한 예외와 함께 "터져" 버릴 거야:
System.NullReferenceException: 객체 참조가 객체 인스턴스를 가리키지 않습니다.
이런 걸 피하려면, 항상 new로 객체를 초기화한 다음에 써야 해.
5. 생성자 호출
new Contact()를 쓰면, 그 순간 특별한 메서드 — 생성자가 호출돼. 지금 우리 클래스에는 생성자가 따로 없으니까, 기본(디폴트) 생성자가 자동으로 호출돼서 객체를 만들고, 모든 필드는 기본값(null은 참조형, 숫자는 0)으로 채워져.
다음 강의에서 직접 생성자를 만들어서, 이름이나 전화번호를 바로 넘기는 방법을 배울 거야. 지금은 파라미터 없는 생성자만 쓸 수 있어.
실생활 예시
new 연산자로 객체를 다루는 건 모든 C# 개발자의 일상이지. 예를 들어:
- 사이트에서 유저를 만들면 — 코드에 User 객체가 새로 생겨.
- 쇼핑몰에서 주문을 열면 — Order 객체가 생겨.
- 책 정보를 입력하면 — Book 객체가 만들어져.
요즘 C# 프로그램에는 new 연산자가 들어간 코드가 수천 줄씩 있어.
객체 만들기 전의 메모리
Contact firstContact; // 변수지만 아무것도 가리키지 않음
+--------------------------+
| firstContact |----> null (아무것도 아님!)
+--------------------------+
객체 만든 후
Contact firstContact = new Contact();
+--------------------------+ +----------------------+
| firstContact |---------------->| Contact 객체 |
+--------------------------+ +----------------------+
6. 실전 예제
예를 들어, 사용자가 키보드로 새 연락처를 만들 수 있게 하고 싶다고 해보자:
Console.WriteLine("이름을 입력하세요:");
string name = Console.ReadLine();
Console.WriteLine("전화번호를 입력하세요:");
string phone = Console.ReadLine();
Contact newContact = new Contact();
newContact.Name = name;
newContact.Phone = phone;
Console.WriteLine($"저장된 연락처: {newContact.Name}, {newContact.Phone}");
이제 사용자가 입력할 때마다 메모리에 자기만의 객체가 만들어져서, 저장하거나, 수정하거나, 출력하거나 — 뭐든 할 수 있어!
7. 흔한 실수와 웃긴 함정
실수 1: 객체를 쓰기 전에 new를 안 썼다.
변수를 선언만 하고 초기화하지 않으면, 컴파일 오류나 NullReferenceException이 뜰 수 있어. 이건 고전이지: 객체를 선언했다면, 진짜 필요하다면 바로 new로 만들어줘.
실수 2: 객체 배열을 만들었는데, 객체 자체는 안 만들었다.
흔한 함정: Contact[] 배열을 만들었는데, 그 안에는 null만 들어있어. contacts[0].Name에 접근하면 터진다. 먼저 각 배열 요소를 따로 초기화해야 해: contacts[i] = new Contact();.
실수 3: 메서드랑 속성을 헷갈렸다.
초보자들은 가끔 메서드를 필드처럼 쓰려고 해: student.GetName 이렇게 쓰고, student.GetName() 대신에. 바로 결과를 쓰지 않으면 괜찮지만, 값을 기대하는 곳에 "메서드"를 넣으면 컴파일러가 화낸다. 항상 확인하자: 메서드는 괄호가 있어야 해, 파라미터가 없어도!
GO TO FULL VERSION