클래스는 데이터와 그 데이터를 조작하는 기능(메서드)을 하나로 묶어 놓은 사용자 정의 참조 타입이다.
클래스는 객체를 만들기 위한 설계도이며, 객체가 가져야 할 속성(필드, 프로퍼티)과 행동(메서드)을 정의한다.
클래스 자체는 메모리에 할당되지 않는다.
클래스 정의만으로는 아무런 실체가 존재하지 않는다.
실제로 동작하거나 값을 가지기 위해서는 객체(인스턴스)로 생성되어야 한다.
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 () 해주게 되면 객체를 생성하는것과 같고 이때 메모리에 할당된다.
클래스의 필드는 객체가 가지는 데이터(속성)를 나타낸다.
필드는 값 타입(Value Type)과 참조 타입(Reference Type)으로 구분된다.
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에서 모든 타입은 System.Object로부터 파생된다.
따라서, 값 타입 역시 간접적으로는 Object를 상속받는다.
하지만, "객체"라는 용어를 쓸 때,
참조 타입은 new로 생성된 명확한 객체(인스턴스)를 의미한다.
값 타입은 new 없이 변수에 직접 값이 할당되며, 이것을 "객체"라 부르지 않는 것이 일반적이다.
박싱(Boxing)과 언박싱(Unboxing)
값 타입도 박싱(Boxing)이 일어날 때에는 임시적으로 객체로 취급된다.
박싱이란, 값 타입의 값을 힙에 저장하여 참조 타입의 객체처럼 사용하는 과정이다.
int x = 100;
object obj = x; // x가 박싱되어 object 객체로 변환됨
즉 값 타입 변수는 박싱될때 객체로 사용되고 흔히 코딩하는과정에서 값타입 변수들은 마치 '객체' 처럼 쓰인다고 보는게 맞다고 생각하면 될것이다.
클래스와 유사한 개념으로 구조체(struct)가 있다.
구조체는 값 타입이며, 클래스는 참조 타입이다.
따라서, 구조체의 필드들은 복사될 때 값이 통째로 복사된다.
쉽게 볼수 있는 예시는 Vector 등이 있다.
클래스는 객체를 만들기 위한 설계도이며, 객체는 메모리상에 존재하는 실체이다. 클래스의 필드는 값 타입(실제 데이터 저장)과 참조 타입(데이터 위치 저장)으로 나뉘고 값 타입 필드는 객체의 메모리에 직접 저장되며, 참조 타입 필드는 해당 데이터의 참조(주소)를 저장한다. 값 타입은 복사 시 값 자체가, 참조 타입은 주소(참조)가 복사된다.