220 likes | 432 Views
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 파일의 컴파일
E N D
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.1.2 Visual Studio .NET Console 프로그램 컴파일 : F7 실행 : Ctrl + F5
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!라는 문자열을 출력하라.
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
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 { • //…. • }
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
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
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));
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 • 스태틱에 접근하는 방법 • 클래스의 이름으로 접근한다. • 스태틱 메모리의 생성시기 • 객체를 생성하기 이전에 스태틱의 메모리는 생성된다.
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 스태틱 함수 내에서 일반 멤버 변수를 사용할 수 없다. 이유 일반 멤버 변수는 객체를 생성해야만 메모리가 생성된다. 하지만 스태틱 함수는 객체 생성 이전에 접근할 수 있기 때문
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
4.4.1 const 상수 • const 키워드 • 상수를 선언하는 키워드 • const 상수 선언하기의 예 • public const int SALLERY = 7070; • const상수의 특징1 • const는 자동으로 static이 된다. • const상수의 특징2 • const로 선언한 변수는 반드시 초기화되어야 한다. static으로 선언하지 않아도 자동으로 static이 된다. 자동 static 반드시 초기화 반드시 초기화를 해야 한다. 초기화하지 않으면 에러가 발생한다. 초기화후 변경 불가 const 상수는 단 한번만 초기화가 가능하다.
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; • }
4.4.3 가비지 콜렉터와 메모리 • C++에서의 메모리 관리 • new를 사용해서 메모리를 생성했으면 반드시 사용자가 직접 delete를 사용해서 메모리를 제거해주어야 한다. • 가비지 콜렉터 • C#의 메모리 관리자 역할을 담당한다. • 가비지 콜렉터가 하는 일 • 더 이상 사용하지 않는 메모리나 불필요한 메모리를 제거 • 메모리가 부족하면 메모리의 조각 모음을 한다. • 가비지 콜렉터의 관리 대상 • 힙에 생성되는 객체의 메모리
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
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); • } • } • }