C 샤프: 두 판 사이의 차이

내용 삭제됨 내용 추가됨
잔글 정리. using AWB
잔글 Priviet(토론)의 편집을 ChongDae의 마지막 판으로 되돌림
8번째 줄:
|설계자 = [[마이크로소프트]]
|개발자 = [[마이크로소프트]]
|형 체계 =
|구현체 = [[마이크로소프트 비주얼 C 샤프|비주얼 C 샤프]], [[닷넷 프레임워크]], [[모노 (소프트웨어)|모노]], [[:en:DotGNU|던GNU]]
|파일 확장자 = .cs
26번째 줄:
<syntaxhighlight lang="CSharp">
using System;
 
namespace HelloWorld
{
줄 38 ⟶ 39:
</syntaxhighlight>
출력 결과
 
Hello, World!
 
* 마이크로소프트에서 필요 프로그램을 무료로 제공하고 있다.<ref>https://www.visualstudio.com/ko/vs/community/ 비주얼 스튜디오 커뮤니티 사이트</ref> 구체적인 프로그램 설치와 학습은 위키 하우(How to Create a Program in C Sharp) <ref>http://www.wikihow.com/Create-a-Program-in-C-Sharp</ref>에 기술되어 있다. 10분 가량 소요된다.
* [[C++]]를 능숙하게 다루는 경우, C#의 전반적인 사용방법을 학습하는데 이틀 가량 소요된다.
줄 44 ⟶ 47:
 
== 언어 특징 ==
 
C#은 닷넷 프로그램이 동작하는 닷넷 플랫폼을 가장 직접적으로 반영하고, 또한 닷넷 플랫폼에 강하게 의존하는 프로그래밍 언어이다. C#은 그 문법적인 특성이 자바와 상당히 유사하며 C#을 통하여 다룰 수 있는 닷넷 플랫폼의 기술들조차도 자바를 염두에 둔 것이 많아서 자바와 가장 많이 비교되고 있다. 하지만 C#은 자바와 달리 불안전 코드(unsafe code)<ref>[http://msdn.microsoft.com/library/en-us/csref/html/vcwlkunsafecodetutorial.asp Unsafe Code Tutorial (C#)<!-- 봇이 따온 제목 -->]</ref>와 같은 기술을 통하여 플랫폼 간 상호 운용성에 상당히 많은 노력을 기울이고 있다. C#의 기본 [[자료형]]은 닷넷의 객체 모델을 따르고 있고, 런타임 차원에서 [[쓰레기 수집 (컴퓨터 과학)|쓰레기 수집]](garbage collection)이 되며 또한 클래스, 인터페이스, 위임, 예외와 같이 객체 지향 언어로서 가져야 할 모든 요소들이 포함되어 있다.
 
== 역사 ==
 
닷넷 프레임워크를 개발하던 시절 [[기본_클래스_라이브러리|클래스 라이브러리]]는 SMC(Simple Managed C)라 불리는 관리 코드(managed code)를 사용했었다.<ref>
{{웹 인용
줄 58 ⟶ 63:
</ref>
1999년 1월, [[아네르스 하일스베르]]가 이끄는 팀이 새로운 언어인 Cool(C-like Object Oriented Language)을 개발했다. 마이크로소프트는 언어의 최종 이름을 Cool로 유지할지도 고려해봤지만 상표 문제로 인해 이뤄지지 않았다. 2000년 7월 PDC에서 닷넷 프로젝트가 발표될 때 즈음 Cool의 이름은 C#으로 정해졌고 클래스 라이브러리와 [[ASP.NET]] 런타임은 C#으로 옮겨갔다.
 
C#은 ISO 소위원회 JTC 1/SC 22에 ISO/IEC 23270:2003으로 제출되었으나 철회 후 ISO/IEC 23270:2006으로 등록되었다.
 
=== 이름 ===
 
C#이라는 이름은 음표를 연주할 때 반음 올리는 것을 표시하는 [[올림표]]에서 따왔다. [[C++]]에서 "++"가 변수의 값을 1 증가시키는 것을 의미하는 것과 비슷하다. 마찬가지로 올림표는 네 개의 "+" 기호와 비슷하므로 C++를 한번 더 증가시켰다는 뜻도 지닌다.
 
기본 글꼴이나 브라우저의 기술적인 한계와 더불어 키보드에는 올림표 기호({{unichar|266F}})가 포함되지 않기에 문서에서는 대체 기호로 [[해시 기호]]({{unichar|0023}})를 사용하며, ECMA-334 C# 언어 사양<ref>
{{서적 인용
줄 74 ⟶ 82:
 
=== 버전 ===
 
{| class="wikitable" style="margin: auto;"
|-
줄 160 ⟶ 169:
 
== 잘 알려진 C# 컴파일러와 개발 도구들 ==
 
* [[마이크로소프트 비주얼 C 샤프|Microsoft Visual C#]]: Microsoft가 C#에 대하여 내리는 모든 표준 정의를 가장 정확하고 안정적으로 반영하는 컴파일러이다. 최근에는 C# 3.0에 포함될 LINQ 확장과 같은 부분에 대한 기술적인 레퍼런스를 미리 테스트해볼 수 있는 도구로도 자주 쓰인다.
 
* [[볼랜드|Borland]]([[코드기어|CodeGear]]) C# Builder: [[코드기어 RAD 스튜디오]](Codegear RAD Studio) 안에서 [[Delphi.net]] 과 [[C 샤프 닷넷|C#.net]] 두 가지 언어로 .net 을 지원한다
 
* Microsoft Rotor 프로젝트: Microsoft .NET Framework가 발표된 후 수 개월 이후에 같이 발표되는 [[오픈 소스]] 프로젝트로 Microsoft 닷넷 플랫폼에 대한 대체 구현을 제공한다.
 
* [[모노 (소프트웨어)|Mono]]: 마이크로소프트 닷넷 플랫폼에 대한 구현이 시작될 무렵에 시작되었으며, 현재는 제3자 닷넷 플랫폼 중에서 가장 안정적이고 성숙되었다고 평가되는 프로젝트이다. 마이크로소프트 닷넷 플랫폼이 윈도우와 소수의 유닉스 플랫폼을 대상으로 하고 있는 것과는 달리 모노 플랫폼의 경우 윈도우보다는 리눅스, 유닉스, 맥 OS X, 솔라리스와 같이 윈도우 외의 운영 체제와 플랫폼을 대상으로 한다. 초기에는 [[지미안]]이 호스팅했으나 현재는 [[노벨 (기업)|노벨]]에서 호스팅하고 있다. 모노 플랫폼을 기반으로 GTK#, 모질라 임베딩, IKVM(Java 바이트 코드를 모노 플랫폼 위에서 에뮬레이션하여 실행하는 VM), COCOA#, Nemerle 언어, MonoDevelop IDE 등의 기술을 지원한다. 또한 마이크로소프트 닷넷 플랫폼과 서로 호환이 가능하다. 현재는 리눅스 배포판들 사이에서 공식적으로 채택되고 있을 정도로 리눅스 환경에서는 대중적인 닷넷 플랫폼 구현이 되었다.
 
* DotGNU Project: 모노와 비슷한 시기에 개발을 시작하였지만 아직 안정적인 버전이 출시되지 못하였다. 특유의 Portable .NET 엔진을 사용하고 있다.
 
줄 169 ⟶ 183:
{{정리 필요 문단|날짜=2010-1-19}}
C++ 언어와 비교할 때 C#은 다음과 같은 점에서 단순화되거나 확장되었다.
 
* C#에는 전역 변수 및 전역 함수가 존재하지 않으며, 클래스 안에 선언되어야 한다.
* C#의 <code>bool</code>은 오직 <code>true</code>와 <code>false</code>의 논리값만을 가질 수 있으며,상수 또는 정수형 변수에서 암시적으로 변환이 불가능하다. 직접 대입을 위해서는 변환 명령을 이용해야 한다. 반면 C++의 <code>bool</code>은 정수값을 대입할 수 있다. 또한 C#에서는 <code>if</code>나 <code>while</code>문 등의 비교문에서 이용하는 값도 <code>bool</code> 형태로 제한되는 반면, C++에서는 상수 또는 변수를 이용하여 '0이 아닌 값' 또는 '0'의 여부로 비교할 수 있다.
줄 177 ⟶ 192:
unsafe
{
int *pA;
}
</source>
줄 201 ⟶ 216:
unchecked
{
a = int.MaxValue + 20;
}
checked
{
a = int.MaxValue * 2;
}
</source>
</blockquote>
 
* '''fixed 블록'''을 이용하여 [[힙 (자료 구조)|힙]]에 데이터를 고정할 수 있다.
<blockquote>
 
<source lang="csharp">
using System;
 
namespace FooBar
{
class Program
{
private int Test = 123;
static void Main(string[] args)
{
unsafe
{
Program p = new Program();
fixed (int* ptrX = &p.Test)
{
private int Test = 123;
Console.Out.Write(Convert.ToString(*ptrX));
 
*ptrX = 21;
static void Main(string[] args)
Console.Out.WriteLine(Convert.ToString(*ptrX));
{
unsafe
{
Program p = new Program();
 
fixed (int* ptrX = &p.Test)
{
Console.Out.Write(Convert.ToString(*ptrX));
*ptrX = 21;
Console.Out.WriteLine(Convert.ToString(*ptrX));
}
}
}
}
}
}
}
}
</source>
</blockquote>
 
* C#은 C++과는 달리 직접적인 메모리 해제 명령이 없으며, C++에서 포인터를 다룰 때 발생하기 쉬운 가비지나 매달린 포인터와 같은 복잡한 문제를 C#에서는 가비지 컬렉터의 능력으로 자동으로 처리한다. 하지만 가비지 컬렉터가 수집을 하기 이전에 개별적으로 처리해야 할 필요가 있는 소거 작업의 구현을 위하여 <code>IDisposable</code> 인터페이스를 특정 클래스에서 구현하게 된다. <code>IDisposable</code> 인터페이스를 구현하는 클래스는 C#의 using 구문을 이용하여 자동으로 <code>IDisposable.Dispose</code> 메서드를 호출할 수도 있다.
* C#은 C++과는 달리 부모 클래스를 하나만 사용할 수 있다. 즉 다중 상속은 불가능하며 구현해야 하는 인터페이스는 다수개를 지정할 수 있다. 이 점은 다중 부모 클래스로부터의 상속에서만 누릴 수 있는 이점을 잃게되는 단점을 가지지만 복잡성을 최소화하고 보다 명료한 상속 관계의 의미를 만들 수 있다는 점에서는 큰 도움이 된다.
줄 240 ⟶ 261:
* [[배열]]과 [[포인터 (프로그래밍)|포인터]]를 정의하는 문법이 다르다. 배열 문법은 자바와 유사하다. 하지만 포인터의 경우 C#은 <code>int*, void*, byte*</code>, ...와 같이 하나의 완성된 형식으로서 이해할 수 있지만 C++은 메모리 주소값을 저장하도록 되어있는 형태이다. 포인터를 사용하고자 하는 목적은 같지만 C++에서처럼 어떤 곳에서나 주소를 참조할 수 있는 것은 아니므로 정확한 이해가 필요하다. (다만, 특수한 <code>GCHandle</code> 형식을 활용하여 Pinned Object를 생성하는 경우에는 이러한 접근이 가능할 수 있으나 특성에 맞지도 않으며 심각한 성능 저하를 일으키므로 좋은 방법이라고 할 수 없을것이다.)
<blockquote>
 
<source lang="csharp">
// C#
줄 245 ⟶ 267:
int* pA, pB;
</source>
 
<source lang="cpp">
// C++
줄 251 ⟶ 274:
</source>
</blockquote>
 
* C#의 [[열거형]]은 그 자체가 하나의 형식이고 [[열거형]] 아래에 정의된 상수들은 멤버 상수가 된다. 하지만 C++의 [[열거형]]은 [[열거형]] 형식 그 자체의 의미보다는 상수들이 전역적으로 쓰일 수 있다는 것에 더 초점을 둔다.
* [[형식 다형성]]에 대한 제약을 극복하고 [[형식 안정성]]을 향상시키기 위한 목적으로 도입한 [[제네릭 형식]]이란 것이 2.0 사양부터 존재한다. C++의 [[템플릿 (C++)|템플릿]]과 목표는 유사하지만 C++의 템플릿이 C++ 컴파일러보다 앞서서 처리되는 것에 비하여 C#의 [[제네릭 형식]]은 IL [[메타데이터]] 상에 실제로 정보가 남는다. 이러한 차이점으로 인하여 [[비주얼 C++|마이크로소프트 비주얼 C++]]에는 특이한 충돌 현상이 발생하게 된다.<ref>[http://www.microsoft.com/korea/msdn/msdnmag/issues/06/04/PureC/default.aspx MSDN Magazine]</ref>
 
* 데이터 멤버를 다루는 구문에 의해 메서드가 호출되는 속성 기능이 있다. 이것을 정확한 이름으로는 프로퍼티라고 하며 getter 메서드와 setter 메서드로 구분된다. C#에서는 getter와 setter를 한꺼번에 사용할 수 있도록 아래와 같이 고정된 문법을 사용한다. [[비주얼 베이직 닷넷]]의 경우에도 이와 비슷하나 프로퍼티에서도 다수의 매개 변수를 받는 것을 허용한다. 그리고 특별한 사항이 없는 대다수의 다른 언어들에서 프로퍼티는 <code>get_foo()</code> 메서드와 <code>set_foo()</code> 메서드로 구분되어 표현되곤 한다.
<blockquote>
 
<source lang="csharp">
public string Name
{
get
{
{
return m_name;
}
}
set
{
{
m_name = "Name :: "+value;
}
}
}
 
public void MethodOne(string name)
{
this.Name = "DotNet";
}
</source>
 
</blockquote>
* C++에서 특정 컴파일러 제작사마다 조금씩 다른 방식으로 구현되었던 [[런타임 형식 정보]]는
줄 286 ⟶ 314:
public class FooClass
{
private int integer;
#if CsDebug
private string debugmsg;
#endif
public string DebugMsg
{
{
get
{
#if CsDebug
return this.debugmsg;
#else
return null;
#endif
}
set
{
#if CsDebug
this.debugmsg = value.Clone() as string;
#endif
}
}
}
}
#endregion
줄 318 ⟶ 346:
public class Foo
{
[MarshalAs(UnmanagedType.U4)]
private uint dwValue;
[MarshalAs(UnmanagedType.LPWstr)]
private string lpcwValue;
 
public uint DWValue
{
{
get { return this.dwValue; }
set { this.dwValue = value; }
}
}
public string LPCWValue
{
{
get { return this.lpcwValue; }
set { this.lpcwValue = value.Clone() as string; }
}
}
}
public static class Bar
{
public static string FooString(this Foo foo)
{
{
return string.Format("정수 값은 {0}, 문자열 값은 {1}입니다.", foo.DWValue, foo.LPCWValue);
}
}
}
</source>
* C# 3.0부터는 임의의 자료형인 var타입을 지원한다. var의 실제 형식은 컴파일시 결정된다.
(이 부분은 [[C++11]]에서 auto 키워드로 지원한다. )
* C# 3.0부터는 기존의 SQL구문을 활용한 LINQ 식을 지원한다.
아래 예제는 정수형으로 이루어진 배열에서 100을 초과하는 값만을 추출하는 코드이다.
줄 348 ⟶ 377:
public List<int> linqtest(List<int> list)
{
var result = from k in list where k > 100 select k;
return result;
}
</source>
줄 356 ⟶ 385:
public static void Print(int a, int b, Func<int> func)
{
Console.WriteLine("{0} 더하기 {1}은 {2}입니다.", a, b, func(a, b));
}
public static void Main()
{
Print(a, b, f => {Console.WriteLine("func가 호출되었습니다."); return a+b;});
}
</source>
줄 375 ⟶ 404:
== 각주 ==
<references />
 
=== 내용주 ===
<references group="note" />
 
{{C 프로그래밍 언어}}
{{주요 프로그래밍 언어}}
줄 383 ⟶ 412:
{{ISO 표준}}
{{전거 통제}}
 
[[분류:C 샤프| ]]
[[분류:ISO 표준]]