전체 코드

using System.ComponentModel;
using System.Numerics;
using System.Threading;

namespace CSharp
{
    // 참조

    class Knight
    {
        public int hp;
        public int attack;

        // 생성자
        // 반환형 없음 void도 안됨
        // 클래스 이름과 같음
        public Knight()
        {
            hp = 100;
            attack = 10;
            Console.WriteLine("생성자 호출");
        }
        // 생성자도 여러가지 버전이 있음 생성자 오버로딩
        public Knight(int hp) :this() // 생성자가 호출 할경우 빈 생성자를 호출한다. 자기자신의 기본 생성자를 호출한다.
        {
            // 자기 자신의 hp라는 것을 표현하고 싶다의 의미
            this.hp = hp;
            Console.WriteLine("int 생성자 호출");
        }

        public Knight(int hp, int attack) : this()
        {
            this.hp = hp;
            this.attack = attack;
        }

        public void Move()
        {
            Console.WriteLine("Knight Move");
        }
        public void Attack()
        {
            Console.WriteLine("Knight Attack");
        }
       
    }

    
    internal class Program
    {
        
        static void Main(string[] args)
        {
            Knight knight = new Knight(50,5);
            
        }

    }
}

1. 생성자란?

  • 객체가 생성될 때 자동으로 호출되는 특별한 메서드
  • 클래스 이름과 동일해야 하며, 리턴 타입이 없음
  • 멤버 변수(필드)를 원하는 값으로 초기화하는 역할을 함
  • 생성자는 여러 개 정의할 수 있으며(오버로딩), this() 키워드를 사용하여 기본 생성자를 호출할 수 있음

2. 생성자 코드 예제

`` 클래스의 생성자 오버로딩 예제

using System;

class Knight
{
    public int hp;
    public int attack;

    // 기본 생성자 (매개변수 없음)
    public Knight()
    {
        hp = 100;
        attack = 10;
        Console.WriteLine("기본 생성자 호출");
    }

    // 매개변수 하나를 받는 생성자
    public Knight(int hp) : this() // 기본 생성자 호출 후 실행됨
    {
        this.hp = hp;
        Console.WriteLine("int 매개변수 생성자 호출");
    }

    // 매개변수 두 개를 받는 생성자
    public Knight(int hp, int attack)
    {
        this.hp = hp;
        this.attack = attack;
        Console.WriteLine("int, int 매개변수 생성자 호출");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Knight knight1 = new Knight();       // 기본 생성자 호출
        Knight knight2 = new Knight(50);     // hp만 설정, attack은 기본값(10)
        Knight knight3 = new Knight(50, 20); // hp와 attack 모두 설정
    }
}

📝 생성자 호출 순서

  • Knight knight1 = new Knight();hp = 100, attack = 10
  • Knight knight2 = new Knight(50); → 기본 생성자를 호출한 후 hp = 50, attack = 10
  • Knight knight3 = new Knight(50, 20);hp = 50, attack = 20

3. 생성자의 주요 특징

✅ 생성자의 역할

  • 객체가 생성될 때 초기 상태를 설정
  • 객체의 멤버 변수(필드)를 원하는 값으로 설정
  • 코드 중복을 줄이기 위해 ``를 사용하여 기본 생성자를 호출

✅ 생성자의 규칙

생성자 유형설명
기본 생성자매개변수가 없으며, 기본 값을 설정함
매개변수 생성자매개변수를 받아 객체를 초기화함
this() 호출기존 생성자를 재사용하여 코드 중복을 줄임
오버로딩여러 개의 생성자를 정의할 수 있음

`` 키워드 사용법

public Knight(int hp) : this() // 기본 생성자를 호출한 후 실행됨
{
    this.hp = hp;
}
  • this()를 사용하면 현재 클래스의 다른 생성자를 호출할 수 있음
  • 코드 중복을 방지하고, 기본 설정을 유지하면서 일부 값만 변경 가능

4. 생성자의 활용

🛠 깊은 복사(Deep Copy) 구현 예제

public class Knight
{
    public int hp;
    public int attack;

    public Knight()
    {
        hp = 100;
        attack = 10;
    }

    // 복사 생성자 (깊은 복사)
    public Knight(Knight other)
    {
        this.hp = other.hp;
        this.attack = other.attack;
    }
}

깊은 복사(Deep Copy): 새 객체를 생성하고, 원본 객체의 값을 복사함 → 두 객체는 독립적


profile
李家네_공부방

0개의 댓글