object 타입과 var 키워드와의 비교
C#은 강력한 정적 타입 언어로, 변수의 타입을 엄격하게 정의합니다. 그러나 코드의 유연성과 간결성을 높이기 위해 object
와 var
키워드를 제공합니다.
이 두 키워드는 얼핏 보면 다양한 타입을 추상적으로 사용한다는 점에서 비슷해 보일 수 있으나, 실제로는 서로 다른 목적과 사용 방법을 가지고 있습니다.
object
키워드
object
는 C#의 모든 타입의 최상위 기본 클래스입니다.
모든 데이터 타입은 object
로부터 상속받으며, 이를 통해 다양한 데이터 타입을 유연하게 다룰 수 있습니다.
1
2
object number = 10; // number는 실제로 int 타입의 값을 가리키는 최상위 클래스 object 입니다.
object text = "Hello"; // text는 실제로 string 타입의 값을 가리키는 최상위 클래스 object 입니다.
- 유연성:
object
타입을 사용하면 하나의 변수에 다양한 타입의 값을 할당할 수 있습니다. - 다형성:
object
타입은 다형성을 지원하여, 메소드의 매개변수나 리턴 타입으로 사용할 수 있습니다.
즉, 상속을 통해 다양한 타입을 담을 수 있도록 만든 class
이기 때문에 다형성을 사용할 수 있습니다.
예를 들어, 두 객체가 같은지 여부를 확인하는 Equals(object obj)
라던가, 객체를 문자열로 반환하는 ToString()
등을 오버라이딩해 사용할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class MyClass
{
public int Value;
public string Name;
// Value만 비교해서 같으면 True를 리턴하도록 한다.
public override bool Equals(object? obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
return this.Value == ((MyClass)obj).Value;
}
}
internal class Program
{
static void Main(string[] args)
{
MyClass myClass1 = new MyClass();
myClass1.Value = 1;
myClass1.Name = "MyClass1";
MyClass myClass2 = new MyClass();
myClass2.Value = 1;
myClass2.Name = "MyClass2";
Console.WriteLine(myClass1.Equals(myClass2)); // True
}
}
object
타입과 var
키워드의 차이
object
와 var
는 서로 다른 용도로 사용되며, 여러 가지 차이점이 있습니다.
var
키워드 컴파일 시점에 초기화 표현식의 타입을 기반으로 컴파일러가 변수의 타입을 추론하는 타입 추론 키워드입니다.
반면, object
는 모든 타입의 최상위 기본 클래스로, 변수에 어떤 타입의 값이라도 할당할 수 있으며, 추상화 하여 사용할 수 있습니다.
var 키워드 글 보러가기
타입 추론과 상속
타입 추론 (var)
var
키워드는 변수 선언 시 컴파일러가 변수의 타입을 자동으로 추론합니다.
이 변수는 초기화 시점에 타입이 명확해야 하며, 한 번 결정된 타입은 변경할 수 없습니다.
1
2
var number = 10; // 컴파일러가 number의 타입을 int로 추론
var text = "Hello"; // 컴파일러가 text의 타입을 string으로 추론
- 정적 타이핑:
var
는 여전히 정적 타입으로, 변수의 타입이 컴파일 시점에 결정되며, 이후 변경할 수 없습니다. - 간결성: 코드의 가독성을 높이고, 반복적인 타입 선언을 줄여줍니다.
- 제한사항:
var
는 초기화 시점에서 타입이 명확해야 하며, 재할당 시 동일 타입의 값만 사용할 수 있습니다.
상속 (object)
object
타입은 모든 타입의 최상위 클래스입니다.
이는 모든 데이터 타입이 object
로부터 상속받기 때문에, object
변수에 어떤 타입의 값이라도 할당할 수 있습니다.
다만, 값 타입과 참조 타입의 형태에 따라 메모리의 변수를 복사하는 등의 박싱과 언박싱이 발생할 수 있습니다.
(박싱과 언박싱이 발생하면 성능적인 오버헤드가 발생할 수 있으므로, 불필요한 박싱과 언박싱은 피하는 것이 좋습니다.)
1
2
object number = 10; // int 값 할당
object text = "Hello"; // string 값 할당
- 유연성: 다양한 타입을 하나의 변수로 다룰 수 있습니다.
- 다형성: 메소드 인자나 리턴 타입으로 사용할 때 유용합니다.
- 박싱과 언박싱: 값 타입을
object
에 할당하면 박싱이 발생하고, 다시 언박싱해야 실제 타입으로 사용할 수 있습니다.
정리
C#에서 object
와 var
는 모두 타입을 추상적으로 사용할 수 있도록 하지만, 각각 다른 목적과 특성을 가지고 있습니다.
object
는 다형성을 지원하고 다양한 타입을 다룰 수 있는 유연성을 제공하지만, 박싱과 언박싱의 오버헤드가 있습니다.
반면, var
는 타입 추론을 통해 코드의 간결성을 높이며, 정적 타입의 유지를 보장합니다.
두 키워드 모두 다양한 타입을 지원하는 키워드라고 생각하고 아무렇게나 사용하는 것 보다는, 상황에 맞게 적절하게 사용하는 것이 좋습니다.