[C#] 클래스와 객체 정리

Lumos Velog·2025년 7월 21일
0

클래스

클래스는 데이터와 그 데이터를 조작하는 기능(메서드)을 하나로 묶어 놓은 사용자 정의 참조 타입이다.
클래스는 객체를 만들기 위한 설계도이며, 객체가 가져야 할 속성(필드, 프로퍼티)행동(메서드)을 정의한다.

클래스 자체는 메모리에 할당되지 않는다.
클래스 정의만으로는 아무런 실체가 존재하지 않는다.
실제로 동작하거나 값을 가지기 위해서는 객체(인스턴스)로 생성되어야 한다.

public class Book
{
    // 필드(속성)
    public string title;        // 참조 타입 필드
    public int pageCount;       // 값 타입 필드

    // 메서드(행동)
    public void Read()
    {
        Console.WriteLine("Reading the book...");
    }
}



객체

객체란 클래스를 기반으로 실제 메모리 상에 생성된 실체(Instance)를 의미한다.
객체는 클래스에 정의된 모든 속성과 행동을 실제로 가지며, 각 객체는 서로 독립적으로 동작한다.

Book b1 = new Book();
b1.title = "C# Programming";
b1.pageCount = 300;

Book b2 = new Book();
b2.title = "OOP Principles";
b2.pageCount = 250;

b1.Read();   // 출력: Reading the book...

위의 예시에서 b1과 b2는 Book 클래스의 서로 다른 두 객체이다.
각각의 객체는 독립적인 값을 가지며, 자신만의 상태를 유지한다. C# 에서는 new () 해주게 되면 객체를 생성하는것과 같고 이때 메모리에 할당된다.




필드(Field)와 데이터 타입

클래스의 필드는 객체가 가지는 데이터(속성)를 나타낸다.
필드는 값 타입(Value Type)참조 타입(Reference Type)으로 구분된다.

  • 값 타입 필드
    값 타입은 실제 데이터를 그대로 저장한다.
    대표적으로 int, float, double, bool, char, 구조체(struct) 등이 있다.
    값 타입 필드는 객체가 생성될 때, 그 객체의 메모리 공간 안에 실제 데이터가 저장된다. 값타입은 복사 시 값 자체가 복사된다. 서로 다른 객체의 값 타입 필드는 완전히 독립적이다.
public class Point
{
    public int x;  // 값 타입 필드
    public int y;  // 값 타입 필드
}

Point p1 = new Point();
p1.x = 10;
p1.y = 20;

  • 참조 타입 필드
    참조 타입은 실제 데이터가 아닌, 데이터가 저장된 위치(주소)를 저장한다.
    대표적으로 클래스, 인터페이스, 델리게이트 등이 있다. 복사 시 주소값(참조)이 복사된다. 여러 객체가 같은 참조 타입 데이터(예: 배열, 객체 등)를 참조할 수 있다.
public class Student
{
    public string name;    // 참조 타입 필드
    public int age;        // 값 타입 필드
}

Student s1 = new Student();
s1.name = "Alice";  // "Alice"라는 문자열 데이터의 참조(주소)가 저장됨
s1.age = 21;        // 값 21이 저장됨

name 필드는 string(참조 타입)이므로, 문자열 데이터 자체가 아니라 해당 데이터의 위치 정보(참조)가 저장된다.

age 필드는 값 타입이므로, 숫자 21이 객체 내에 직접 저장된다.




값타입은 객체인가?

  • NET에서 "객체"의 의미
    C#에서 "객체(object)"란, 참조 타입(reference type)을 기반으로 new 키워드 등으로 동적으로 생성된 인스턴스를 지칭하는 것이 일반적이다.
    예를 들어, 클래스(class), 배열(array), 문자열(string), 델리게이트(delegate), 인터페이스(interface) 등은 모두 참조 타입이다.
    참조 타입의 객체는 힙(Heap) 메모리에 저장되며, 변수에는 객체의 "주소(참조)"가 할당된다.
    값 타입은 실제 데이터 값이 직접 저장되는 타입이므로 변수의 메모리 공간에 직접 값이 저장된다.
    일반적으로 값 타입은 별도의 "객체"를 생성하지 않고 변수 자체가 곧 데이터이다.

  • "객체"라는 용어의 혼란
    .NET에서 모든 타입은 System.Object로부터 파생된다.
    따라서, 값 타입 역시 간접적으로는 Object를 상속받는다.
    하지만, "객체"라는 용어를 쓸 때,
    참조 타입은 new로 생성된 명확한 객체(인스턴스)를 의미한다.
    값 타입은 new 없이 변수에 직접 값이 할당되며, 이것을 "객체"라 부르지 않는 것이 일반적이다.

  • 박싱(Boxing)과 언박싱(Unboxing)
    값 타입도 박싱(Boxing)이 일어날 때에는 임시적으로 객체로 취급된다.
    박싱이란, 값 타입의 값을 힙에 저장하여 참조 타입의 객체처럼 사용하는 과정이다.

int x = 100;
object obj = x; // x가 박싱되어 object 객체로 변환됨

즉 값 타입 변수는 박싱될때 객체로 사용되고 흔히 코딩하는과정에서 값타입 변수들은 마치 '객체' 처럼 쓰인다고 보는게 맞다고 생각하면 될것이다.




클래스와 구조체의 차이

클래스와 유사한 개념으로 구조체(struct)가 있다.
구조체는 값 타입이며, 클래스는 참조 타입이다.
따라서, 구조체의 필드들은 복사될 때 값이 통째로 복사된다.
쉽게 볼수 있는 예시는 Vector 등이 있다.




마무리

클래스는 객체를 만들기 위한 설계도이며, 객체는 메모리상에 존재하는 실체이다. 클래스의 필드는 값 타입(실제 데이터 저장)과 참조 타입(데이터 위치 저장)으로 나뉘고 값 타입 필드는 객체의 메모리에 직접 저장되며, 참조 타입 필드는 해당 데이터의 참조(주소)를 저장한다. 값 타입은 복사 시 값 자체가, 참조 타입은 주소(참조)가 복사된다.

  • 클래스: 참조 타입, 설계도
  • 객체: 클래스의 인스턴스, 실체
  • 필드: 객체가 가지는 속성, 값 타입/참조 타입
  • 값 타입 필드: 실제 데이터가 객체에 저장
  • 참조 타입 필드: 데이터의 위치(참조)가 저장

0개의 댓글