[C#] 8. 클래스 & 복사 생성자

치치·2024년 11월 25일
0

C#

목록 보기
10/16
post-thumbnail

📌 클래스란?

  • 사용자 정의 데이터 유형으로 속성과 함수가 포함되어 있으며, 클래스를 통해 객체를 생성하여 접근하고 사용할 수 있는 집합체
  • 클래스 내부에 있는 변수는 클래스 메모리 영역에 포함
  • 정적 변수와 함수의 메모리는 클래스의 영역에 포함되지 않음
  • 주로 클래스 내부의 멤버변수들은 private 로 해주고 함수를 public 으로 하여 멤버변수에 접근하게 사용
  • 클래스는 참조타입으로 스택영역에 생성된다

ex) GameObject 클래스 생성

class GameObject
{
    int x;
    int y;
    int z;
}
static void Main(string[] args)
{
	GameObject gameObject = new GameObject();
    gameObject. --- 
    
  • ✅ 일반적으로 아무 접근 지정자도 설정하지 않은 경우 private로 되어있음
  • private로 잡혀있기 때문에 gameObject객체를 통해 값으로 접근 불가

📌 여기서 접근 지정자란?

  • 클래스 내부에 포함되어 있는 속성에 접근 범위를 제한하는 지정자

    public : 클래스 내부 데이터를 외부에서도 접근을 허용하는 지정자

    protected : 클래스 내부와 자기가 상속하고 있는 클래스에게만 접근을 허용하는 지정자

    private : 클래스 내부의 데이터를 내부에서만 사용할 수 있게 허용하는 지정자

ex) GameObject 클래스 생성

class GameObject
{
    private int x;
    private int y;
    private int z;
}

static void Main(string[] args)
{
	GameObject gameObject1 = new GameObject();
	GameObject gameObject2 = new GameObject();
	GameObject gameObject3 = new GameObject();
}

📌 클래스 내부에 함수 만들기

class GameObject
{
    private int x;
    private int y;
    private int z;
    
	public void Position(int x, int y, int z)
	{
   	 	this.x = x;
   	 	this.y = y;
   		this.z = z;
	}
  • GameObject 클래스 내부에 Position( ) 함수 생성

📌 this Pointer : 자기 자신을 가리키는 포인터

  • -> 여기서 this.x this.y this.z 는 클래스 내부에 선언한 멤버변수
  • 즉, 맴버 변수를 매개 변수로 들어온 값으로 변경
public void Information()
{
    Console.WriteLine("x의 값 : " + x);
    Console.WriteLine("y의 값 : " + y);
    Console.WriteLine("z의 값 : " + z);

    Console.WriteLine();
}
  • 메인함수
static void Main(string[] args)
{
	 GameObject gameObject1 = new GameObject();
	 GameObject gameObject2 = new GameObject();
	 GameObject gameObject3 = new GameObject();
 
	 gameObject1.Position(5, 5, 5);
	 gameObject2.Position(2, 2, 2);
	 gameObject3.Position(1, 1, 1);
 
	 gameObject1.Information();
	 gameObject2.Information();
	 gameObject3.Information();
}

결과값 :


📌 생성자란?

  • 클래스의 인스턴스(객체)가 생성되는 시점에서 자동으로 호출되는 특수한 멤버 함수
  • 생성자의 경우 객체가 생성될 때 단 한 번만 호출
  • 생성자는 반환형이 존재하지 않기에 생성자가 호출되기 전에는 객체에 대한 메모리 할당 x

생성자 : 접근지정자 + 클래스 이름 ( )

  • Unit 클래스를 생성
  • 메인 함수에서 객체 생성
class Unit
{
    public int health;
    public int attack;

    public Unit() // 생성자
    {
        Console.WriteLine("생성자");
    }
}
static void Main(string[] args)
{
	Unit unit = new Unit();
}

결과값 :


📌 바이트 패딩

  • 멤버 변수를 메모리에서 CPU로 읽을 때 한 번에 읽을 수 있도록 컴파일러가 레지스터의 블록에 맞추어 바이트를 패딩해주는 최적화 작업
  • 클래스의 크기 : 클래스 구성하는 멤버 변수 중 크기가 가장 큰 자료형의 배수가 되도록 정렬

ex) Vitamin 클래스 생성

class Vitamin
{
    private float b6;
    private float c;
    private double d;
}

  • 가장 큰 자료형은 double = 8 byte
  • 이 클래스의 크기는 4 byte + 4 byte + 8 byte 로 16 byte임

  • 🔒 하지만 double 자료형이 중간에 있는 경우는 ❓❓❓
class Vitamin
{
    private float b6;
    private double d;
    private float c;
}

  • 바이트 패딩까지 합하여 24 byte가 됨
  • 한번에 읽는 크기는 가장 큰 자료형 만큼

✅ 클래스에 멤버 변수를 선언하는 경우 : 작은 자료형부터 큰 자료형 순으로 선언하기!


📌 복사 생성자란?

  • 같은 객체를 복사하여 생성시킬 때 호출되는 생성자
  • ✅ 복사 생성자를 정의하지 않고 객체를 복사하면 -> 기본 복사 생성자가 호출 -> 얕은 복사로 객체가 복사됨

ex) Unit 클래스 생성

  • Unit 생성자와 Unit(Unit clone) 복사생성자
class Unit
{
    public int health;
    public int attack;

    public Unit() // 생성자
    {
        Console.WriteLine("생성자");
    }
	
    // 복사 생성자 정의
    public Unit(Unit clone)
    {
        Console.WriteLine("복사 생성자");
    }
}
  • marine1은 기본 생성자를 호출
  • marine2는 복사 생성자를 호출
  • marine2 = new Unit(marine1) -> Unit클래스의 Unit clone 매개변수에 marine1이 복사되어 들어온 것

  • marine1 객체를 통해 클래스의 멤버 변수에 값 할당
  • marine2 객체에 marine1 값 복사해서 넣을 수 있음
// 생성자
 Unit marine1 = new Unit();
 
 // 복사 생성자
 Unit marine2 = new Unit(marine1);
 
 marine1.health = 10;
 marine1.attack = 50;
 
 marine2.health = marine1.health;
 marine2.attack = marine1.attack;
 
 Console.WriteLine("marine2의 health 값: " + marine2.health);
 Console.WriteLine("marine2의 attack 값: " + marine2.attack);

결과값 :


(2024.11.25.월요일)

profile
뉴비 개발자

0개의 댓글