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

21
4 장 C# 장장장장 장장장장

description

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 파일의 컴파일 - PowerPoint PPT Presentation

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

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

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

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

4.1 C# Hello World 프로그램

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

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!

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

4

4.1.2 Visual Studio .NET Console 프로그램

컴파일 : F7

실행 : Ctrl + F5

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

4.2 C# Hello World 분석

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

6

4.2.1 Hello World 프로그램의 구성▣ HelloWorld 애플리케이션 내의 주요 내용

using System;

namespace org.jabook{

public class HelloWorld{

public static void Main() {

Console.WriteLine("Hello World!");

} //main

} //class

}

using System;

namespace org.jabook

static

Main()

Console.WriteLine("Hello World!");

System 네임스페이스를 사용하겠다 .이 함수는 객체를 생성하지 않고 직접접근이 가능하다 .

실행 프로그램은 하나의 Main() 을 포함해야 한다 .

콘솔창에 Hello World! 라는 문자열을 출력하라 .특정 구간의 이름을 org.jabook 으로 하겠다 .

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

7

4.2.2 네임스페이스와 어셈블리 ▣ 어셈블리 (Assembly)

◈ 컴파일한 결과파일 ( 중간언어 형태로 되어 있음 )

▣ 네임스페이스◈ 어셈블리 내에서 각각의 클래스들을 구분하는 기준이 네임스페이스 (Namespace)

이다 .

▣ Person.cs1. namespace aaa {2. namespace bbb {3. namespace ccc {4. public class Person {5. public int age;6. public long height;7. public float weight;8. }//class9. }//ccc10. }//bbb11. }//aaa

라이브러리 컴파일 방법csc /target:library /out:Person.dll Person.cs

csc /t:library /out:Person.dll Person.cs

A.dll B.dll

A.dll 과 B.dll 사용

Top 클래스를 사용

Top 클래스 Top 클래스

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

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 {◈ //….◈ }

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

9

4.2.4 Main() 함수

MainTest 의 Main()

CLR

c:\csharp\chap\04> MainTest 1

MainTest m = new MainTest();m.SayHello();

데이터 타입 MainTest 객체 m 을 생성하고 m 의 SayHello() 함수를 호출한다 .

public static void Main()

3

public class MainTest{public void SayHello(){

Console.WriteLine("Hello World!");}public static void Main(){

MainTest m = new MainTest();m.SayHello();

}}

실행할 때 Main() 함수를 먼저 찾는다

Main 함수의 호출 순서

MainTest 클래스도스 콘솔창에서 명령 실행

2

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

10

4.2.5 static 키워드

static 과 일반 메모리의 생성 구조

static int s

int a

int b

int c

int d

int e

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();

10 개의 객체생성s

edcba

st1 st2 st3 st4 st5 st6 st7 st8 st9 st10

스태틱 메모리 생성

edcba

edcba

edcba

edcba

edcba

edcba

edcba

edcba

edcba

Sample 클래스

1. public class StaticTest {2. private static int sint = 0;3. private int nint = 0; 4. public StaticTest() {5. sint = sint +1;6. nint = nint +1;7. }8. public void SayMember() {9. Console.WriteLine("sint:{0}, nint:{1}", sint, nint);10. }11.}//class

public static void Main() {

for(int i=0; i<10; i++) {

StaticTest s = new StaticTest();

s.SayMember();

}

}//main

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

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));

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

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

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

13

4.3.1 스태틱 메모리 생성과 접근의 문제 ▣ 스태틱 사용의 예

1. public class StaticAccess {2. public static int sint = 0;3. public int nint = 0;4. public static void Main() {5. StaticAccess.sint = 3333;6. StaticAccess sa = new StaticAccess();7. sa.nint = 1000;8. Console.WriteLine("static 직접접근 :" + StaticAccess.sint);9. Console.WriteLine(" 일반멤버 필드접근 :" + sa.nint);

10. }//main11. }//class

▣ 스태틱에 접근하는 방법◈ 클래스의 이름으로 접근한다 .

▣ 스태틱 메모리의 생성시기◈ 객체를 생성하기 이전에 스태틱의 메모리는 생성된다 .

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

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

이유일반 멤버 변수는 객체를 생성해야만 메모리가 생성된다 . 하지만 스태틱 함수는 객체 생성 이전에 접근할 수 있기 때문

스태틱 함수 내에서 일반 멤버 변수를 사용할 수 없다 .

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

15

4.3.3 스태틱 생성자 ▣ 스태틱 생성자

◈ 스태틱 생성자는 스태틱 멤버 필드의 메모리가 생성된 직후 호출되는 스태틱 전용의 생성자 함수이다 .

▣ 스태틱 생성자의 특징◈ 접근제어를 사용할 수 없음◈ 매개변수를 가질 수 없음

▣ 스태틱 생성자의 사용1. class StaticConst{2. public static int sInt = 0; //static 멤버 필드 3. static StaticConst(){ //static 생성자4. sInt = 10;5. Console.Write("sInt=" + sInt + " : static 생성자 !!!");6. }7. public StaticConst(){ // 디폴트 생성자8. //9. }10. public static void InitSint(int a){ //static 함수11. sInt=a;12. }13. }14. class StaticConstTest{15. public static void Main(){16. int a = StaticConst.sInt;17. }//main18. }//class

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

4.4 const, unsafe

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

17

4.4.1 const 상수▣ const 키워드

◈ 상수를 선언하는 키워드

▣ const 상수 선언하기의 예◈ public const int SALLERY = 7070;

▣ const 상수의 특징 1◈ const 는 자동으로 static 이 된다 .

▣ const 상수의 특징 2◈ const 로 선언한 변수는 반드시 초기화되어야 한다 .

자동 static

static 으로 선언하지 않아도 자동으로 static 이 된다 .

반드시 초기화반드시 초기화를 해야 한다 . 초기화하지 않으면 에러가 발생한다 .

초기화후 변경 불가const 상수는 단 한번만 초기화가 가능하다 .

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

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; ◈ }

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

19

4.4.3 가비지 콜렉터와 메모리

▣ C++ 에서의 메모리 관리◈ new 를 사용해서 메모리를 생성했으면 반드시 사용자가 직접 dele

te 를 사용해서 메모리를 제거해주어야 한다 .

▣ 가비지 콜렉터◈ C# 의 메모리 관리자 역할을 담당한다 .

▣ 가비지 콜렉터가 하는 일◈ 더 이상 사용하지 않는 메모리나 불필요한 메모리를 제거◈ 메모리가 부족하면 메모리의 조각 모음을 한다 .

▣ 가비지 콜렉터의 관리 대상◈ 힙에 생성되는 객체의 메모리

Page 20: 4 장  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

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

21

4.4.5 fixed 키워드를 이용한 메모리 고정▣ fixed 키워드

◈ CLR 에 의해서 해당 메모리의 포인터를 이동시키지 못하도록 하는 키워드

▣ fixed 특징◈ unsafe code 내에서만 사용할 수 있다 .◈ CLR 이 메모리를 이동하지 않는다는 것이 보장된다 .

▣ fixed 의 사용 예1. class FixedTest{2. unsafe static void ArrayCopy(byte[ ] source, byte[ ] target) {3. fixed(byte* s = source, t = target){4. for(int i =0; i<source.Length; i++)5. *(t +i) = *(s+i);6. }7. }8. }