12 C# 7.0 C# 6.0의경우컴파일러를완전히새롭게만드는작업으로인해이전버전대비중대한문법향상이없었던반면 C# 7.0부터는다시주요한변화를이끌어내기시작했는데바로함수형언어에서나제공하던패턴매칭구문을가능하게했다는점이다. 물론 C# 7.0에서는그밖의소소한간편표기구문도제공한다.

Size: px
Start display at page:

Download "12 C# 7.0 C# 6.0의경우컴파일러를완전히새롭게만드는작업으로인해이전버전대비중대한문법향상이없었던반면 C# 7.0부터는다시주요한변화를이끌어내기시작했는데바로함수형언어에서나제공하던패턴매칭구문을가능하게했다는점이다. 물론 C# 7.0에서는그밖의소소한간편표기구문도제공한다."

Transcription

1 12 C# 7.0 C# 6.0의경우컴파일러를완전히새롭게만드는작업으로인해이전버전대비중대한문법향상이없었던반면 C# 7.0부터는다시주요한변화를이끌어내기시작했는데바로함수형언어에서나제공하던패턴매칭구문을가능하게했다는점이다. 물론 C# 7.0에서는그밖의소소한간편표기구문도제공한다. C# 7.0에대응하는닷넷프레임워크의버전은 4.7이고, 주요개발환경은비주얼스튜디오 2017이다. 하지만 C# 7.0 컴파일러가출시되는시점의닷넷프레임워크버전은 4.6.2였고이로인해 C# 7.0의새로운두가지기능을사용하는데문제가발생한다. 먼저새로운문법인튜플은 System.ValueTuple 타입을요구하지만닷넷 4.6.2의 BCL에서는제공하지않기때문에 NuGet 패키지관리자로부터 System.ValueTuple을직접설치해야만했다. System.ValueTuple 타입 다행히이후에출시된닷넷 4.7의 BCL은 System.ValueTuple을기본적으로포함하고있다. 문제가되는다른하나는 async 메서드의성능향상을위해추가된 System.Threading.Tasks. ValueTask 타입인데, 이는닷넷코어버전의초기 1.0 버전부터이미 System.Threading.Tasks. Extensions.dll을통해제공하고있었는데도불구하고닷넷프레임워크 4.7의 BCL에서는여전히포 부 _ C# 고급문법

2 함하고있지않는타입이다. 따라서이타입이들어간 async 구문을테스트하려면반드시 NuGet 패 키지관리자로부터 ValueTask 를구현한 System.Threading.Tasks.Extensions.dll 을다운로드해 참조추가해야한다. ValueTask 타입을포함하는 System.Threading.Tasks.Extensions 패키지 더욱편리해진 out 매개변수사용 out 매개변수가정의된대표적인메서드가바로 TryParse 다. C# 6.0 이전에는 out 매개변수가정의 된메서드를사용하려는경우반드시인자로전달될인스턴스를미리선언해야했다. int result; // 변수를미리선언 int.tryparse("5", out result); C# 7 부터는변수선언없이변수의타입과함께 out 예약어를쓸수있다. int.tryparse("5", out int result); 물론 C# 7 컴파일러는위의구문을컴파일하는경우개발자대신 C# 6 이전의코드로변환해소스코 드를컴파일한다. 따라서당연히다음과같은식으로코드를작성하면컴파일오류가발생한다. int.tryparse("5", out int result); int.tryparse("5", out int result); // 컴파일오류! 왜냐하면 C# 7 컴파일러가바꾼구문은다음과같기때문이다. 12 장. C#

3 int result; int.tryparse("5", out result); int result; // 중복변수선언 int.tryparse("5", out result) 이뿐만아니라타입추론을컴파일러에게맡기는 var 예약어도사용할수있다. int.tryparse("5", out var result); // out int result 로컴파일러가대신처리 심지어값을무시하는구문까지추가되어값이필요하지않은상황에대해서는변수명까지생략할수 있게됐다. int.tryparse("5", out int _ ); // 변수명대신밑줄 (underline: _) 로생략 int.tryparse("5", out var _ ); 12.2 반환값및로컬변수에 ref 기능추가 (ref returns and locals) out 예약어의사용법이 C# 7.0에서는쉽게개선된경우라면 ref 예약어는사용법을확장시킨경우에해당한다. C# 6.0 이전까지는 ref 예약어를오직메서드의매개변수로만사용할수있었지만이제는로컬변수와반환값에대해서도참조관계를맺을수있게개선됐다. 우선로컬변수에대한 ref 예약어의사용여부에따른차이점을알아보자. ref가지정되지않은경우다음코드는 int a = 5; int b = a; 부 _ C# 고급문법

4 변수 a 와 b 모두값형식이므로메모리에는그림 12.1 과같은식으로할당된다. 그림 12.1 스택영역에별도의공간을점유한 a, b 변수 int a; 0x2000 int b; 5 0x1600 스택영역 5 0x1200 메모리 0x0000 이상태에서다음과같이 a 변수에새로운값을대입하면 int a = 5; int b = a; a = 6; Console.WriteLine(a); // 6 Console.WriteLine(b); // 5 예상할수있듯이 a 와 b 의값은그림 12.2 와같이독립적으로유지된다. 그림 12.2 a 의값과독립적인변수 b int a; 0x2000 int b; 6 0x1600 스택영역 5 0x1200 0x0000 메모리 12 장. C#

5 그럼이번에는 ref 예약어를사용해 a 변수와 b 변수가참조관계를맺도록수정해보자. int a = 5; ref int b = ref a; 이제 a 변수와 b 변수는그림 12.3 과같이동일한메모리를공유하게된다. 그림 12.3 변수 a 와 b 가같은주소를공유 int a; 0x2000 int b; 5 0x1600 스택영역 0x1200 메모리 0x0000 즉, 절 구조체 에서메서드의매개변수가 ref 사용여부에따라다르게동작했던것과같은결과를보이는것이다. 반환값에 ref를사용할수있는경우에는더욱극적인표현이가능하다. 예를들어배열의특정요소의값을바꾸려면배열인스턴스자체를넘겨주거나원하는배열요소만을바꿀수있는메서드를일부러정의해야했다 ( 정보은닉입장에서는후자의방법이권장되지만아래예제에서는일부러전자의방법을사용했다 ). IntList intlist = new IntList(); int[] list = intlist.getlist(); // IntList 에정의된 list 요소를바꾸기위해목록반환 list[0] = 5; // list[0] 의요소를변경 intlist.print(); // 출력결과 : 5,2, class IntList 부 _ C# 고급문법

6 int[] list = new int[2] 1, 2 ; public int [] GetList() return list; internal void Print() Array.ForEach(list, (e) => Console.Write(e + ",")); Console.WriteLine(); 하지만참조 return 을사용하면원하는요소의참조만반환하는것이가능하다 ( 이때 ref 예약어를네 곳에서명시해야한다 ). IntList intlist = new IntList(); ref int item = ref intlist.getfirstitem(); item = 5; // 참조값이므로값을변경하면원래의 int [] 배열에도반영 intlist.print(); // 출력결과 : 5,2, class IntList int[] list = new int[2] 1, 2 ; public ref int GetFirstItem() return ref list[0]; internal void Print() [ 생략 ] 12 장. C#

7 이밖에도참조 return 덕분에가능한구문이바로메서드에값을대입하는구문이다. 가령다음과같 은구문으로값을설정할수있는데, C# 6.0 이전에는불가능한문법이다. MyMatrix matrix = new MyMatrix(); matrix.put(0, 0) = 1; class MyMatrix int[,] _matrix = new int[100, 100]; public ref int Put(int column, int row) return ref _matrix[column, row]; 다소가독성이떨어지는억지스러운구문이지만메서드에값을설정하는구문과동시에값을받는것 도가능하다. MyMatrix matrix = new MyMatrix(); matrix.put(0, 0) = 1; int result = matrix.put(1, 1) = 1; Console.WriteLine(result); // 출력결과 : 1 반환및로컬변수에사용할수있는 ref 예약어는두가지제약이있는데모두컴파일오류가발생하 므로실수할여지는없다. 지역변수를 return ref로반환해서는안된다. 지역변수의유효범위가스택상에있을때로한정되기때문에메서드 의실행이끝나호출측으로넘어가는시점에스택이해제되어 return ref 로반환받은인스턴스가남아있을거라는보 장을할수없기때문이다. ref 예약어를지정한지역변수는다시다른변수를가리키도록변경할수없다 부 _ C# 고급문법

8 두가지모두다음과같은상황으로테스트할수있다. public ref int RefReturnOfLocalValue() int x = 5; return ref x; // 컴파일에러 CS8168: 지역변수를 return ref로반환할수없음 public void ChangeRefLocalVar() int a = 5; ref int b = ref a; int c = 10; b = ref c; // 컴파일에러 : 이미 a 를가리키는 b 참조변수를다른참조로바꿀수없음 ref b = ref c; // 컴파일에러 : 이런식의사용법도허용되지않음 12.3 튜플 튜플 (Tuple) 이란유한개의원소로이뤄진졍렬된리스트를의미하는자료구조로서일반적으로 n-tuple이라고일컬을때의 n은요소의수를의미하며가령 3개의요소를갖는경우 3-tuple이라고한다. 어려운수학적정의와는달리 C# 에도입된튜플의경우메서드의인자또는반환에대해다중값을한번에전달할수있는약식구문이라고여기면된다. 이절의내용을실습하려면비주얼스튜디오에서프로젝트의대상프레임워크값을반드시 4.7로설정하거나 NuGet 패키지관리자로부터 System.ValueTuple을참조추가해야한다. 그렇지않으면컴파일할때다음과같은예외메시지가발생한다. error CS8179: Predefined type System.ValueTuple`2 is not defined or imported CS8179 미리정의된형식 System.ValueTuple`2 을 ( 를 ) 정의하지않았거나가져오지않았습니다. 튜플의필요성을이해하기위해우선튜플이없었던시절부터 2개이상의반환값을돌려줘야했던 int.tryparse의예를살펴보자. int.tryparse는입력문자열을숫자로변환한값을 out 매개변수로 12 장. C#

9 넘기는것과함께성공여부를 return 으로반환한다. 만약 out 으로처리하지않았다면별도의클래스 를만들어반환값을표현해야하는전형적인사례다. public class IntResult public bool Parsed get; set; public int Number get; set; class Program static void Main(string[] args) Program pg = new Program(); IntResult result = pg.parseinteger("15"); Console.WriteLine(result.Parsed); // True Console.WriteLine(result.Number); // 15 IntResult ParseInteger(string text) IntResult result = new IntResult(); try result.number = Int32.Parse(text); result.parsed = true; catch result.parsed = false; return result; 부 _ C# 고급문법

10 보다시피 2개이상의반환값이필요할때마다저런식으로별도의클래스를만들어야하는것은여간귀찮은작업이아닐수없다. 물론위의코드정도는 out 매개변수를사용하는것으로바꿀수있지만 3개, 4개의매개변수를이같은식으로처리해야한다고가정하면 out 매개변수로처리하는방식이직관적인메서드구현의관점에서보면바람직하지않을수있다. 매번정의되는클래스를없애기위해 C# 3.0의익명타입과 C# 4.0의 dynamic 예약어를이용할수도있다. dynamic result = ParseInteger("20"); Console.WriteLine(result.Parsed); Console.WriteLine(result.Number); dynamic ParseInteger(string text) int number = 0; try number = Int32.Parse(text); return new Number = number, Parsed = true ; catch return new Number = number, Parsed = false ; 하지만 dynamic의도입으로정적형식검사를할수없어나중에필드이름이바뀌어도컴파일시문제를알아낼수없다는문제점이발생한다. 또다른해결방법으로는닷넷프레임워크 4.0의 BCL부터제공되는 System.Tuple 제네릭타입을이용하는것이다. 이타입은 7개까지의인자를기본처리할수있도록미리정의돼있으며, public class Tuple<T1> : IStructuralEquatable, [ 생략 ], ITuple public class Tuple<T1, T2> : IStructuralEquatable, [ 생략 ], ITuple public class Tuple<T1, T2, T3> : IStructuralEquatable, [ 생략 ], ITuple 12 장. C#

11 public class Tuple<T1, T2, T3, T4> : IStructuralEquatable, [ 생략 ], ITuple public class Tuple<T1, T2, T3, T4, T5> : IStructuralEquatable, [ 생략 ], ITuple public class Tuple<T1, T2, T3, T4, T5, T6> : IStructuralEquatable, [ 생략 ], ITuple public class Tuple<T1, T2, T3, T4, T5, T6, T7> : IStructuralEquatable, [ 생략 ], ITuple 8 개이상은또다른 System.Tuple 로이어서처리할수있도록구현돼있다. public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> : IStructuralEquatable, [ 생략 ], ITuple 따라서 System.Tuple 을이용해다음과같이문제를해결할수있다. Tuple<bool, int> result = pg.parseinteger("40"); Console.WriteLine(result.Item1); // 첫번째제네릭인자를 Item1 로접근 Console.WriteLine(result.Item2); // 두번째제네릭인자를 Item2 로접근 Tuple<bool, int> ParseInteger(string text) int number = 0; bool result = false; try number = Int32.Parse(text); result = true; catch return Tuple.Create(result, number); dynamic 예약어와는달리이번에는정적형식검사를제공하지만변수의이름이무조건 Item1, Item2, 와같은식으로정해진다는아쉬움이남고문법역시다른언어 ( 예 : 파이썬 ) 에비해복잡하다는문제가있다. 이러한모든문제를해결하기위해마이크로소프트는 C# 언어차원에서튜플을지원하기로결정했고이로인해메서드의정의구문이확장된다 절 메서드 에나오는예제를하나만들어보자 부 _ C# 고급문법

12 메서드가값을반환하는경우반환타입메서드명 ([ 타입명 ] [ 매개변수명 ], ) // 코드 : 메서드의본문 return [ 반환타입에해당하는표현식 ]; 튜플이나오기전에는반환타입과타입명으로단일타입의이름만가능했지만이제는괄호와함께 2 개이상의타입과원한다면각각의이름까지지정할수있다. 튜플의반환타입 ( 반환타입 [ 필드명 ], 반환타입 [ 필드명 ], ) 메서드명 ([ 타입명 ] [ 매개변수명 ], ) // 코드 : 메서드의본문 return ([ 반환타입에해당하는표현식, ]); 튜플의입력타입반환타입메서드명 (([ 타입명 ] [ 매개변수명 ], [ 타입명 ] [ 매개변수명 ], )) 반환타입메서드명 ([ 타입명 ] [ 매개변수명 ], ([ 타입명 ] [ 매개변수명 ], [ 타입명 ] [ 매개변수명 ], )) 반환타입메서드명 (([ 타입명 ] [ 매개변수명 ], [ 타입명 ] [ 매개변수명 ], ), [ 타입명 ] [ 매개변수명 ]) 괄호를사용해 2개이상의타입및그이름을지정할수있고반환타입뿐만아니라매개변수로도전달할수있다. 튜플의각요소는 Item1부터차례대로 Item2, Item3, 의순으로자동명명되지만원하다면이름을직접지정 10 하는것도가능하다. 예 ) int와 string을반환하는경우 (int, string) GetResult() 예 ) bool, Dictionary<int, string> 을반환하는경우 (bool, Dictionary<int, string>) GetResult() 예 ) bool, int를반환하고각각의이름으로 Parsed, Number를반환하는경우 (bool Parsed, int Number) GetResult() 예 ) (bool, int) 튜플을인자로전달하는경우 void SetResult((bool, int) arg1) 1 C# 7.1 부터튜플에대해타입추론이추가되어이름지정을생략할수있는경우가있다 (13.3 절참고 ). 12 장. C#

13 즉, 괄호를이용해다중값을처리할수있는구문을 C# 7.0 수준에서지원하도록추가한것이다. 이 를이용하면 ParseInteger 메서드의처리를다음과같이간단하게바꿀수있다. (bool, int) result = pg.parseinteger("50"); Console.WriteLine(result.Item1); // 튜플의첫번째인자를 Item1 로접근 Console.WriteLine(result.Item2); // 튜플의두번째인자를 Item2 로접근 (bool, int) ParseInteger(string text) int number = 0; bool result = false; try number = Int32.Parse(text); result = true; catch return (result, number); 반환받은튜플의요소에접근하기위해 System.Tuple 에서처럼 Item1, Item2 로접근하는데, 원한다 면다음과같이직접이름을지정하고 var 예약어로받아접근할수있다. var result = pg.parseinteger("50"); Console.WriteLine(result.Parsed); // 튜플의첫번째인자를 Parsed 로접근 Console.WriteLine(result.Number); // 튜플의두번째인자를 Number 로접근 (bool Parsed, int Number) ParseInteger(string text) // [ 생략 ] return (result, number); 부 _ C# 고급문법

14 만약튜플을반환하는메서드가지정한튜플의이름들을원하지않거나또는이름이지정되지않은튜 플인경우라도호출하는측에서강제로이름을지정하는것또한가능하다. (bool success, int n) result = pg.parseinteger("50"); Console.WriteLine(result.success); // 튜플의첫번째인자에 success 로접근 Console.WriteLine(result.n); // 튜플의두번째인자에 n 으로접근 심지어튜플로받지않고개별필드를분해해서받는구문도지원한다. (var success, var number) = pg.parseinteger("50"); Console.WriteLine(success); // 튜플의첫번째인자의값을담은 success 변수 Console.WriteLine(number); // 튜플의두번째인자의값을담은 number 변수 또한 out 매개변수처리에서지원했던생략기호 ( 밑줄 ) 도튜플의반환값을분해하는구문에사용할수 있다. (var _, var _) = pg.parseinteger("70"); // 2 개의값을모두생략 (var _, var n) = pg.parseinteger("70"); // 마지막값만 n 으로받음 Console.WriteLine(n); 앞에서설명한모든튜플구문은 C# 7.0 컴파일러가소스코드를컴파일하는시점에 System. ValueTuple 제네릭타입으로변경해서처리한다. 참고로닷넷프레임워크 4에서제공하는 System. Tuple 타입은 class로정의된반면닷넷프레임워크 4.7에서새롭게제공하는 System.ValueTuple 은 struct로정의돼있다는차이점이있다 ( 다른말로하면, System.Tuple은참조형식이고 System. ValueTuple은값형식이다 ). 12 장. C#

15 12.4 Deconstruct 메서드 튜플의반환값을분해하는구문은원한다면여러분이만든타입에도 Deconstruct 라는이름의특별한 메서드를 1 개이상정의해구현할수있다. 이때분해가되는개별값을 out 매개변수를이용해처리 하면된다. 문법은다음과같다. 접근 _ 제한자 void Deconstruct(out T1 x1,..., out Tn xn)... T1 ~ Tn 은분해될값을담을타입. out 매개변수이므로반드시값을채워서반환해야함. 다음은분해메서드를정의한클래스이고, class Rectangle public int X get; public int Y get; public int Width get; public int Height get; public Rectangle(int x, int y, int width, int height) X = x; Y = y; Width = width; Height = height; public void Deconstruct(out int x, out int y) x = X; y = Y; public void Deconstruct(out int x, out int y, out int width, out int height) x = X; y = Y; width = Width; 부 _ C# 고급문법

16 height = Height; 튜플의분해에서본것과같이그대로사용할수있다. Rectangle rect = new Rectangle(5, 6, 20, 25); (int x, int y) = rect; Console.WriteLine($"x == x, y == y"); // 출력결과 : x == 5, y == 6 (int _, int _) = rect; // 의미없는구문이지만. (int _, int y) = rect; Console.WriteLine($"y == y"); // 출력결과 : y == 6 (int x, int y, int width, int height) = rect; Console.WriteLine($"x == x, y == y, width = width, height = height"); // 출력결과 : x == 5, y == 6, width = 20, height = 25 (int _, int _, int _, int _) = rect; // 의미없는구문이지만. (int _, int _, int w, int h) = rect; Console.WriteLine($"w == w, h == h"); // 출력결과 : w == 20, h == 25 (var _, var _, var _, var last) = rect; Console.WriteLine($"last == last"); // 출력결과 : last == 장. C#

17 12.5 람다식을이용한메서드정의확대 (Expression-bodied members) C# 6.0 의 11.2 절 람다식을이용한메서드, 속성및인덱서정의 에서람다식으로메서드의정의가 가능했던유형은다음과같다. 일반메서드 속성의 get 접근자 ( 읽기전용으로처리됨 ) 인덱서의 get 접근자 ( 읽기전용으로처리됨 ) C# 7.0 부터는람다식의접근이다음의메서드정의까지확장됐다. 생성자 (Constructor) 소멸자 (Destructor) 이벤트의 add/remove 속성의 set 구문 인덱서의 set 구문 하지만 C# 6.0에서와마찬가지로단일식 (expression) 인경우에만가능하다는제약은그대로존재한다. 다음은예제 11.1 람다식을이용한메서드본문구현 에서는불가능했던메서드유형에대한람다식메서드정의를추가한것이다. public class Vector double x; double y; public Vector(double x) => this.x = x; // 생성자정의가능 public Vector(double x, double y) // 생성자이지만 2개의문장이므로람다식으로정의불가 this.x = x; this.y = y; 부 _ C# 고급문법

18 ~Vector() => Console.WriteLine("~dtor()"); // 소멸자정의가능 public double X get => x; set => x = value; // 속성의 set 접근자정의가능 public double Y get => y; set => y = value; // 속성의 set 접근자정의가능 public double this[int index] get => (index == 0)? x : y; set => _ = (index == 0)? x = value : y = value; // 인덱서의 set 접근자정의가능 private EventHandler positionchanged; public event EventHandler PositionChanged // 이벤트의 add/remove 접근자정의가능 add => this.positionchanged += value; remove => this.positionchanged -= value; public Vector Move(double dx, double dy) x += dx; y += dy; positionchanged?.invoke(this, EventArgs.Empty); return this; public void PrintIt() => Console.WriteLine(this); public override string ToString() => string.format("x = 0, y = 1", x, y); 12 장. C#

19 12.6 지역함수 (Local functions) 메서드의편리한정의를위해 C# 에서는이미다음과같은구문을정의하고있다. C# 절의익명메서드 C# 절의람다식 이런노력에도불구하고 C# 7.0에는메서드안에서만호출가능한메서드를 1개이상정의할수있는지역함수문법을추가했다. 문법은메서드정의와완전히같고단지다른메서드의내부에서정의한다는차이점만있다. 예를들어, 정수나눗셈을수행하는기능을우선익명메서드로정의해보자. delegate (bool, int) MyDivide(int a, int b); // 사용할익명메서드에대한델리게이트정의 void AnonymousMethodTest() MyDivide func = delegate (int a, int b) if (b == 0) return (false, 0); return (true, a / b); ; Console.WriteLine(func(10, 5)); Console.WriteLine(func(10, 0)); // 출력결과 (True, 2) (False, 0) 이코드의문제점은익명메서드를정의할때마다해당메서드에부합하는델리게이트가반드시정의 돼있어야한다는점이다. 이를람다식으로바꾼다해도코드만약간간편해질뿐여전히델리게이트 가있어야한다는사실에는변함이없다 부 _ C# 고급문법

20 delegate (bool, int) MyDivide(int a, int b); // 사용할람다식에대한델리게이트정의 void LambdaMethodTest() MyDivide func = (a, b) => if (b == 0) return (false, 0); return (true, a / b); ; Console.WriteLine(func(10, 5)); 하지만이것을지역함수로바꾸면델리게이트정의와상관없이사용할수있다는편리함이있다. void LocalFuncTest() (bool, int) func(int a, int b) if (b == 0) return (false, 0); return (true, a / b); ; Console.WriteLine(func(10, 5)); 또한메서드가단일식으로정의될수있으면 11.2 절의내용대로람다식으로정의하는것도가능하다. void LocalLambdaFuncTest() (bool, int) func(int a, int b) => (b == 0)? (false, 0) : (true, a / b); Console.WriteLine(func(10, 5)); 참고로지역함수에대해 C# 컴파일러는소스코드를 internal 접근자를가진메서드로정의해타입내 에자동으로추가한다. 단지이때의메서드이름이컴파일러에의해정해진임의의이름을사용하기 12 장. C#

21 때문에다른곳에서부를수없는것뿐이다. 따라서리플렉션을이용해다소억지스럽지만원한다면 호출이가능하다 사용자정의 Task 타입을 async 메서드의반환타입으로사용가능 C# 5.0부터구현된 async 예약어가붙는메서드는반환타입이반드시 void, Task, Task<T> 중의하나여야만했다. 달리말하면수많은비동기시나리오에서개발자가최적화할수있는여지를닫아버린것이다. 실제로마이크로소프트에서구현한 async 메서드는성능상불이익이발생할수있다. 예를들어, async 예약어가적용되면 C# 컴파일러는자동으로 Task 객체를사용하도록코드를변환하는데 async 메서드내에서 await을호출하지않아비동기로처리될필요가없을때조차도 Task 객체가생성되어성능상불이익을받게된다는문제점이발생한다. 이번절의내용을실습하려면반드시 NuGet 패키지관리자로부터 System.Threading.Tasks.Extensions 를참조추가해야한다. 이를위해 도구 (Tools) NuGet 패키지관리자 (NuGet Package Manager) 패키지관리자콘솔 (Package Manager Console) 메뉴를선택하면나오는창에서다음과같은명령을실행한다. PM> Install-Package System.Threading.Tasks.Extensions -Version C# 7.0부터는사용자정의 Task 타입을구현하고이를 async의반환타입으로사용할수있도록허용한다. 물론이런타입을직접만드는방법이그리쉽지는않기때문에범용적으로확산되지는않겠지만확장이가능하다는면에서충분히의미를둘만하다. 게다가마이크로소프트는사용자정의 Task 타입의한사례로값형식 (struct) 의 ValueTask<T> 타입을구현했는데바로이타입이 async 메서드내에서 await을호출하지않았을때불필요한 Task 객체생성을생략함으로써성능향상을이뤄낸대표적인경우다. 그럼 ValueTask<T> 의구체적인차이점을이해하기위해 async 메서드에서값을반환하는메서드를추가하는예제로시작해보자. using System; using System.IO; using System.Threading; using System.Threading.Tasks; 부 _ C# 고급문법

22 class Program static void Main(string[] args) Task<(string, int tid)> result = FileReadAsync(@"C:\windows\system32\drivers\etc\HOSTS"); int tid = Thread.CurrentThread.ManagedThreadId; Console.WriteLine($"MainThreadID: tid, AsyncThreadID: result.result.tid"); private static async Task<(string, int)> FileReadAsync(string filepath) string filetext = await ReadAllTextAsync(filePath); return (filetext, Thread.CurrentThread.ManagedThreadId); static Task<string> ReadAllTextAsync(string filepath) return Task.Factory.StartNew(() => return File.ReadAllText(filePath); ); // 출력결과 MainThreadID: 1, AsyncThreadID: 3 보다시피 FileReadAsync 메서드의 return 문은그전의 await 호출로인해비동기처리되어 3 번스 레드에서실행됐고이후 Main 메서드의 Console.WriteLine 코드는원래의 1 번스레드에서실행됐 다. 이제 FileReadAsync 코드를다음과같이고쳐보자. static string _filecontents = string.empty; private static async Task<(string, int)> FileReadAsync(string filepath) if (string.isnullorempty(_filecontents) == false) 12 장. C#

23 return (_filecontents, Thread.CurrentThread.ManagedThreadId); _filecontents = await ReadAllTextAsync(filePath); return (_filecontents, Thread.CurrentThread.ManagedThreadId); // FileReadAsync 메서드를두번호출해출력한결과 MainThreadID: 1, AsyncThreadID: 3 MainThreadID: 1, AsyncThreadID: 1 위의메서드는첫번째로호출한경우에는 await의호출로비동기처리되지만두번째호출부터는 await 코드를실행하지않고동기방식으로호출을완료한다. 하지만그래도 Task<T> 객체가생성된다는점에는변함이없다. C# 7.0부터이메서드를다음과같이개선할수있다. ValueTask<(string, int tid)> result = FileReadAsync(@"C:\windows\system32\drivers\etc\HOSTS"); int tid = Thread.CurrentThread.ManagedThreadId; Console.WriteLine($"MainThreadID: tid, AsyncThreadID: result.result.tid"); private static async ValueTask<(string, int)> FileReadAsync(string filepath) if (string.isnullorempty(_filecontents) == false) return (_filecontents, Thread.CurrentThread.ManagedThreadId); _filecontents = await ReadAllTextAsync(filePath); return (_filecontents, Thread.CurrentThread.ManagedThreadId); 부 _ C# 고급문법

24 사용법은단순히 Task<T> 를 ValueTask<T> 로바꾼것뿐이지만 FileReadAsync 메서드를첫번째로호출한경우에만 ValueTask<T> 가내부적으로 Task<T> 객체를생성해처리하고두번째호출의경우 await 호출을수행하지않으므로 Task<T> 객체생성없이 ValueTask<T> 단독으로처리함으로써비동기호출의성능을향상시킨다 자유로워진 throw 사용 throw 구문은 3.5절의제어문과마찬가지로식 (expression) 이아닌문 (statement) 에해당한다. 이때문에표현식에서의사용이제한됐으므로 C# 6.0 이전에는이럴때 throw를포함한별도의메서드를만들어호출하는방법으로해결해야만했다. 가령다음코드는컴파일시 잘못된식의항 throw 입니다 (Invalid expression term throw ) 라는오류가발생하므로 public bool Assert(bool result) => #if DEBUG result == true? result : throw new ApplicationException("ASSERT"); #else result; #endif 다음과같이메서드를이용해우회해서 throw 를해야만했다. public bool Assert(bool result) => #if DEBUG result == true? result : AssertException("ASSERT"); #else result; #endif public bool AssertException(string msg) throw new ApplicationException(msg); 12 장. C#

25 하지만 C# 7.0 부터는 throw 가의미있게사용될만한식에서허용이되도록바뀌었다. 따라서위코 드를다음과같이변경해서컴파일할수있다. public void Assert(bool result) => #if DEBUG _ = result == true? result : throw new ApplicationException("ASSERT"); #else _ = result; #endif 이밖에도다음예제코드에서볼수있는것처럼 null 병합연산자 (??) 와람다식을사용할수있는곳 에서 throw 를사용할수있다. (C# 6.0 에서는모두컴파일오류가발생하는코드다 ). class Person public string Name get; // 7.2 절의 null 병합연산자 (??) 에서 throw 사용가능 public Person(string name) => Name = name?? throw new ArgumentNullException(nameof(name)); // 11.2 절의람다식으로정의된메서드에서사용가능 public string GetLastName() => throw new NotImplementedException(); public void Print() // 절의단일람다식을이용한델리게이트정의에서사용가능 Action action = () => throw new Exception(); action(); 그렇다고해서 throw 가문에서식으로완전히바뀐것은아니므로표현식이허용되는모든곳에서사 용할수는없다. 대신 throw 가허용되지않는곳에서는명시적으로다음과같은컴파일에러가발생 한다. error CS8115: 이컨텍스트에서는 throw 식을사용할수없습니다. error CS8115: A throw expression is not allowed in this context 부 _ C# 고급문법

26 12.9 리터럴에대한표현방법개선 (Literal improvements) 보통숫자데이터가길어지면코드에적거나읽을때상대적으로가독성이떨어진다. 가령정수로 1천만을담는변수를정의하려고할때 값을기입하는것보다 10,000,000과같이쓰는것이가독성측면에서더좋을수밖에없다. 아쉽게도콤마 (,) 기호를쓸수는없지만 C# 7.0부터숫자내의임의의위치에밑줄을추가할수있도록허용하고있다. int number1 = ; // 1천만인지한눈에인식이안됨 int number2 = 10_000_000; // 세자리마다띄어한눈에 1천만임을알수있음 int number3 = 1_0_0_0_0_000; // 잘쓰진않겠지만이런식으로도가능 숫자데이터에적용할수있기때문에 16 진수로표현했을때도사용가능하다. uint hex1 = 0xFFFFFFFF; uint hex2 = 0xFF_FF_FF_FF; // 1 바이트마다띄어서표현 uint hex3 = 0xFFFF_FFFF; // 2 바이트마다띄어서표현 이와함께 2 진비트열의리터럴표현도추가됐다. 접두사로 0b 를사용하며, 역시밑줄과함께쓰면가 독성높은 2 진비트열을정의하는것이가능하다. // 숫자 4369 를표현한 2 진비트열 uint bin1 = 0b ; // 2 진비트열로숫자데이터정의 uint bin2 = 0b0001_0001_0001_0001; // 4 자리마다구분자를사용해가독성을높임 패턴매칭 패턴매칭이란단어는흔히다음과같이사용되곤한다. 이미지에대한패턴매칭 문자열에대한패턴매칭 C# 언어에서의패턴매칭이라는단어를이해하려면위와같이 ~ 에대한 으로생각하면된다. 실제로 이번절의패턴매칭제목을다음과같이정의하고바라보면 12 장. C#

27 객체에대한패턴매칭 이후설명할내용을좀더직관적으로이해하는데도움될것이다. 우선 C# 7.0 부터추가된패턴매칭유형은크게다음과같이세가지 2 로나뉜다. 상수패턴 (Constant patterns) 타입패턴 (Type patterns) Var 패턴 (Var patterns) 각패턴은 객체에대해 상수값인지아니면주어진어떤타입과일치 (match) 하는지테스트할수있 다. 그리고위의세가지패턴을 C# 코드에적용할수있도록기존의 is 예약어와 switch/case 구문이 확장된다 is 연산자의패턴매칭 is 연산자는기존기능에서패턴매칭을지원하기위해 as 연산자의기능을흡수했다. 예를들어, as 연산자는기존의 is 연산자와는달리변환결과를포함할수있어서변환여부만알수있었던 is 연산자보다더자주사용되곤했다. object obj = new List<string>(); List<string> list = obj as List<string>; list?.foreach((e) => Console.WriteLine(e)); 하지만 C# 7.0 부터는 is 연산자가위에서했던 as 연산자와동일한역할을수행할수있다. if (obj is List<string> list) list.foreach((e) => Console.WriteLine(e)); 물론기존의 is 연산자처럼타입만비교하는것도여전히가능하다. 2 패턴매칭이가능한유형은이후의 C# 버전에서늘어날예정이다. 일례로 C# 7.1 에는이미제네릭에대한패턴매칭을포함하고있다 (13.4 절참고 ) 부 _ C# 고급문법

28 if (obj is List<string>) [ 생략 ] 즉, is 연산자가대상타입에대한비교를할수있었던것과함께그뒤에변수명을추가할수있게만듦으로써 as 연산자의기능까지포함하게된것이다. 이렇게강화된 is 연산자는세가지패턴매칭유형을모두사용할수있지만그중에서상수패턴과타입패턴만이의미가있다. 다음은그두가지패턴유형을사용한예다. 예제 12.1 is 연산자를이용한상수패턴과타입패턴사례 object[] objlist = new object[] 100, null, DateTime.Now, new ArrayList() ; foreach (object item in objlist) if (item is 100) // 상수패턴 Console.WriteLine(item); else if (item is null) // 상수패턴 Console.WriteLine("null"); else if (item is DateTime dt) // 타입패턴 ( 값형식 ) 필요없다면 dt 변수생략가능 Console.WriteLine(dt); else if (item is ArrayList arr) // 타입패턴 ( 참조형식 ) 필요없다면 arr 변수생략가능 Console.WriteLine(arr.Count); // 출력결과 100 null 오후 7:07:58 0 의미가없다고했던 Var 패턴의사용법을알아보자. 참고로 Var 패턴의경우반드시변수명을함께써 야한다. 12 장. C#

29 if (item is var elem) // 타입패턴과는달리변수명을생략할수없다. Console.WriteLine(elem); // 단지변수가필요없는경우밑줄로대체가능 if (item is var _ ) var 예약어의의미상 item 변수는무조건 var 타입에일치하게되어 if 문에사용하는경우항상 true 로평가된다. 위코드를 C# 7.0 컴파일러가변환한코드를보면왜 Var 패턴이 is 연산자에서의미가 없는지더욱분명하게알수있다. object elem = item; if (true) Console.WriteLine(elem); 예상했던대로항상 true 가되는조건이기때문에 is 연산자에서 Var 패턴은적당한사용용도를찾을 수없다. 아무리좋게말해도단순히변수명을 item 에서 elem 으로바꿔주는역할만할뿐이다 switch/case 문의패턴매칭 절에서배운 switch 문은 C# 7.0 에서패턴매칭의적용으로문법이바뀐다. switch ( 인스턴스 ) case 패턴 _ 매칭 _ 식1 : 구문 ; break; [ 임의의 case 문반복 ] case 패턴 _ 매칭 _ 식n: 구문 ; break; 부 _ C# 고급문법

30 default: 구문 ; break; 설명 : 인스턴스의값과컴파일또는실행시에결정되는 case 의패턴 _ 매칭 _ 식결괏값이일치하는경우해당 case 에속한구 문을실행한다. 나열된 case 의패턴 _ 매칭 _ 식에일치하는값이없다면 default 에지정된구문의코드를실행한다. 인스턴스의타입유형에는제약이없다. 이로인해 C# 6.0 이전까지는일부 if 문의특수한경우에만 switch 문으로변경할수있었는데 C# 7.0 부터는모든 if 문을 switch 문으로변경할수있고그반대도가능하다. case 조건의패턴매칭문법은기본적으로 is 연산자와같다. 예제 12.1의 is 연산자예제를 switch/ case로바꾸는경우 is만뺐을뿐패턴매칭을위한코드가완전히같음을알수있다. foreach (object item in objlist) switch (item) case 100: // 상수패턴 break; case null: // 상수패턴 break; case DateTime dt: // 타입패턴 ( 값형식 ) 필요없다면 dt 변수생략가능 break; case ArrayList arr: // 타입패턴 ( 참조형식 ) 필요없다면 arr 변수생략가능 break; case var elem: // Var 패턴 ( 이렇게사용하면 default 와동일 ) break; 12 장. C#

31 그런데 case 조건의패턴매칭에는한가지혜택이더있는데바로 when 예약어를추가해조건을한번더검사할수있다는것이다. case 조건에서의 when 예약어기능은 11.8절 예외필터 에서다룬 when의사용법과일치한다. when의추가로 if 문의다음과같은조건도 int j = GetIntegerResult(); if (j > 300) // j 값이 300보다큰경우 else switch 에서처리할수있게됐다. switch (j) case int i when i > 300: // int 타입이고그값이 300보다큰경우 break; default: break; case 조건의 when 예약어추가는 (is 연산자에서는쓸모없었던 ) Var 패턴에또다른생명력을불어넣어주는데, 바로사용자정의패턴매칭구현을가능하게한다는점이다. 즉, 일단 Var 패턴으로받고 when을사용해어떠한조건이라도설정할수있게만들수있다. 가령, 어떤문자열이네이버의홈페이지에포함돼있는지다음 (daum) 의홈페이지에포함돼있는지에대한조건을다음과같이설정할수있다. // 기존에는아래와같은조건은 if 문을통해서만가능했지만 // 이젠 switch/case로도처리할수있다. string text = " "; switch (text) 부 _ C# 고급문법

32 case var item when (ContainsAt(item, " Console.WriteLine("In Naver"); break; case var item when (ContainsAt(item, " Console.WriteLine("In Daum"); break; default: Console.WriteLine("None"); break; private static bool ContainsAt(string item, string url) WebClient wc = new WebClient(); wc.encoding = Encoding.UTF8; string text = wc.downloadstring(url); return text.indexof(item)!= -1; 이정도면 case 에만 when 을허용한것이 is 연산자로써는아쉬울따름이다. 이쯤에서함수형프로그래밍언어인 F# 의패턴매칭과살짝비교해보자. // F# 예제코드 // let detectzeroor point = match point with (0, 0) (0, _) (_, 0) -> printfn "Zero found." _ -> printfn "Both nonzero." detectzeroor (0, 0) detectzeroor (1, 0) detectzeroor (0, 10) detectzeroor (10, 15) 12 장. C#

33 위의 F# 코드는 2 개의값중에서하나라도 0 을포함한다면 Zero found. 를출력하고, 없다면 Both nonzero. 를출력한다. 이를 C# 의패턴매칭으로바꾸면다음과같이구현할수있다. Action<(int, int)> detectzeroor = (arg) => switch (arg) case var r when r.equals((0, 0)): case var r1 when r1.item1 == 0: case var r2 when r2.item2 == 0: Console.WriteLine("Zero found."); return; ; Console.WriteLine("Both nonzero."); detectzeroor((0, 0)); detectzeroor((1, 0)); detectzeroor((0, 10)); detectzeroor((10, 15)); 코드의간결함에있어서는 F# 을따라갈순없지만그런대로 C# 에서도유사하게처리할수있어 C# 6.0 이전보다더유연한프로그래밍이가능해진다. 마지막으로, 패턴매칭이적용되면서 case 의평가순서를다시한번확인해둘필요가있다. default 절은그위치에상관없이항상마지막에평가된다. case의순서가중요해지는데상위의 case 조건에서이미만족한다면그절의코드가실행되고그하위의 case 조건 에대한평가는무시된다 부 _ C# 고급문법

34 13 C# 7.1 C# 언어에대한로드맵문서 1 에따르면 C# 7.1 에는 5 가지기능이예정돼있다. Async Main Default Expressions Ref Assemblies Infer tuple names Pattern-matching with generics 이가운데 Ref Assemblies 를제외한 4개의기능에대해서는 2017년 8월 18일 2 에업데이트된비주얼스튜디오 2017의 버전부터제공된다. 하지만기본컴파일러로는아직 7.1로설정돼있지않으므로프로젝트설정창에서별도로지정해야만한다. 따라서이번장을실습하려면 C# 프로젝트를만든후프로젝트설정창의 빌드 (Build) 고급 (Advanced) 버튼을눌러나오는 고급빌드설정 (Advanced Build Settings) 창에서다음과같이 언어버전 (Language version) 값을 C# 7.1 로바꿔야한다 비주얼스튜디오 의릴리스노트를통해 C# 7.1 의 4 가지기능이추가됐다는사실을 8 월 20 일에이책의 7.0 원고를마치며알게됐다. 13 장. C#

35 참고로컴퓨터에설치된비주얼스튜디오의버전을알고싶다면 도움말 (Help) Microsoft Visual Studio 정보 (About Microsoft Visual Studio) 메뉴를선택해서확인할수있다 부 _ C# 고급문법

36 13.1 Main 메서드에 async 예약어허용 C# 7.0 까지 Main 메서드에는 async 예약어를적용할수없었다. 왜냐하면 절에서설명한대 로 Main 메서드는다음과같은유형만가능하기때문이다. static void Main() static void Main(string[]) static int Main() static int Main(string[]) 즉 async 예약어를적용할수없는 Main 메서드는 await 호출을할수없어다음과같은식으로우회 해서사용해야만했다. static void Main(string[] args) MainAsync(); // 별도의 async 메서드를만들어호출 private static async Task MainAsync() WebClient wc = new WebClient(); string text = await wc.downloadstringtaskasync(" Console.WriteLine(text); 그런데위코드를컴파일하면경고가발생한다. CS4014: 이호출이대기되지않으므로호출이완료되기전에현재메서드가계속실행됩니다. 호출결과에 'await' 연산자를적용해보세요. CS4014: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call. 경고메시지에나오는조언과는달리 Main 메서드는 async 예약어가허용된메서드가아니므로경고 에따라 await 을 MainAsync 에붙이는것도불가능하다. 그래서이와같은경고를없애기위해다음 과같이코드를변경해실행하는방법을권장한다. 13 장. C#

37 static void Main(string[] args) MainAsync().GetAwaiter().GetResult(); 이같은우회방법을뒤로하고, 결국마이크로소프트는 C# 7.1 부터 async 를허용하도록바꾸어이러 한모든부자연스러운문제를깔끔하게해결한다. static async Task Main(string [] args) WebClient wc = new WebClient(); string text = await wc.downloadstringtaskasync(" Console.WriteLine(text); 참고로표현식하나로도호출이가능하다면람다식유형으로정의하는것도가능하다. static async Task Main(string[] args) => Console.WriteLine(await new WebClient(). DownloadStringTaskAsync(" 정리하자면, C# 7.1 부터다음과같은새로운유형의 Main 메서드정의가가능하다. static async Task Main() static async Task Main(string[]) static async Task<int> Main() static async Task<int> Main(string[]) 13.2 default 리터럴추가 C# 2.0 부터구현됐던 default 예약어에대해 C# 7.1 부터는타입추론이가능해져서리터럴형식으 로쓸수있게바뀐다. 실제로 7.3 절의 default 예약어를설명하기위해만든모든예제코드에대해 default(type) 형식이아닌 default 로바꿔도그대로컴파일이가능하다 부 _ C# 고급문법

38 static void Main(string[] args) int intvalue = default; // int로대입된다는것을알수있으므로 BigInteger bigintvalue = default; // BigInteger로대입되므로 Console.WriteLine(intValue); // 출력결과 : 0 Console.WriteLine(bigIntValue); // 출력결과 : 0 string txt = default; // string 타입의기본값을반환 Console.WriteLine(txt?? "(null)"); // 출력결과 : (null) C# 컴파일러입장에서는 default 대상이되는타입을추론할수있으므로굳이타입을지정할필요가 없는것이다. 마찬가지로제네릭인자에도 default 리터럴을쓸수있다. static void Main(string[] args) GenericTest<int> t = new GenericTest<int>(); Console.WriteLine(t.GetDefaultValue()); // 출력결과 : 0 class GenericTest<T> public T GetDefaultValue() return default; // C# 7.0 이전에는 default(t) 로반환 13.3 타입추론을통한튜플의변수명자동지정 default 예약어에대한타입추론과함께 C# 7.1 부터는튜플의변수명에대해서도타입추론을활용 해사용의편의성을높였다. 가령 C# 7.0 에서다음과같이튜플을만드는경우, 13 장. C#

39 int age = 20; string name = "Kevin Arnold"; (int, string) person = (age, name); Console.WriteLine($"person.Item1, person.item2"); Item1, Item2 이름을없애기위해서는명시적으로이름을지정해야한다. (int age, string name) person = (age, name); Console.WriteLine($"person.age, person.name"); 하지만 C# 7.1 부터는튜플에대입된변수명을타입추론을통해알수있으므로다음과같이이름을 자동으로붙여주는것으로바뀌었다. int age = 20; string name = "Kevin Arnold"; var t = (age, name); Console.WriteLine($"t.age, t.name"); 물론추론이안되는필드에대해서는예전처럼 Item1, Item2, 순으로매겨진다. var person = new Age = 30, Name = "Winnie Cooper" ; var t = (25, person.name); Console.WriteLine($"t.Item1, t.name"); 튜플에대한이같은지원은 8.9 절에서배운 LINQ 구문을좀더자연스럽게만들어준다. 가령 LINQ 의 select 를통해익명타입을반환하는다음의예제를보자. List<Person> people = new List<Person> new Person Name = "Tom", Age = 63, Address = "Korea", new Person Name = "Winnie", Age = 40, Address = "Tibet", new Person Name = "Anders", Age = 47, Address = "Sudan", 부 _ C# 고급문법

40 ; new Person Name = "Hans", Age = 25, Address = "Tibet", new Person Name = "Eureka", Age = 32, Address = "Sudan", new Person Name = "Hawk", Age = 15, Address = "Korea", var datelist = from person in people select new Name = person.name, Year = DateTime.Now.AddYears(-person.Age).Year ; foreach (var item in datelist) Console.WriteLine(string.Format("0-1", item.name, item.year)); class Person public string Name get; set; public int Age get; set; public string Address get; set; 우선익명타입의번거로움을튜플을사용하면다음과같이간결하게바꿀수있다. var datelist = from person in people select (person.name, DateTime.Now.AddYears(-person.Age).Year); foreach (var item in datelist) Console.WriteLine(string.Format("0-1", item.item1, item.item2)); 하지만대개의경우위의코드에서 Item1 과 Item2 대신이름을지정하고싶을텐데그럼코드가다소 번거로워진다. var datelist2 = from person in people select (Name: person.name, Year: DateTime.Now.AddYears(-person.Age).Year); foreach (var item in datelist2) 13 장. C#

41 Console.WriteLine(string.Format("0-1", item.name, item.year)); 바로이때 C# 7.1 부터는타입추론을통해튜플내에지정된속성의이름을그대로가져오므로다음 과같이쓸수있다. var datelist = from person in people select (person.name, DateTime.Now.AddYears(-person.Age).Year); foreach (var item in datelist) Console.WriteLine(string.Format("0-1", item.name, item.year)); 13.4 패턴매칭 제네릭추가 C# 7.0 컴파일러에추가된 절의패턴매칭은제네릭인자에대한패턴매칭구문을허용하지않 는다. 예를들어, 다음코드는 C# 7.0 에서컴파일오류가발생한다. static void Main(string[] args) WriteLog(DateTime.Now); WriteLog(DateTime.UtcNow); // 제네릭인자의객체는 is 연산자와 switch/case 패턴매칭구문에서허용되지않으므로 // 컴파일오류발생 (C# 7.0) public static void WriteLog<T>(T item) if (item is DateTime time) Console.WriteLine(time.ToString()); 부 _ C# 고급문법

42 switch (item) case DateTime dt when dt.kind == DateTimeKind.Utc: Console.WriteLine(dt.ToLocalTime()); break; case DateTime dt when dt.kind == DateTimeKind.Unspecified: Console.WriteLine("Invalid DateTime Kind"); break; case DateTime dt: Console.WriteLine(dt); break; 하지만약속했던대로 C# 7.1 부터제네릭에대한패턴매칭이가능하기때문에정상적으로컴파일 된다. 13 장. C#

PowerPoint Presentation

PowerPoint Presentation 객체지향프로그래밍 클래스, 객체, 메소드 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 필드만있는클래스 텔레비젼 2 예제 1. 필드만있는클래스 3 예제 2. 여러개의객체생성하기 4 5 예제 3. 메소드가추가된클래스 public class Television { int channel; // 채널번호 int volume; // 볼륨 boolean

More information

PowerPoint Presentation

PowerPoint Presentation Class - Property Jo, Heeseung 목차 section 1 클래스의일반구조 section 2 클래스선언 section 3 객체의생성 section 4 멤버변수 4-1 객체변수 4-2 클래스변수 4-3 종단 (final) 변수 4-4 멤버변수접근방법 section 5 멤버변수접근한정자 5-1 public 5-2 private 5-3 한정자없음

More information

gnu-lee-oop-kor-lec06-3-chap7

gnu-lee-oop-kor-lec06-3-chap7 어서와 Java 는처음이지! 제 7 장상속 Super 키워드 상속과생성자 상속과다형성 서브클래스의객체가생성될때, 서브클래스의생성자만호출될까? 아니면수퍼클래스의생성자도호출되는가? class Base{ public Base(String msg) { System.out.println("Base() 생성자 "); ; class Derived extends Base

More information

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - CSharp-10-예외처리 10 장. 예외처리 예외처리개념 예외처리구문 사용자정의예외클래스와예외전파 순천향대학교컴퓨터학부이상정 1 예외처리개념 순천향대학교컴퓨터학부이상정 2 예외처리 오류 컴파일타임오류 (Compile-Time Error) 구문오류이기때문에컴파일러의구문오류메시지에의해쉽게교정 런타임오류 (Run-Time Error) 디버깅의절차를거치지않으면잡기어려운심각한오류 시스템에심각한문제를줄수도있다.

More information

슬라이드 1

슬라이드 1 -Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역

More information

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint 자바-기본문법(Ch2).pptx 자바기본문법 1. 기본사항 2. 자료형 3. 변수와상수 4. 연산자 1 주석 (Comments) 이해를돕기위한설명문 종류 // /* */ /** */ 활용예 javadoc HelloApplication.java 2 주석 (Comments) /* File name: HelloApplication.java Created by: Jung Created on: March

More information

JAVA PROGRAMMING 실습 08.다형성

JAVA PROGRAMMING 실습 08.다형성 2015 학년도 2 학기 1. 추상메소드 선언은되어있으나코드구현되어있지않은메소드 abstract 키워드사용 메소드타입, 이름, 매개변수리스트만선언 public abstract String getname(); public abstract void setname(string s); 2. 추상클래스 abstract 키워드로선언한클래스 종류 추상메소드를포함하는클래스

More information

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D> Power Java 제 8 장클래스와객체 I 이번장에서학습할내용 클래스와객체 객체의일생직접 메소드클래스를 필드작성해 UML 봅시다. QUIZ 1. 객체는 속성과 동작을가지고있다. 2. 자동차가객체라면클래스는 설계도이다. 먼저앞장에서학습한클래스와객체의개념을복습해봅시다. 클래스의구성 클래스 (class) 는객체의설계도라할수있다. 클래스는필드와메소드로이루어진다.

More information

PowerPoint Presentation

PowerPoint Presentation public class SumTest { public static void main(string a1[]) { int a, b, sum; a = Integer.parseInt(a1[0]); b = Integer.parseInt(a1[1]); sum = a + b ; // 두수를더하는부분입니다 System.out.println(" 두수의합은 " + sum +

More information

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap06-2pointer.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.

More information

Modern Javascript

Modern Javascript ES6 - Arrow Function Class Template String Destructuring Default, Rest, Spread let, const for..of Promises Module System Map, Set * Generator * Symbol * * https://babeljs.io/ Babel is a JavaScript compiler.

More information

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 (   ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각 JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( http://java.sun.com/javase/6/docs/api ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각선의길이를계산하는메소드들을작성하라. 직사각형의가로와세로의길이는주어진다. 대각선의길이는 Math클래스의적절한메소드를이용하여구하라.

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 실습 1 배효철 th1g@nate.com 1 목차 조건문 반복문 System.out 구구단 모양만들기 Up & Down 2 조건문 조건문의종류 If, switch If 문 조건식결과따라중괄호 { 블록을실행할지여부결정할때사용 조건식 true 또는 false값을산출할수있는연산식 boolean 변수 조건식이 true이면블록실행하고 false 이면블록실행하지않음 3

More information

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt 변수와상수 1 변수란무엇인가? 변수 : 정보 (data) 를저장하는컴퓨터내의특정위치 ( 임시저장공간 ) 메모리, register 메모리주소 101 번지 102 번지 변수의크기에따라 주로 byte 단위 메모리 2 기본적인변수형및변수의크기 변수의크기 해당컴퓨터에서는항상일정 컴퓨터마다다를수있음 short

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 제 5 장생성자와접근제어 1. 객체지향기법을이해한다. 2. 클래스를작성할수있다. 3. 클래스에서객체를생성할수있다. 4. 생성자를이용하여객체를초기화할수 있다. 5. 접근자와설정자를사용할수있다. 이번장에서만들어볼프로그램 생성자 생성자 (constructor) 는초기화를담당하는함수 생성자가필요한이유 #include using namespace

More information

11장 포인터

11장 포인터 누구나즐기는 C 언어콘서트 제 9 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1, 변수와메모리

More information

PowerPoint Presentation

PowerPoint Presentation 객체지향프로그래밍 인터페이스, 람다식, 패키지 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 홈네트워킹 public interface RemoteControl { public void turnon(); // 가전제품을켠다. public void turnoff(); // 가전제품을끈다. 인터페이스를구현 public class Television

More information

OCW_C언어 기초

OCW_C언어 기초 초보프로그래머를위한 C 언어기초 4 장 : 연산자 2012 년 이은주 학습목표 수식의개념과연산자및피연산자에대한학습 C 의알아보기 연산자의우선순위와결합방향에대하여알아보기 2 목차 연산자의기본개념 수식 연산자와피연산자 산술연산자 / 증감연산자 관계연산자 / 논리연산자 비트연산자 / 대입연산자연산자의우선순위와결합방향 조건연산자 / 형변환연산자 연산자의우선순위 연산자의결합방향

More information

쉽게

쉽게 Power Java 제 4 장자바프로그래밍기초 이번장에서학습할내용 자바프로그램에대한기초사항을학습 자세한내용들은추후에. Hello.java 프로그램 주석 주석 (comment): 프로그램에대한설명을적어넣은것 3 가지타입의주석 클래스 클래스 (class): 객체를만드는설계도 ( 추후에학습 ) 자바프로그램은클래스들로구성된다. 그림 4-1. 자바프로그램의구조 클래스정의

More information

금오공대 컴퓨터공학전공 강의자료

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include

More information

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins Project 1-3: Implementing DML Due: 2015/11/11 (Wed), 11:59 PM 이번프로젝트의목표는프로젝트 1-1 및프로젝트 1-2에서구현한프로그램에기능을추가하여간단한 DML을처리할수있도록하는것이다. 구현한프로그램은 3개의 DML 구문 (insert, delete, select) 을처리할수있어야한다. 테이블데이터는파일에저장되어프로그램이종료되어도사라지지않아야한다.

More information

C# Programming Guide - Types

C# Programming Guide - Types C# Programming Guide - Types 최도경 lifeisforu@wemade.com 이문서는 MSDN 의 Types 를요약하고보충한것입니다. http://msdn.microsoft.com/enus/library/ms173104(v=vs.100).aspx Types, Variables, and Values C# 은 type 에민감한언어이다. 모든

More information

JAVA PROGRAMMING 실습 05. 객체의 활용

JAVA PROGRAMMING 실습 05. 객체의 활용 public class Person{ public String name; public int age; } public Person(){ } public Person(String s, int a){ name = s; age = a; } public String getname(){ return name; } @ 객체의선언 public static void main(string

More information

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout <<  양수입력 : ; cin >> *p; if (*p <= 0) cout <<  양수를입력해야합니다  << endl; return; 동적할 15 장기타주제들 auto_ptr 변환함수 cast 연산자에의한명시적형변환실행시간타입정보알아내기 (RTTI) C++ 프로그래밍입문 1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout > *p; if (*p

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 @ Lesson 2... ( ). ( ). @ vs. logic data method variable behavior attribute method field Flow (Type), ( ) member @ () : C program Method A ( ) Method B ( ) Method C () program : Java, C++, C# data @ Program

More information

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,

More information

슬라이드 1

슬라이드 1 정적메모리할당 (Static memory allocation) 일반적으로프로그램의실행에필요한메모리 ( 변수, 배열, 객체등 ) 는컴파일과정에서결정되고, 실행파일이메모리에로드될때할당되며, 종료후에반환됨 동적메모리할당 (Dynamic memory allocation) 프로그램의실행중에필요한메모리를할당받아사용하고, 사용이끝나면반환함 - 메모리를프로그램이직접관리해야함

More information

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - ch07 - 포인터 pm0415 2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 Power Java 제 7 장클래스와객체 이번장에서학습할내용 객체지향이란? 객체 메시지 클래스 객체지향의장점 String 클래스 객체지향개념을완벽하게이해해야만객체지향설계의이점을활용할수있다. 실제세계는객체로이루어진다. 객체지향이란? 실제세계를모델링하여소프트웨어를개발하는방법 절차지향과객체지향 절차지향프로그래밍 (procedural programming): 문제를해결하는절차를중요하게생각하는방법

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Lecture 02 프로그램구조및문법 Kwang-Man Ko kkmam@sangji.ac.kr, compiler.sangji.ac.kr Department of Computer Engineering Sang Ji University 2018 자바프로그램기본구조 Hello 프로그램구조 sec01/hello.java 2/40 자바프로그램기본구조 Hello 프로그램구조

More information

ThisJava ..

ThisJava .. 자바언어에정확한타입을추가한 ThisJava 소개 나현익, 류석영 프로그래밍언어연구실 KAIST 2014 년 1 월 14 일 나현익, 류석영 자바언어에정확한타입을추가한 ThisJava 소개 1/29 APLAS 2013 나현익, 류석영 자바 언어에 정확한 타입을 추가한 ThisJava 소개 2/29 실제로부딪힌문제 자바스크립트프로그램분석을위한요약도메인 나현익,

More information

Contents. 1. PMD ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 2. Metrics ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 3. FindBugs ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 4. ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ

Contents. 1. PMD ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 2. Metrics ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 3. FindBugs ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 4. ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 정적분석서 - 영단어수집왕 - Team.# 3 과목명 소프트웨어모델링및분석 담당교수 유준범교수님 201011320 김용현 팀원 201111360 손준익 201111347 김태호 제출일자 2015-06-09 1 Contents. 1. PMD ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 2. Metrics

More information

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770> 연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.

More information

JAVA PROGRAMMING 실습 09. 예외처리

JAVA PROGRAMMING 실습 09. 예외처리 2015 학년도 2 학기 예외? 프로그램실행중에발생하는예기치않은사건 예외가발생하는경우 정수를 0으로나누는경우 배열의크기보다큰인덱스로배열의원소를접근하는경우 파일의마지막부분에서데이터를읽으려고하는경우 예외처리 프로그램에문제를발생시키지않고프로그램을실행할수있게적절한조치를취하는것 자바는예외처리기를이용하여예외처리를할수있는기법제공 자바는예외를객체로취급!! 나뉨수를입력하시오

More information

JVM 메모리구조

JVM 메모리구조 조명이정도면괜찮조! 주제 JVM 메모리구조 설미라자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조장. 최지성자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조원 이용열자료조사, 자료작성, PPT 작성, 보고서작성. 이윤경 자료조사, 자료작성, PPT작성, 보고서작성. 이수은 자료조사, 자료작성, PPT작성, 보고서작성. 발표일 2013. 05.

More information

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Microsoft PowerPoint - chap03-변수와데이터형.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num %d\n", num); return 0; } 1 학습목표 의 개념에 대해 알아본다.

More information

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher( 실행할페이지.jsp); 다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp"); dispatcher.forward(request, response); - 위의예에서와같이 RequestDispatcher

More information

Microsoft PowerPoint - CSharp-2-기초문법

Microsoft PowerPoint - CSharp-2-기초문법 2 장. C# 기초문법 자료형 제어문 배열 연산자 순천향대학교컴퓨터학부이상정 1 자료형 순천향대학교컴퓨터학부이상정 2 CTS CTS(Common Type System) 닷넷기반의여러언어에서공통으로사용되는자료형 언어별로서로다른자료형을사용할때발생할수있는호환성문제를해결 값 (Value) 형과참조 (Reference) 형을지원 CTS가제공하는모든자료형은 System.Object를상속받아구현

More information

PowerPoint Presentation

PowerPoint Presentation Package Class 3 Heeseung Jo 목차 section 1 패키지개요와패키지의사용 section 2 java.lang 패키지의개요 section 3 Object 클래스 section 4 포장 (Wrapper) 클래스 section 5 문자열의개요 section 6 String 클래스 section 7 StringBuffer 클래스 section

More information

슬라이드 1

슬라이드 1 UNIT 16 예외처리 로봇 SW 교육원 3 기 최상훈 학습목표 2 예외처리구문 try-catch-finally 문을사용핛수있다. 프로그램오류 3 프로그램오류의종류 컴파일에러 (compile-time error) : 컴파일실행시발생 럮타임에러 (runtime error) : 프로그램실행시발생 에러 (error) 프로그램코드에의해서해결될수없는심각핚오류 ex)

More information

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures 단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 Power Java 제 11 장상속 이번장에서학습할내용 상속이란? 상속의사용 메소드재정의 접근지정자 상속과생성자 Object 클래스 종단클래스 상속을코드를재사용하기위한중요한기법입니다. 상속이란? 상속의개념은현실세계에도존재한다. 상속의장점 상속의장점 상속을통하여기존클래스의필드와메소드를재사용 기존클래스의일부변경도가능 상속을이용하게되면복잡한 GUI 프로그램을순식간에작성

More information

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조 - Part2- 제 2 장다차원배열이란무엇인가 학습목차 2.1 다차원배열이란 2. 2 2 차원배열의주소와값의참조 2.1 다차원배열이란 2.1 다차원배열이란 (1/14) 다차원배열 : 2 차원이상의배열을의미 1 차원배열과다차원배열의비교 1 차원배열 int array [12] 행 2 차원배열 int array [4][3] 행 열 3 차원배열 int array [2][2][3]

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 제 3 장함수와문자열 1. 함수의기본적인개념을이해한다. 2. 인수와매개변수의개념을이해한다. 3. 함수의인수전달방법 2가지를이해한다 4. 중복함수를이해한다. 5. 디폴트매개변수를이해한다. 6. 문자열의구성을이해한다. 7. string 클래스의사용법을익힌다. 이번장에서만들어볼프로그램 함수란? 함수선언 함수호출 예제 #include using

More information

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1); void method() 2); void method1() public class Test 3); args) A 제 10 장상속 예제 1) ConstructorTest.java class Parent public Parent() super - default"); public Parent(int i) this("hello"); super(int) constructor" + i); public Parent(char c) this(); super(char) constructor

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소

More information

11장 포인터

11장 포인터 Dynamic Memory and Linked List 1 동적할당메모리의개념 프로그램이메모리를할당받는방법 정적 (static) 동적 (dynamic) 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것 메모리의크기는프로그램이시작하기전에결정 int i, j; int buffer[80]; char name[] = data structure"; 처음에결정된크기보다더큰입력이들어온다면처리하지못함

More information

JAVA PROGRAMMING 실습 02. 표준 입출력

JAVA PROGRAMMING 실습 02. 표준 입출력 # 메소드의구조자주반복하여사용하는내용에대해특정이름으로정의한묶음 반환형메소드이름 ( 매개변수 ) { 실행문장 1; : 실행문장 N; } 메소드의종류 Call By Name : 메서드의이름에의해호출되는메서드로특정매개변수없이실행 Call By Value : 메서드를이름으로호출할때특정매개변수를전달하여그값을기초로실행하는메서드 Call By Reference : 메서드호출시매개변수로사용되는값이특정위치를참조하는

More information

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - [2009] 02.pptx 원시데이터유형과연산 원시데이터유형과연산 원시데이터유형과연산 숫자데이터유형 - 숫자데이터유형 원시데이터유형과연산 표준입출력함수 - printf 문 가장기본적인출력함수. (stdio.h) 문법 ) printf( Test printf. a = %d \n, a); printf( %d, %f, %c \n, a, b, c); #include #include

More information

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2 학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2 6.1 함수프로시저 6.2 서브프로시저 6.3 매개변수의전달방식 6.4 함수를이용한프로그래밍 3 프로시저 (Procedure) 프로시저 (Procedure) 란무엇인가? 논리적으로묶여있는하나의처리단위 내장프로시저 이벤트프로시저, 속성프로시저, 메서드, 비주얼베이직내장함수등

More information

C++ Programming

C++ Programming C++ Programming 예외처리 Seo, Doo-okok clickseo@gmail.com http://www.clickseo.com 목 차 예외처리 2 예외처리 예외처리 C++ 의예외처리 예외클래스와객체 3 예외처리 예외를처리하지않는프로그램 int main() int a, b; cout > a >> b; cout

More information

JAVA PROGRAMMING 실습 02. 표준 입출력

JAVA PROGRAMMING 실습 02. 표준 입출력 자바의기본구조? class HelloJava{ public static void main(string argv[]){ system.out.println( hello,java ~ ){ } } # 하나하나뜯어살펴봅시다! public class HelloJava{ 클래스정의 public static void main(string[] args){ System.out.println(

More information

Microsoft PowerPoint - lec2.ppt

Microsoft PowerPoint - lec2.ppt 2008 학년도 1 학기 상지대학교컴퓨터정보공학부 고광만 강의내용 어휘구조 토큰 주석 자료형기본자료형 참조형배열, 열거형 2 어휘 (lexicon) 어휘구조와자료형 프로그램을구성하는최소기본단위토큰 (token) 이라부름문법적으로의미있는최소의단위컴파일과정의어휘분석단계에서처리 자료형 자료객체가갖는형 구조, 개념, 값, 연산자를정의 3 토큰 (token) 정의문법적으로의미있는최소의단위예,

More information

A Tour of Java V

A Tour of Java V A Tour of Java V Sungjoo Ha April 3rd, 2015 Sungjoo Ha 1 / 28 Review First principle 문제가생기면침착하게영어로구글에서찾아본다. 타입은가능한값의집합과연산의집합을정의한다. 기본형이아니라면이름표가메모리에달라붙는다. 클래스로사용자정의타입을만든다. 프로그래밍은복잡도관리가중요하다. OOP 는객체가서로메시지를주고받는방식으로프로그램을구성해서복잡도관리를꾀한다.

More information

Cluster management software

Cluster management software 자바네트워크프로그래밍 (OCJP 국제공인자격취득중심 ) 충북대학교 최민 기본예제 예외클래스를정의하고사용하는예제 class NewException extends Exception { public class ExceptionTest { static void methoda() throws NewException { System.out.println("NewException

More information

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4 ALTIBASE HDB 6.5.1.5.10 Patch Notes 목차 BUG-46183 DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG-46249 [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4 BUG-46266 [sm]

More information

PowerPoint Presentation

PowerPoint Presentation 자바프로그래밍 1 배열 손시운 ssw5176@kangwon.ac.kr 배열이필요한이유 예를들어서학생이 10 명이있고성적의평균을계산한다고가정하자. 학생 이 10 명이므로 10 개의변수가필요하다. int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; 하지만만약학생이 100 명이라면어떻게해야하는가? int s0, s1, s2, s3, s4,

More information

chap 5: Trees

chap 5: Trees 5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경

More information

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - chap10-함수의활용.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 중 값에 의한 전달 방법과

More information

제4장 기본 의미구조 (Basic Semantics)

제4장  기본 의미구조 (Basic Semantics) 제 4 장블록및유효범위 Reading Chap. 5 숙대창병모 1 4.1 변수선언및유효범위 숙대창병모 2 변수선언과유효범위 변수선언 Declaration before Use! 대부분의언어에서변수는사용전에먼저선언해야한다. 변수의유효범위 (scope) 선언된변수가유효한 ( 사용될수있는 ) 프로그램내의범위 / 영역 변수이름뿐아니라함수등다른이름도생각해야한다. 정적유효범위

More information

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - 제11장 포인터(강의) 쉽게풀어쓴 C 언어 Express 제 11 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 1003 1004 1005 영화관 1002 1006 1001 포인터 (pointer) 1007 메모리의구조

More information

Tcl의 문법

Tcl의 문법 월, 01/28/2008-20:50 admin 은 상당히 단순하고, 커맨드의 인자를 스페이스(공백)로 단락을 짓고 나열하는 정도입니다. command arg1 arg2 arg3... 한행에 여러개의 커맨드를 나열할때는, 세미콜론( ; )으로 구분을 짓습니다. command arg1 arg2 arg3... ; command arg1 arg2 arg3... 한행이

More information

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - C++ 5 .pptx C++ 언어프로그래밍 한밭대학교전자. 제어공학과이승호교수 연산자중복 (operator overloading) 이란? 2 1. 연산자중복이란? 1) 기존에미리정의되어있는연산자 (+, -, /, * 등 ) 들을프로그래머의의도에맞도록새롭게정의하여사용할수있도록지원하는기능 2) 연산자를특정한기능을수행하도록재정의하여사용하면여러가지이점을가질수있음 3) 하나의기능이프로그래머의의도에따라바뀌어동작하는다형성

More information

슬라이드 1

슬라이드 1 Pairwise Tool & Pairwise Test NuSRS 200511305 김성규 200511306 김성훈 200614164 김효석 200611124 유성배 200518036 곡진화 2 PICT Pairwise Tool - PICT Microsoft 의 Command-line 기반의 Free Software www.pairwise.org 에서다운로드후설치

More information

초보자를 위한 C# 21일 완성

초보자를 위한 C# 21일 완성 C# 21., 21 C#., 2 ~ 3 21. 2 ~ 3 21.,. 1~ 2 (, ), C#.,,.,., 21..,.,,, 3. A..,,.,.. Q&A.. 24 C#,.NET.,.,.,. Visual C# Visual Studio.NET,..,. CD., www. TeachYour sel f CSharp. com., ( )., C#.. C# 1, 1. WEEK

More information

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D> 리눅스 오류처리하기 2007. 11. 28 안효창 라이브러리함수의오류번호얻기 errno 변수기능오류번호를저장한다. 기본형 extern int errno; 헤더파일 라이브러리함수호출에실패했을때함수예 정수값을반환하는함수 -1 반환 open 함수 포인터를반환하는함수 NULL 반환 fopen 함수 2 유닉스 / 리눅스 라이브러리함수의오류번호얻기 19-1

More information

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100 2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) 연결리스트 (Linked List) 연결리스트연산 Stack

More information

PowerPoint Presentation

PowerPoint Presentation 자바프로그래밍 1 클래스와메소드심층연구 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 접근제어 class A { private int a; int b; public int c; // 전용 // 디폴트 // 공용 public class Test { public static void main(string args[]) { A obj = new

More information

Chapter 4. LISTS

Chapter 4. LISTS C 언어에서리스트구현 리스트의생성 struct node { int data; struct node *link; ; struct node *ptr = NULL; ptr = (struct node *) malloc(sizeof(struct node)); Self-referential structure NULL: defined in stdio.h(k&r C) or

More information

PowerPoint Template

PowerPoint Template 16-1. 보조자료템플릿 (Template) 함수템플릿 클래스템플릿 Jong Hyuk Park 함수템플릿 Jong Hyuk Park 함수템플릿소개 함수템플릿 한번의함수정의로서로다른자료형에대해적용하는함수 예 int abs(int n) return n < 0? -n : n; double abs(double n) 함수 return n < 0? -n : n; //

More information

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다. 제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver. 2.0 jbyoo@konkuk.ac.kr http://dslab.konkuk.ac.kr 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다. 이번장에서학습할내용 이중포인터란무엇인가? 포인터배열 함수포인터 다차원배열과포인터 void 포인터 포인터는다양한용도로유용하게활용될수있습니다. 2 이중포인터

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 @ Lesson 3 if, if else, if else if, switch case for, while, do while break, continue : System.in, args, JOptionPane for (,, ) @ vs. logic data method variable Data Data Flow (Type), ( ) @ Member field

More information

PowerPoint Presentation

PowerPoint Presentation 객체지향프로그래밍 오류처리 손시운 ssw5176@kangwon.ac.kr 오류메시지를분석한다. 오류메시지에서많은내용을알수있다. 2 디버깅 디버거를사용하면프로그램에서쉽게오류를감지하고진단할수있다. 디버거는중단점을설정하여서프로그램의실행을제어할수있으며문장 단위로실행하거나변수의값을살펴볼수있다. 3 이클립스에서디버깅 4 이클립스에서디버깅 5 이클립스의디버깅명령어 6 예외처리

More information

JUNIT 실습및발표

JUNIT 실습및발표 JUNIT 실습및발표 JUNIT 접속 www.junit.org DownLoad JUnit JavaDoc API Document 를참조 JUNIT 4.8.1 다운로드 설치파일 (jar 파일 ) 을다운로드 CLASSPATH 를설정 환경변수에서설정 실행할클래스에서 import JUnit 설치하기 테스트실행주석 @Test Test 를실행할 method 앞에붙임 expected

More information

Microsoft PowerPoint - chap12-고급기능.pptx

Microsoft PowerPoint - chap12-고급기능.pptx #include int main(void) int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; 1 학습목표 가 제공하는 매크로 상수와 매크로

More information

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint - Java7.pptx HPC & OT Lab. 1 HPC & OT Lab. 2 실습 7 주차 Jin-Ho, Jang M.S. Hanyang Univ. HPC&OT Lab. jinhoyo@nate.com HPC & OT Lab. 3 Component Structure 객체 (object) 생성개념을이해한다. 외부클래스에대한접근방법을이해한다. 접근제어자 (public & private)

More information

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a 6 장복사생성자 객체의생성과대입객체의값에의한전달복사생성자디폴트복사생성자복사생성자의재정의객체의값에의한반환임시객체 C++ 프로그래밍입문 1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y;

More information

금오공대 컴퓨터공학전공 강의자료

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 13. 포인터와배열! 함께이해하기 2013.10.02. 오병우 컴퓨터공학과 13-1 포인터와배열의관계 Programming in C, 정재은저, 사이텍미디어. 9 장참조 ( 교재의 13-1 은읽지말것 ) 배열이름의정체 배열이름은 Compile 시의 Symbol 로서첫번째요소의주소값을나타낸다. Symbol 로서컴파일시에만유효함 실행시에는메모리에잡히지않음

More information

5장.key

5장.key JAVA Programming 1 (inheritance) 2!,!! 4 3 4!!!! 5 public class Person {... public class Student extends Person { // Person Student... public class StudentWorker extends Student { // Student StudentWorker...!

More information

02 C h a p t e r Java

02 C h a p t e r Java 02 C h a p t e r Java Bioinformatics in J a va,, 2 1,,,, C++, Python, (Java),,, (http://wwwbiojavaorg),, 13, 3D GUI,,, (Java programming language) (Sun Microsystems) 1995 1990 (green project) TV 22 CHAPTER

More information

Frama-C/JESSIS 사용법 소개

Frama-C/JESSIS 사용법 소개 Frama-C 프로그램검증시스템소개 박종현 @ POSTECH PL Frama-C? C 프로그램대상정적분석도구 플러그인구조 JESSIE Wp Aorai Frama-C 커널 2 ROSAEC 2011 동계워크샵 @ 통영 JESSIE? Frama-C 연역검증플러그인 프로그램분석 검증조건추출 증명 Hoare 논리에기초한프로그램검증도구 사용법 $ frama-c jessie

More information

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public Chapter 9 Lab 문제정답 1. public class Circle private double radius; static final double PI=3.141592; // PI 이름으로 3.141592 로초기화된정적상수 (1) public Circle(double r) radius = r; (2) public double getradius() return

More information

UI TASK & KEY EVENT

UI TASK & KEY EVENT T9 & AUTOMATA 2007. 3. 23 PLATFORM TEAM 정용학 차례 T9 개요 새로운언어 (LDB) 추가 T9 주요구조체 / 주요함수 Automata 개요 Automata 주요함수 추후세미나계획 질의응답및토의 T9 ( 2 / 30 ) T9 개요 일반적으로 cat 이라는단어를쓸려면... 기존모드 (multitap) 2,2,2, 2,8 ( 총 6번의입력

More information

Microsoft PowerPoint - 제11장 포인터

Microsoft PowerPoint - 제11장 포인터 쉽게풀어쓴 C 언어 Express 제 11 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 1003 1004 1005 영화관 1002 1006 1001 포인터 (pointer) 1007 메모리의구조

More information

선형대수학 Linear Algebra

선형대수학  Linear Algebra 배열, 컬렉션, 인덱서 array, collection, indexer 소프트웨어학과 HCI 프로그래밍강좌 배열 배열 (array) 동일한자료형을다수선언 선언형식 데이터형식 [ ] 배열이름 = new 데이터형식 [ 개수 ]; int[ ] array = new int[5]; 인덱스 (index) 는 0 에서시작 scores[0] = 80; scores[1] =

More information

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint - 04-UDP Programming.ppt Chapter 4. UDP Dongwon Jeong djeong@kunsan.ac.kr http://ist.kunsan.ac.kr/ Dept. of Informatics & Statistics 목차 UDP 1 1 UDP 개념 자바 UDP 프로그램작성 클라이언트와서버모두 DatagramSocket 클래스로생성 상호간통신은 DatagramPacket 클래스를이용하여

More information

Microsoft Word - FunctionCall

Microsoft Word - FunctionCall Function all Mechanism /* Simple Program */ #define get_int() IN KEYOARD #define put_int(val) LD A val \ OUT MONITOR int add_two(int a, int b) { int tmp; tmp = a+b; return tmp; } local auto variable stack

More information

PowerPoint Presentation

PowerPoint Presentation C# 5.0 2013.12 C# 5.0 1/ C# 과닷넷프레임워크 2/ C# 2.0, 3.0, 4.0, 5.0 정리 3/ 정리및 Q&A C# 과닷넷프레임워크 CIL (1) (Common) Intermediate Language Managed Native IL 기계어 C# C++ C# 과닷넷프레임워크 CIL (2) HelloWorld 의 C# / IL 언어 using

More information

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074> 객체지향프로그램밍 (Object-Oriented Programming) 1 C++ popular C 객체지향 (object oriented) C++ C : 상위계층언어특징 + 어셈블리언어특징 C++ : 소프트웨어개발플랫폼에객체지향개념제공 객체지향 : 자료와이들자료를어떻게다룰것인지따로생각하지않고단지하나의사물로생각 형 변수가사용하는메모리크기 변수가가질수있는정보

More information

Lab 3. 실습문제 (Single linked list)_해답.hwp

Lab 3. 실습문제 (Single linked list)_해답.hwp Lab 3. Singly-linked list 의구현 실험실습일시 : 2009. 3. 30. 담당교수 : 정진우 담당조교 : 곽문상 보고서제출기한 : 2009. 4. 5. 학과 : 학번 : 성명 : 실습과제목적 : 이론시간에배운 Singly-linked list를실제로구현할수있다. 실습과제내용 : 주어진소스를이용해 Singly-linked list의각함수를구현한다.

More information

설계란 무엇인가?

설계란 무엇인가? 금오공과대학교 C++ 프로그래밍 jhhwang@kumoh.ac.kr 컴퓨터공학과 황준하 6 강. 함수와배열, 포인터, 참조목차 함수와포인터 주소값의매개변수전달 주소의반환 함수와배열 배열의매개변수전달 함수와참조 참조에의한매개변수전달 참조의반환 프로그래밍연습 1 /15 6 강. 함수와배열, 포인터, 참조함수와포인터 C++ 매개변수전달방법 값에의한전달 : 변수값,

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 제 11 장상속 1. 상속의개념을이해한다. 2. 상속을이용하여자식클래스를작성할수있다. 3. 상속과접근지정자와의관계를이해한다. 4. 상속시생성자와소멸자가호출되는순서를이해한다. 이번장에서만들어볼프로그램 class Circle { int x, y; int radius;... class Rect { int x, y; int width, height;... 중복 상속의개요

More information

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - additional01.ppt [호환 모드] 1.C 기반의 C++ part 1 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park 함수 Jong Hyuk Park 함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능

More information

PowerPoint Presentation

PowerPoint Presentation Package Class 1 Heeseung Jo 목차 section 1 패키지개요와패키지의사용 section 2 java.lang 패키지의개요 section 3 Object 클래스 section 4 포장 (Wrapper) 클래스 section 5 문자열의개요 section 6 String 클래스 section 7 StringBuffer 클래스 section

More information

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2 객체지향프로그래밍 IT CookBook, 자바로배우는쉬운자료구조 q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2 q 객체지향프로그래밍의이해 v 프로그래밍기법의발달 A 군의사업발전 1 단계 구조적프로그래밍방식 3 q 객체지향프로그래밍의이해 A 군의사업발전 2 단계 객체지향프로그래밍방식 4 q 객체지향프로그래밍의이해 v 객체란무엇인가

More information

<4D F736F F D20BEBEBCA520C4DAB5F920BFACBDC0202D20B8D6C6BC20BEB2B7B9B5E5BFCD20C0CCBAA5C6AE2E646F6378>

<4D F736F F D20BEBEBCA520C4DAB5F920BFACBDC0202D20B8D6C6BC20BEB2B7B9B5E5BFCD20C0CCBAA5C6AE2E646F6378> C# 코딩연습 멀티쓰레드와이벤트 2009-05-18 김태현 (kimgwajang@hotmail.com) I. 서 제블로그 1 의카테고리중에.NET Tip of The Day' 라는것이있는데, 동명의사이트 2 에실린유용한닷넷팁들을번역하여소개하는포스팅이모여있습니다. 이중 Correct event invocation 3 라는제목의포스트가있는데, 멀티쓰레드환경에서이벤트를호출하는올바른방법에관해서설명을하고있습니다.

More information

02장.배열과 클래스

02장.배열과 클래스 ---------------- DATA STRUCTURES USING C ---------------- CHAPTER 배열과구조체 1/20 많은자료의처리? 배열 (array), 구조체 (struct) 성적처리프로그램에서 45 명의성적을저장하는방법 주소록프로그램에서친구들의다양한정보 ( 이름, 전화번호, 주소, 이메일등 ) 를통합하여저장하는방법 홍길동 이름 :

More information

4 장클래스와객체 클래스와객체 public과 private 구조체와클래스객체의생성과생성자객체의소멸과소멸자생성자와소멸자의호출순서디폴트생성자와디폴트소멸자멤버초기화멤버함수의외부정의멤버함수의인라인함수선언 C++ 프로그래밍입문

4 장클래스와객체 클래스와객체 public과 private 구조체와클래스객체의생성과생성자객체의소멸과소멸자생성자와소멸자의호출순서디폴트생성자와디폴트소멸자멤버초기화멤버함수의외부정의멤버함수의인라인함수선언 C++ 프로그래밍입문 4 장클래스와객체 클래스와객체 public과 private 구조체와클래스객체의생성과생성자객체의소멸과소멸자생성자와소멸자의호출순서디폴트생성자와디폴트소멸자멤버초기화멤버함수의외부정의멤버함수의인라인함수선언 C++ 프로그래밍입문 1. 클래스와객체 추상데이터형 : 속성 (attribute) + 메서드 (method) 예 : 자동차의속성과메서드 C++ : 주로 class

More information