1 / 21

4 장 C# 프로그램 시작하기

4 장 C# 프로그램 시작하기. 4.1 C# Hello World 프로그램. 4.1.1 Hello World Console 프로그램. HelloWorld.cs using System; namespace org.jabook{ public class HelloWorld{ public static void Main() { Console.WriteLine("Hello World!"); } //main } //class } HelloWorld.cs 파일의 컴파일

cybil
Download Presentation

4 장 C# 프로그램 시작하기

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 4장 C# 프로그램 시작하기

  2. 4.1 C# Hello World 프로그램

  3. 4.1.1 Hello World Console 프로그램 • HelloWorld.cs • using System; • namespace org.jabook{ • public class HelloWorld{ • public static void Main() { • Console.WriteLine("Hello World!"); • } //main • } //class • } • HelloWorld.cs 파일의 컴파일 • c:\csharp\chap04> csc.exe HelloWorld.cs • HelloWorld.exe 파일 확인 • c:\csharp\chap04> HelloWorld.exe • Hello World!

  4. 4.1.2 Visual Studio .NET Console 프로그램 컴파일 : F7 실행 : Ctrl + F5

  5. 4.2 C# Hello World 분석

  6. 4.2.1 Hello World 프로그램의 구성 • HelloWorld 애플리케이션 내의 주요 내용 실행 프로그램은 하나의 Main()을 포함해야 한다. Main() 이 함수는 객체를 생성하지 않고 직접접근이 가능하다. using System; System 네임스페이스를 사용하겠다. static using System; namespace org.jabook{ public class HelloWorld{ public static void Main() { Console.WriteLine("Hello World!"); } //main } //class } namespace org.jabook Console.WriteLine("Hello World!"); 특정 구간의 이름을 org.jabook으로 하겠다. 콘솔창에 Hello World!라는 문자열을 출력하라.

  7. 4.2.2 네임스페이스와 어셈블리 • 어셈블리(Assembly) • 컴파일한 결과파일(중간언어 형태로 되어 있음) • 네임스페이스 • 어셈블리 내에서 각각의 클래스들을 구분하는 기준이 네임스페이스(Namespace)이다. • Person.cs • namespace aaa { • namespace bbb { • namespace ccc { • public class Person { • public int age; • public long height; • public float weight; • }//class • }//ccc • }//bbb • }//aaa Top 클래스 Top 클래스 A.dll B.dll A.dll과 B.dll 사용 Top 클래스를 사용 • 라이브러리 컴파일 방법 • csc /target:library /out:Person.dll Person.cs • csc /t:library /out:Person.dll Person.cs

  8. 4.2.3 네임스페이스 사용하기 • 라이브러리 형태의 어셈블리(Assembly)를 사용하기 위한 절차 • Person.dll의 물리적인 위치를 명시한다.(콘솔창에서 컴파일할 때) • 코드 내에서 Person.dll 내부에서 사용하고자 하는 네임스페이스를 using한다.(코드 내에서 작업) • 라이브러리 생성 • csc /target:library /out:Person.dll Person.cs • 라이브러리 물리적 사용 • csc /reference:Person.dll /out:PersonFinal.exe PersonTest.cs • Person.dll이 현재 디렉터리에 있기 때문에 /reference:Person.dll을 사용하였다. • Person.dll이 다른 위치에 있다면 전체 경로를 명시해야 한다. • 라이브러리의 논리적 사용 • using System; • using aaa.bbb.ccc; //사용하고자하는 네임스페이스 명시 • public class PersonTest { • //…. • }

  9. 4.2.4 Main() 함수 Main 함수의 호출 순서 c:\csharp\chap\04> MainTest MainTest 클래스 1 도스 콘솔창에서 명령 실행 public class MainTest{ public void SayHello(){ Console.WriteLine("Hello World!"); } public static void Main(){ MainTest m = new MainTest(); m.SayHello(); } } CLR 실행할 때 Main() 함수를 먼저 찾는다 2 public static void Main() MainTest m = new MainTest(); m.SayHello(); 데이터 타입 MainTest객체 m을 생성하고m의 SayHello() 함수를 호출한다. MainTest의 Main() 3

  10. a a a a a a a a a a b b b b b b b b b b c c c c c c c c c c d d d d d d d d d d e e e e e e e e e e 4.2.5 static 키워드 스태틱 메모리 생성 • public class StaticTest { • private static int sint = 0; • private int nint = 0; • public StaticTest() { • sint = sint +1; • nint = nint +1; • } • public void SayMember() { • Console.WriteLine("sint:{0}, nint:{1}", sint, nint); • } • }//class Sample클래스 static 과 일반 메모리의 생성 구조 10개의 객체생성 s static int s Sample st1 = new Sample(); Sample st2 = new Sample(); Sample st3 = new Sample(); Sample st4 = new Sample(); Sample st5 = new Sample(); Sample st6 = new Sample(); Sample st7 = new Sample(); Sample st8 = new Sample(); Sample st9 = new Sample(); Sample st10 = new Sample(); int a int b int c int d int e st1 st2 st3 st4 st5 st6 st7 st8 st9 st10 public static void Main() { for(int i=0; i<10; i++) { StaticTest s = new StaticTest(); s.SayMember(); } }//main

  11. 4.2.6 Console.WriteLine() 함수 • Console 클래스 • System 네임스페이스의 클래스 • System.Console.WriteLine(); • Console 클래스의 스태틱 멤버 함수 • 화면에 표준출력을 처리하는 함수 • WriteLine() 함수 • namespace System{ • public class Console{ • public static int WriteLine(){ • .....(내용) • } • } • } • 출력 형식 • Console.WriteLine("a:{0}, b:{1}, a-b:{2}", a, b, a-b); • Console.WriteLine("a:{0}, a:{0}, a+b:{1}", a, a+b); • Console.Write("a:" + a + " ,b:" + b + "a*b: " + (a*b));

  12. 4.3 스태틱 메모리, 함수, 생성자

  13. 4.3.1 스태틱 메모리 생성과 접근의 문제 • 스태틱 사용의 예 • public class StaticAccess { • public static int sint = 0; • public int nint = 0; • public static void Main() { • StaticAccess.sint = 3333; • StaticAccess sa = new StaticAccess(); • sa.nint = 1000; • Console.WriteLine("static직접접근:" + StaticAccess.sint); • Console.WriteLine("일반멤버 필드접근:" + sa.nint); • }//main • }//class • 스태틱에 접근하는 방법 • 클래스의 이름으로 접근한다. • 스태틱 메모리의 생성시기 • 객체를 생성하기 이전에 스태틱의 메모리는 생성된다.

  14. 4.3.2 스태틱 함수 • 스태틱 멤버 함수 • 스태틱 멤버 함수는 클래스의 이름으로 접근 가능하다. • public static 함수만 접근 가능하다. • 스태틱 멤버 함수에서 주의할 점 • 스태틱 함수를 이용하여 일반 멤버 필드에 접근 불가 • 일반 멤버 필드는 객체 생성 후에 존재하기 때문에 스태틱 함수에서는 접근 불가 • 스태틱 함수의 사용 • public class StaticMethodAccess { • private static int sint = 100; • public int nint = 0; • public static void SetStaticInt(int x) { • sint = x; • } • public static int GetStaticInt() { • return sint; • } • public static void Main() { • StaticMethodAccess.SetStaticInt(33333); • int s = StaticMethodAccess.GetStaticInt(); • Console.WriteLine("static값은:" + s); • }//main • }//class 스태틱 함수 내에서 일반 멤버 변수를 사용할 수 없다. 이유 일반 멤버 변수는 객체를 생성해야만 메모리가 생성된다. 하지만 스태틱 함수는 객체 생성 이전에 접근할 수 있기 때문

  15. 4.3.3 스태틱 생성자 • 스태틱 생성자 • 스태틱 생성자는 스태틱 멤버 필드의 메모리가 생성된 직후 호출되는 스태틱 전용의 생성자 함수이다. • 스태틱 생성자의 특징 • 접근제어를 사용할 수 없음 • 매개변수를 가질 수 없음 • 스태틱 생성자의 사용 • class StaticConst{ • public static int sInt = 0; //static 멤버 필드 • static StaticConst(){ //static 생성자 • sInt = 10; • Console.Write("sInt=" + sInt + " : static생성자!!!"); • } • public StaticConst(){ //디폴트 생성자 • // • } • public static void InitSint(int a){ //static 함수 • sInt=a; • } • } • class StaticConstTest{ • public static void Main(){ • int a = StaticConst.sInt; • }//main • }//class

  16. 4.4 const, unsafe

  17. 4.4.1 const 상수 • const 키워드 • 상수를 선언하는 키워드 • const 상수 선언하기의 예 • public const int SALLERY = 7070; • const상수의 특징1 • const는 자동으로 static이 된다. • const상수의 특징2 • const로 선언한 변수는 반드시 초기화되어야 한다. static으로 선언하지 않아도 자동으로 static이 된다. 자동 static 반드시 초기화 반드시 초기화를 해야 한다. 초기화하지 않으면 에러가 발생한다. 초기화후 변경 불가 const 상수는 단 한번만 초기화가 가능하다.

  18. 4.4.2 readonly 상수 • readonly 상수의 특징1 • 반드시 초기화할 필요없다. • 생성자에서 딱 한번 값을 할당할 수 있다. • readonly 상수 특징2 • static 키워드를 사용하면 스태틱 상수가 된다. 사용하지 않으면 일반 상수가 된다. • static readonly • static readonly일 경우 스태틱 생성자에서 초기화할 수 있다. • static readonly일 경우 클래스의 이름으로 접근가능 • 일반 readonly • 일반 readonly일 경우 생성자에서 초기화할 수 있다. • 일반 readonly일 경우 객체의 이름으로 접근가능 • readonly의 사용 • public readonly static int STATIC_READONLY = 1; • static ReadonlyTest(){ //스태틱 생성자 • STATIC_READONLY = 100; • } • public readonly int NORMAL_READONLY = 1; • public ReadonlyTest(){ //일반 생성자 • NORMAL_READONLY = 10000; • }

  19. 4.4.3 가비지 콜렉터와 메모리 • C++에서의 메모리 관리 • new를 사용해서 메모리를 생성했으면 반드시 사용자가 직접 delete를 사용해서 메모리를 제거해주어야 한다. • 가비지 콜렉터 • C#의 메모리 관리자 역할을 담당한다. • 가비지 콜렉터가 하는 일 • 더 이상 사용하지 않는 메모리나 불필요한 메모리를 제거 • 메모리가 부족하면 메모리의 조각 모음을 한다. • 가비지 콜렉터의 관리 대상 • 힙에 생성되는 객체의 메모리

  20. 4.4.4 unsafe 코드 • unsafe code • C#에서 포인터를 사용하면 unsafe code가 된다. • CLR이 메모리를 전자동으로 관리해주는데 사용자가 직접 메모리를 건드리는 것은 안전하지 못하기 때문에 unsafe code라고 한다. • unsafe code의 컴파일 옵션 • unsafe code를 컴파일할 때 컴파일 옵션으로 /unsafe를 사용해서 컴파일해야 한다. • unsafe code의 예 • class UnsafeTest2{ • unsafe static void CallByPoint(int* x) { • *x = 10000; • } • public static void Main() { • int x1 = 10; • unsafe{ • CallByPoint(&x1); • } • Console.WriteLine("Call-By-Point: {0}", x1); • } • } 컴파일 csc /unsafe UnsafeTest2.cs

  21. 4.4.5 fixed 키워드를 이용한 메모리 고정 • fixed 키워드 • CLR에 의해서 해당 메모리의 포인터를 이동시키지 못하도록 하는 키워드 • fixed 특징 • unsafe code 내에서만 사용할 수 있다. • CLR이 메모리를 이동하지 않는다는 것이 보장된다. • fixed의 사용 예 • class FixedTest{ • unsafe static void ArrayCopy(byte[ ] source, byte[ ] target) { • fixed(byte* s = source, t = target){ • for(int i =0; i<source.Length; i++) • *(t +i) = *(s+i); • } • } • }

More Related