메인페이지 . 바뀐페이지 .

\cat StudyMaterial

참여자: HuidaeCho, uskusi

C# 자료형

값타입(Value Type)
참조타입(Reference Type)
.NET의 변수명 짓기
변수명으로 사용할 수 없는 예약어
Object, 모든 것이 객체이다.
토론

값타입(Value Type)

C#에는 다음과 같은 값타입(Value Type)의 단순타입(Simple Type) 자료형이 있다.

위에서 설명한 자료형을 이용해서 Hello World를 변형해 보자.

/* Console.WriteLine() 메서드가 정의된 네임스페이스를 사용하겠다고 정의한다.
 * Hello World에서 System.Console.WriteLine()으로 호출했던 메서드를
 * Console.WriteLine()으로 호출할 수 있다. */
using System;

class HelloData{
	public static void Main(){
		decimal d = 123.4m;
		bool b = true;

		// 문자열과 변수를 +로 합칠 수 있다.
		Console.WriteLine("d의 값은 "+d+"이고 b는 "+b+"이다.");

		short i = 32767;
		short j = i;
		/* 소스코드에 직접 써넣는 정수는 int형으로 취급된다.  따라서
		 * i+1은 short에서 int로 캐스팅되어 short의 범위를 넘어선 양의
		 * 정수가 출력된다. 하지만 ++ 연산이나 다시 short 변수로
		 * 대입되는 경우 short의 범위를 넘으면 반대측 경계값으로
		 * 침범한다. */
		Console.WriteLine("i의 값은 "+i+"이고 i+1은 "+(i+1)+"이지만 ++j의 값은 "+(++j)+"이다.");
	}
}

위 프로그램을 컴파일하고 실행하면 다음과 같은 출력을 볼 수 있다.

d의 값은 123.4이고 b는 True이다.
i의 값은 32767이고 i+1은 32768이지만 ++j의 값은 -32768이다.

단순타입의 변수들을 묶어서 하나의 사용자 변수타입을 만들 수 있는데 이를 구조체라고 한다.

참조타입(Reference Type)

클래스는 참조타입변수에 해당하며 값타입변수와는 달리 변수의 선언, 메모리의 할당 등을 별도로 수행하게 된다.

string이라는 자료형은 문자열을 표현하는 참조타입(Reference Type) 변수이다.참고 string형은 문자열을 합치는 + 연산자를 정의한다. 큰 따옴표로 묶은 문자열을 사용하며 시작하는 큰 따옴표 바로 앞에 @가 있을 경우 문자열 내에서의 \로 시작하는 Escape Sequence는 해석되지 않는다. 예) string a="abcd\nefg"+@"abcd\nefg"는 다음과 같은 문자열을 a에 할당한다.

abcd
efgabcd\nefg

.NET의 변수명 짓기

클래스, 열거형(enum), 이벤트, 메서드등의 이름은 파스칼케이싱법(Pascal Casing)을 따른다. 대문자로 시작해서 소문자로 이루어진 단어이며 복합명사일 경우 각 단어의 시작을 대문자로 한다. 정규식: ([A-Z][a-z]+)+

메서드의 매개변수명은 카멜케이싱법(Camel Casing)을 따른다. 파스칼케이싱법에서 첫단어의 시작을 소문자로 한다. 정규식: [a-z]+([A-Z][a-z]+)*

변수명으로 사용할 수 없는 예약어

abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit In Int Interface Internal Is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual void while

Object, 모든 것이 객체이다.

C#의 데이타타입을 제대로 알아보기 위해서는 .NET의 CTS에 대해 짚고 넘어갈 필요가 있다.

.NET 프레임워크 안의 모든 언어의 모든 타입은 System.Object 클래스를 상속하여 파생된다.

C#, C++. J# 등의 CLS를 준수하는 언어들의 각 데이타타입은 런타임시 결국 .NET 프레임워크의 데이타타입으로 매핑된다. 우리는 C#을 하고 있으므로 C#의 데이타타입에 매핑되는 .NET 프레임워크의 테이타타입을 표로 만들어보자.

분류C#.NET 프레임워크
정수형sbyteSystem.Sbyte
byteSystem.Byte
shortSystem.Int16
ushortSystem.UInt16
intSystem.Int32
uintSystem.UInt32
longSystem.Int64
ulongSystem.UInt64
문자형charSystem.Char
부동 소수점형floatSystem.Single
doubleSystem.Double
10진형decimalSystem.Decimal
문자열형stringSystem.String
객체형ObjectSystem.Object

결국 C#에서 int a;라고 선언하는 것은 System.Int32 a;와 같다. System.Int32는 모든 데이타타입의 최상위클래스인 System.Object로부터 상속 되었기 때문에 (이 부분은 우리가 BCL을 분석할 만한 실력이 되었을 때 다시 알아보겠습니다. DeleteMe after all members get this) System.Object 클래스의 메서드를 사용할 수 있게 된다.

따라서 예전에 언어에서 생각하기 어려운 것을 할수 있다.(자바스크립트에도 이러한 기능이 있다.)

int a;
a = 8080;
Console.Writeline(a.ToString());

int 형을 string으로 바꾸는 코드이다. int에 의해서 선언된 변수 a는 곧 System.Int32 클래스의 인스턴스이고(구조체이지만 일단은 이렇게 이해하기로 합시다. DeleteMe after all members get this) 부모클래스인 System.Object의 메서드를 이용할 수 있다.

아래는 System.Object 클래스이다.

[Serializable, ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
public class Object
{
    // Methods
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
    public Object();
    public virtual bool Equals(object obj);
    public static bool Equals(object objA, object objB);
    private void FieldGetter(string typeName, string fieldName, ref object val);
    private void FieldSetter(string typeName, string fieldName, object val);
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    protected override void Finalize();
    private FieldInfo GetFieldInfo(string typeName, string fieldName);
    public virtual int GetHashCode();
    [MethodImpl(MethodImplOptions.InternalCall)]
    public extern Type GetType();
    [MethodImpl(MethodImplOptions.InternalCall)]
    internal static extern bool InternalEquals(object objA, object objB);
    [MethodImpl(MethodImplOptions.InternalCall)]
    internal static extern int InternalGetHashCode(object obj);
    [MethodImpl(MethodImplOptions.InternalCall)]
    protected extern object MemberwiseClone();
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    public static bool ReferenceEquals(object objA, object objB);
    public virtual string ToString();
}

클래스 내부를 살펴보면 ToString 메서드 말고도 여러가지 사용 가능한 메서드들이 있다. (ClassLibrary에 정리해 봅시다. DeleteMe after all members get this)

토론

편집 . 바뀐부분 . 역링크 .
2020년 7월 11일 오전 8:26:40 . XHTML 1.1 . CSS 3 . 용쓴다. !
이 사이트의 모든 문서는 크리에이티브 커먼즈 라이센스를 따릅니다.