Presentation is loading. Please wait.

Presentation is loading. Please wait.

C# 03장. 프로그램 구성 요소와 데이터형.

Similar presentations


Presentation on theme: "C# 03장. 프로그램 구성 요소와 데이터형."— Presentation transcript:

1 C# 03장. 프로그램 구성 요소와 데이터형

2 학습 목표 프로그램 구성 요소(키워드,식별자, 상수, 연산자, 구분자)를 숙지한다
C# 프로그램에서 사용되는 데이터형의 개념을 이해하고 직접 응용해서 직접 응용해서 사용한다 내장형과 사용자 정의형을 이해하고 사용한다 암시적, 명시적 데이터형 변환에 대해서 이해하고 응용한다 연산자의 기능을 익히고 변수에 값을 직접 할당할 수 있다.

3 목차 프로그램 구성 요소 데이터형과 변수 데이터 형 변환 연산자

4 1. 프로그램 구성 요소 키워드(Keyword) C# 키워드 C#에서 특별한 의미가 있는 예약어(Reserved Word)
abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual void volatile while

5 식별자(Identifier) 1. 프로그램 구성 요소 명명규칙 -첫 글자는 영문자, 밑줄(_)만 사용
-숫자도 포함 가능하나 첫 글자로 사용 못함 -키워드는 사용 못함 -대소문자 구분 명명권장사항 -모두 대문자로 쓰는 것을 피한다. -밑줄(_)을 첫 글자로 사용하지 않는다 -약어는 되도록 쓰지 않는다 -특수문자의 사용을 피한다

6 상수 1. 프로그램 구성 요소 변하지 않는 문자나 숫자값 정수형 상수 -10진수, 16진수, 8진수로 표현되는 숫자 상수
실수형 상수 -double과 float 불리언형 상수 -참(true), 거짓(false) 문자형 상수 -유니코드, 작은따옴표(‘’)안에 표현 문자열형 상수 -큰따옴표(“”)안에 표현 널(null)형 상수 -한번도 사용하지 않은 객체를 나타낼 때 쓴다.

7 연산자와 구분자 1. 프로그램 구성 요소 C#의 연산자 C#의 구분자 + - * / % & | ^ ! ~ = < >
? ++ -- && || << >> == != <= >= += -= *= /= %= &= ^= <<= >>= -> { } [ ] ( ) . , ; :

8 형 (Type) 값형 참조형 2. 데이터형과 변수 CTS( Common Type System ) (Value Type)
(Reference Type) 메모리영역: 스택(stack)과 힙(heap) 데이터형: class, interface, delegate등 메모리영역: 스택(stack) 데이터형: int, float, struct, enum등 CTS : 언어마다 자신의 데이터형을 따로 사용하지 않고 CTS에 정의된 형식의 데이터 형을 사용

9 a[10] a[10] a[10+10] b[10] a[20] 값 형식의 자료 저장 ① ② b[10] ③ ④
2. 데이터형과 변수 값 형식의 자료 저장 a[10] int a = 10 ; int b = a ; a = a +10 ; a[10] b[10] a[10+10] b[10] 값 자체를 복사하기 때문에 a의 값을 변경하여도 b의 값은 변하지 않음 a[20] b[10]

10 참조형 자료 저장 스택(stack) 힙(heap) ① A[0X00…] ② A[0X00…] B[0X00…]
2. 데이터형과 변수 참조형 자료 저장 스택(stack) 힙(heap) ① A[0X00…] <코드> MyClass A = new MyClass() ; MyClass B = A ; MyClass A 힙 영역의 메모리 주소 ② A[0X00…] B[0X00…] MyClass A B는 A가 가지고 있는 데이터의 주소값을 복사하여 갖고 있기 때문에 A의 값이 바뀌면 B의 값도 바뀜

11 값 형 데이터의 분류 값 형 (Value Type) 내장 형 (Built-in Type) 사용자 정의 형
2. 데이터형과 변수 값 형 데이터의 분류 값 형 (Value Type) 내장 형 (Built-in Type) 사용자 정의 형 (User-Defined Type) 데이터형 : int, float 형 데이터 형 : enum, struct 형

12 내장형 데이터 2. 데이터형과 변수 분류 키워드 구조체형 크기(byte) 숫자형 (정수형) sByte byte short
ushort int uint long ulong System.Sbyte System.Byte System.Int16 System.UInt16 System.Int32 System.UInt32 System.Int64 System.UInt64 1 2 4 8 (실수형) float double decimal System.Single System.Double System.Decimal 16 문자형 char System.Char 문자열형 string System.String 불리언형 bool System.Boolean 1비트

13 정수형과 실수형 2. 데이터형과 변수 using System; using System.Collections.Generic;
using System.Text; namespace BuiltInTypes { class NumericalTypes static void Main(string[] args) // 정수형 sbyte byteValue = 127; short shortValue = 32767; int intValue = ; long longValue = ; // 실수형 float floatValue = 3.14F; double doubleValue = 3.14; decimal decimalValue = 3.14M; Console.WriteLine(byteValue); Console.WriteLine(shortValue); Console.WriteLine(intValue); Console.WriteLine(longValue); Console.WriteLine(); Console.WriteLine(floatValue); Console.WriteLine(doubleValue); Console.WriteLine(decimalValue); } 정수형과 실수형

14 using System.Collections.Generic; using System.Text;
2. 데이터형과 변수 변수 테스트 using System; using System.Collections.Generic; using System.Text; namespace BuiltInTypes { class VariableTest static void Main(string[] args) int intValue; // intValue = 100 ; Console.WriteLine(intValue); } 주석 제거 후 실행  변수를 선언하면 반드시 할당을 하여야 함.

15 문자형(char)과 문자열(string) 형
2. 데이터형과 변수 문자형(char)과 문자열(string) 형 using System; using System.Collections.Generic; using System.Text; namespace PrimitiveTypes { class CharType static void Main(string[] args) // 문자형 char engValue = 'A'; char korValue = '가'; char chinaValue = '漢'; //문자열형 string strValue = "Hello"; Console.WriteLine("engValue = {0}", engValue); Console.WriteLine("korValue = {0}", korValue); Console.WriteLine("chinaValue = {0}", chinaValue); Console.WriteLine("strValue = {0}", strValue); } 기존의 문자형 : 1바이트 유니코드 : 2바이트 문자형 상수 : 작은 따옴표(‘ ‘) 문자열 상수 : 큰 따옴표 사용(“ “)

16 특수 문자(역 슬래시 이용 \) 특수문자 설명 2. 데이터형과 변수 \’ 작은따옴표 \” 큰따옴표 \\ 역슬래시 \o
널(null) \a 경고음 발생 \b 역스페이스 \f 폼 피드 \n 새행 \r 첫 칸 옮기기 \t 수직방향탭 \v 수평방향 탭 \u숫자 유니코드 출력

17 불리언형 데이터 2. 데이터형과 변수 using System; using System.Collections.Generic;
using System.Text; namespace PrimitiveTypes { class BoolType static void Main(string[] args) // boolean 형식 bool boolValue1 = true; bool boolValue2 = false; Console.WriteLine("boolValue1={0}", boolValue1); Console.WriteLine("boolValue2={0}", boolValue2); }

18 사용자 정의형 데이터(열거형, 구조체) 열거형(enum) 2. 데이터형과 변수
enum WeekDay { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }

19 열거형 예제 1(열거형 변수명 및 인덱스 사용 가능)
2. 데이터형과 변수 열거형 예제 1(열거형 변수명 및 인덱스 사용 가능) using System; using System.Collections.Generic; using System.Text; namespace UserDefineTypes { enum WeekDay // 1. 열거형 변수 타입 정의 Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } class EnumType { static void Main(string[] args) WeekDay offDay; //2. offDay는 WeekDay 타입으로 정의 WeekDay today; //toDay도 WeekDay 타입으로 정의 offDay = WeekDay.Sunday; //3. offDay에 Sunday 대입 today = (WeekDay)2; // today에 Wednesday 인덱스 값 대입 Console.WriteLine("offday : {0}", offDay); Console.WriteLine("today : {0}", today); Console.WriteLine(); Console.WriteLine("offday의 인덱스 :{0}", (int)offDay); Console.WriteLine("today 인덱스 :{0}", (int)today); }

20 열거형 예제 2(열거형 변수명 사용 및 값에 대한 캐스팅 가능)
2. 데이터형과 변수 열거형 예제 2(열거형 변수명 사용 및 값에 대한 캐스팅 가능) using System; using System.Collections.Generic; using System.Text; namespace UserDefineTypes { enum Items Pen = 100, Paper = 200, Chair = 5000, Desk = 10000, Phone = 3000 } class enumType2 { static void Main(string[] args) Items requestItem1 = Items.Paper; Items requestItem2 = (Items)3000; Console.WriteLine("{0} 의 가격은 {1}", requestItem1, (int)requestItem1); requestItem2, (int)requestItem2); } 값에 대한 캐스팅  변수명 출력됨

21 구조체(struct) 2. 데이터형과 변수 <문법> struct <식별자> { 데이터형 멤버1,
데이터형 멤버2, 데이터형 멤버3, } ; <예> struct Employee { public string name; public int age; }

22 구조체 사용 예 2. 데이터형과 변수 using System; using System.Collections.Generic;
using System.Text; namespace UserDefineTypes { struct Employee public string name; public int age; } class structType static void Main(string[] args) Employee manager; manager.name = "김아무개"; manager.age = 45; Console.WriteLine("이름: {0}", manager.name); Console.WriteLine("나이: {0}", manager.age);

23 System.Object와 System.ValueType
3. 데이터형 변환 System.Object와 System.ValueType C#의 모든 데이터형은 객체 모든 데이터형은 System.Object 클래스에서 파생. 값형의 데이터형들은 System.ValueType에서 파생. System.Object System.ValueType System.Char System.Int32 System.Enum

24  C#에서 사용하는 데이터 변수는 System.Object에 정의된 메소드 사용 가능 메소드 명 설명
3. 데이터형 변환 객체의 특징 : 멤버변수 + 메소드  C#에서 사용하는 데이터 변수는 System.Object에 정의된 메소드 사용 가능 메소드 명 설명 bool Equals() 객체가 같은지 비교한다. Type GetType() 객체의 형식 정보를 얻는다 string ToString() 객체의 값을 나타낸다.

25 System.Object 메소드 사용 예(GetType(), ToString)
3. 데이터형 변환 System.Object 메소드 사용 예(GetType(), ToString) using System; using System.Collections.Generic; using System.Text; namespace AboutType { class ObjectMethod static void Main(string[] args) double radius = 3.14; Console.WriteLine("radius의 형:{0}", radius.GetType()); Console.WriteLine("radius의 값:{0}", radius.ToString()); Console.WriteLine(); string name = "이효리"; Console.WriteLine("name 형:{0}", name.GetType()); Console.WriteLine("name 값:{0}", name.ToString()); Console.WriteLine("radius == name : {0}", name.Equals(radius)); }

26 암시적(implicit) 형 변환 3. 데이터형 변환 직접 캐스팅하지 않고도 형의 변화가 일어남
데이터형의 호환성, 사이즈 등이 적절할 때 가능 <예> int intValue = 127 ; long longValue = intValue ; // 암시적 형변환

27 암시적(implicit) 형 변환 using System; using System.Collections.Generic;
3. 데이터형 변환 암시적(implicit) 형 변환 using System; using System.Collections.Generic; using System.Text; namespace TypeConversion { class ImplicitConversion static void Main(string[] args) int intValue = 127; long longValue = intValue; Console.WriteLine("longValue ={0}", longValue); } long 형 변수의 범위가 더 크기 때문에 정상적으로 작동함

28 명시적(explicit) 형 변환 캐스팅 : 해당되는 형을 정의하여 방을 만든 후 형에 맞게 복사하는 개념 3. 데이터형 변환
명시적으로 직접 캐스팅하여 형의 변화가 일어남 <예> long longValue = ; int intValue = (int) longValue ; // 형변환를 위한 캐스팅 캐스팅 : 해당되는 형을 정의하여 방을 만든 후 형에 맞게 복사하는 개념

29 명시적(explicit) 형 변환 3. 데이터형 변환 using System;
using System.Collections.Generic; using System.Text; namespace TypeConversion { class ExplicitConversion static void Main(string[] args) long lognValue = 32767; int intValue = (int)lognValue; Console.WriteLine("intValue = {0}", intValue); }

30 4. 연산자 분류 연산자 단항 + - ! ~ ++ -- 산술 곱셈/나눗셈 덧셈/뺄셈 * / % + - 시프트
! ~ 산술 곱셈/나눗셈 덧셈/뺄셈 * / % + - 시프트 << >>> 관계 비교 등가 < > <= => is as = = ! = 비트 비트 AND 비트 OR 비트 XOR & | ^ 조건 조건 AND 조건 OR && || ?: 대입 = *= /= += -= <<= >>= &= ^= |= 비트 논리 부정 연산자(~) 부호 없는 오른쪽 시프트 연산자(>>>) ; 도움말 참조

31 4. 연산자 도움말 참조

32 4. 연산자

33 단항 연산자 4. 연산자 using System; using System.Collections.Generic;
using System.Text; namespace Operators { class OneOperand static void Main(string[] args) int a = 10; bool b = true; Console.WriteLine("+a = {0}", +a); Console.WriteLine("-a = {0}", -a); Console.WriteLine("~a = {0}", ~a); Console.WriteLine("++a = {0}", ++a); Console.WriteLine("--a = {0}", --a); Console.WriteLine(" !b = {0}", !b); }

34 ++ 연산자 ++ 연산자가 뒤에 있으면, 해당 명령 행에는 값이 변화하지 않는다. 4. 연산자 using System;
using System.Collections.Generic; using System.Text; namespace Operators { class Increment static void Main(string[] args) int a = 0, b = 0, c = 0, d = 0; a++; ++b; int x = c++; int y = ++d; Console.WriteLine("a = {0}", a); Console.WriteLine("b = {0}", b); Console.WriteLine("c = {0}", c); Console.WriteLine("d = {0}", d); Console.WriteLine("x = {0}", x); Console.WriteLine("y = {0}", y); } ++ 연산자가 뒤에 있으면, 해당 명령 행에는 값이 변화하지 않는다.

35 산술 연산자 using System; namespace Operators { class ArithmeticOps
4. 연산자 산술 연산자 using System; namespace Operators { class ArithmeticOps static void Main(string[] args) int a = 32, b = 23; Console.WriteLine("{0} + {1} = {2}", a, b, a + b); Console.WriteLine("{0} - {1} = {2}", a, b, a - b); Console.WriteLine("{0} * {1} = {2}", a, b, a * b); Console.WriteLine("{0} / {1} = {2}", a, b, a / b); Console.WriteLine("{0} % {1} = {2}", a, b, a % b); }

36 문자열에서 + 연산자 using System; namespace Operators { class stringOps
4. 연산자 문자열에서 + 연산자 using System; namespace Operators { class stringOps static void Main(string[] args) string a = "Visual "; string b = "C#"; string c = a + b; Console.WriteLine("문자열 a + b = {0}", c); }

37 static void Main(string[] args) int a = 8, b = 7;
4. 연산자 비교 연산자 using System; namespace Operators { class CompOps static void Main(string[] args) int a = 8, b = 7; Console.WriteLine("{0} > {1}: {2}", a, b, a > b); Console.WriteLine("{0} == {1}: {2}", a, b, a == b); Console.WriteLine("{0} != {1}: {2}", a, b, a != b); }

38 static void Main(string[] args) int a = 8;
4. 연산자 is 연산자 using System; namespace Operators { class IsOps static void Main(string[] args) int a = 8; Console.WriteLine("a은 double 형:{0}", a is double); Console.WriteLine("a은 int 형:{0}", a is int); }

39 논리 연산자 4. 연산자 using System; namespace Operators { class LogicOps
static void Main(string[] args) bool trueValue = true; bool falseValue = false; Console.WriteLine("논리합: {0} || {1} = {2} ",trueValue, trueValue, trueValue || trueValue); Console.WriteLine("논리합: {0} || {1} = {2} ",trueValue, falseValue, trueValue || falseValue); Console.WriteLine("논리합: {0} || {1} = {2} ",falseValue, falseValue, falseValue || falseValue); Console.WriteLine(); Console.WriteLine("논리곱: {0} && {1} = {2} ", trueValue, trueValue, trueValue && trueValue); Console.WriteLine("논리곱: {0} && {1} = {2} ",trueValue, falseValue, trueValue && falseValue); Console.WriteLine("논리곱: {0} && {1} = {2} ",falseValue, falseValue, falseValue && falseValue); }

40 대입 연산자 4. 연산자 using System; namespace Operators { class AssignOps
static void Main(string[] args) int intValue = 100; Console.WriteLine("intValue 초기값 : {0}", intValue); intValue += 50; Console.WriteLine("intValue += 50의 결과 : {0}", intValue); intValue /= 3; Console.WriteLine("intValue /= 3의 결과 : {0}", intValue); }

41 요약 프로그램을 기본적으로 구성하는 요소로는 C#언어에서 정의한 키워 드, 그리고 사용자가 만드는 객체나 변수명인 식별자, 변하지 않는 데 이터인 상수, 그리고 각종 데이터를 원하는 값으로 계산이 가능하게 하는 연산자가 있다. CTS(Common Type System)는 데이터를 객체화해서 사용하기 때문 에 닷넷 프레임워크가 지원되는 모든 언어는 같은 데이터형을 사용한 다. 따라서 언어나 시스템에 관계없이 데이터를 사용할 수 있다.

42 요약 C#의 데이터형은 모두 System.Object 클래스로부터 파생되었다. 그리고 데 이터형은 크게 값형(Value Type)과 참조형(Reference Type)으로 나뉜다. 다 시 값형은 언어에서 이미 정의된 내장형(Build-In Type)과 사용자가 직접 정 의해서 사용할 수 있는 사용자 정의형(User-Defined Type)으로 나뉜다.

43 요약 데이터의 손실이 발생하지 않는 변수에 데이터를 할당하면 사용자가 직접 캐 스팅하지 않고도 암시적으로 데이터의 형 변환이 일어난다. 하지만 데이터의 크기가 작은 변수에 범위가 큰 데이터형을 할당하려면 명시적으로 형 변환을 캐스팅해서 데이터를 할당해야 한다. 연산자는 기능에 따라, 단항, 산술, 시프트, 관계, 비트, 조건, 대입 연산자로 분류할 수 있다. 연산자는 데이터형을 원하는 값으로 계산하는 것을 가능하 게 한다.

44 연습문제 [연습문제] 1. 프로그램의 구성 요소는 ( ), ( ), ( ), ( ), 그리고 구분자로 구성된 다. 2. 닷넷 프레임워크에서 모든 언어가 통일된 데이터 형태를 사용할 수 있는 것 은 ( )의 체계에 의해서다. 3. CTS는 체계가 크게 값형(Value-Type)과 ( )으로 나뉜다. 4. 값형은 이미 CTS 안에서 정의해서 사용하는 내장형(Built-in Type)과 사용 자가 데이터형을 직접 구성할 수 있는 ( )형으로 구분된다. 5. 값형 데이터의 형 변환에는 데이터의 손실이 발생하지 않고 상호 호환성이 있는 데이터는 사용자가 직접 형변환을 하지 않아도 되는 ( ) 형 변환과, 사용자가 직접 형 변환을 위한 캐스팅을 해줘야 하는 ( ) 형 변환이 있다.

45 심화연습문제 1. 열거형(enum)과 구조체(struct)를 사용해서 다음 조건을 만족하는 프로그램 을 작성하시오.
- 콘솔 응용 프로그램으로 프로젝트를 만든다. - 학점을 열거형으로 정의한다. 학점 등급은 A(4점), B(3점), C(2점), D(1점) 다. - 이름과 학과를 데이터 멤버로 포함하는 구조체를 정의한다. 학생의 이름과 학과 그리고 학점 등급과 학점을 출력하는 프로그램을 작성 한다.

46 심화연습문제 2. 다음 결과를 출력하는 사칙연산 계산 프로그램을 작성하시오. - 콘솔 응용 프로그램으로 프로젝트를 만든다. - 숫자 두 개를 Console.ReadLine 메소드를 통해 입력받는다. - 키보드로 입력 받은 값을 string형으로 저장한다. - string형 변수에 저장된 값을 Parse 메소드를 사용해서 각각 double형 변수 에 저장한다. - double형으로 변환되어 저장된 값 두 개에 대해서 다음과 같이 사칙연산 결 과를 수행한다.

47 기본적인 입출력 출력 입출력 기능을 제공하는 Console 클래스가 System 네 임스페이스에 포함되어 있으므로 입출력을 위해서는 소스 선두에 using System; 선언을 해야 한다. Console의 기본 출력 메서드는 WriteLine이다. 총 19가지 형식으로 오버로딩(중복 정의) 되어 있다.

48 기본적인 입출력 출력 총 19가지 형식으로 오버로딩(중복 정의) 되어 있다.
기본적인 입출력 출력 총 19가지 형식으로 오버로딩(중복 정의) 되어 있다. public static void WriteLine(); public static void WriteLine(char value); public static void WriteLine(int value); public static void WriteLine(double value); public static void WriteLine(object value); public static void WriteLine(string value); public static void WriteLine(string format, params object[] arg); WriteLine()은 Console 객체를 생성하지 않아도 Console.WriteLine 형식으로 곧바 로 호출할 수 있다 인수 타입으로 문자형, 정수형, 실수형, 문자열 등을 받아 들인다. 인수 없이 WriteLine만 호출하면 출력없이 커서를 다음 줄 처음으로 내리기만 한다 .

49 ->1234<- -> 1234<- ->1234 <-
예제 using System; class CSTest { public static void Main() int i = 1234; double d = ; Console.WriteLine("문자열"); Console.WriteLine(i); Console.WriteLine(d); // 서식을 사용할 수 있다. Console.WriteLine("정수는 {0}이고 실수는 {1}이다", i, d); Console.WriteLine("자리수 테스트:->{0}<- ->{0,6}<- ->{0,-6}<-", i); Console.WriteLine("->{0:F0}<- ->{0:F2}<- ->{0:F4}<-", d); } {0} {0,6} {0,-6} ->1234<- -> 1234<- ->1234 <- 4칸 차지 칸 차지, 오른쪽 정렬 칸 차지 왼쪽 정렬

50 WriteLine 메서드는 출력이 끝난 후 자동으로 개행하는 줄 단위 함수이다. 아무리 짧은 줄이라도 한 줄을 차지 한다.
이 메서드 외에 Write 라는 메서드가 있는데 이 메서드는 모든 면에서 WriteLine과 동일하되 출력 후 개행하지 않 는다는 점만 다르다. WriteLine은 무조건 개행해 버리므 로 한 줄에 여러 개의 정보를 연이어 출력할 때는 Write 메서드를 사용해야 한다.

51 입력 콘솔의 기본적인 입력 메서드는 ReadLine이다. 다양한 타입의 정보를 출력해야 하는 WriteLine 메서드에 비해 형식이 아주 간단하다. 오버로 딩되어 있지도 않아 다음 한 가지 형식 밖에 없다. public static string ReadLine() ReadLine 메서드가 호출되면 콘솔에 캐럿이 나타나 입력을 대기하며 사용자가 문자열을 입력한 후 엔터 키를 누르면 입력된 문자열을 리턴 한다. 키보드로 입력되는 것은 모두 문자열 형태를 띠고 있으므로 린턴 타입이 문자열로 되어 있다. 만약 정수나 실수가 필요하다면 일단 문자 열로 입력 받은 후 원하는 타입으로 변환해서 사용해야 한다.

52 ReadLine 예제 using System; class CSTest { public static void Main() string Name, sAge; int Age; Console.Write("이름을 입력하세요 : "); Name = Console.ReadLine(); Console.WriteLine(Name); Console.Write("나이를 입력하세요 : "); sAge = Console.ReadLine(); Age = Convert.ToInt32(sAge); Console.WriteLine(Age); }

53 이름을 입력 받을 때는 ReadLine이 리턴한 값을 그대로 Name 문자열 변수에 대입하면 된다.
정수인 나이는 일단 aAge라는 중간 문자열 변수로 대입 받은 후 정수로 변환했다. 문자열을 정수로 변환할 때는 Convert 클래스의 Toint32 메서드를 호출한다. 임시 변수를 쓰지 않고 다음과 같이 입력받은 문자열을 바로 변환 할 수도 있다. Age = Convert.ToInt32(Console.ReadLine()); 위의 코드는 ReadLine이 리턴하는 문자열을 ToInt32 메서드로 넘겨 곧바로 정수로 변환한다. 만약 나이에 숫자가 아닌 문자열, 예를 들어 young 과 같은 문자열을 입력하면 ToInt32 메서드가 sAge를 정수로 바꾸는 중에 FormatException 예외가 발생한다.

54 Read 메서드는 한 줄을 읽은 후 첫 번째 문자만 int 형으로 리턴한다.

55 문자나 정수가 아닌 키 자체를 입력 받을 때는 다음 메서드를 사용한다. 이 메서드는 닷넷 2.0 이후에 추가된 것이다.
public static ConsoleKeyInfo ReadKey([bool intercept]); 이 메서드를 사용하면 문자가 아닌 커서 이동 키나 펑션 키, Ins, Del 등의 기능 키도 입력 받을 수 있다. 단 Ctrl, Alt, Shift 키 등의 조합 키는 단독으로 사용되지 않으므로 키 입력으로 간주하지 않는다. intercept 인수는 입력 받은 키를 화면으로 다시 출력(echo)할 것인지를 지정하는데 true일 때 출력하지 않고 false 일 때 출력한다. intercept 인수를 생략하면 false로 간주한다. 인수에 [] 괄호가 표기 된 것은 생략 가능하다는 뜻이다. 키 하나만 입력받기 때문에 엔터 키를 누르지 않아도 즉시 리턴한다. 입력 받은 키 정보는 ConsoleKeyInfo 구조체로 리턴되는데 이 구조체의 Key 멤버에 눌러진 키의 이름값이 전달된다. 키의 이름은 ConsoleKye 열거형으로 정의되어 있다. 다음 페이지 참조

56 열거형 A~Z A~Z 키 D0~D9 0~9 숫자 키 F1~F24 F1~F24 펑션 키 NumPad0~NumPadd9 넘패드의 숫자 키 0~9 Insert, Delete Insert 키, Del 키 LeftArrow, RightArrow,UpArrow,DownArrow 커서 이동 키

57 이 예제는 커서 이동 키를 입력 받아 # 문자를 상하 좌우로 움직인다.
using System; class CSTest { public static void Main() ConsoleKeyInfo cki; int x = 40, y = 12; for (; ; ) Console.Clear(); Console.SetCursorPosition(x, y); Console.Write('#'); cki = Console.ReadKey(true); switch (cki.Key) case ConsoleKey.LeftArrow: x--; break; case ConsoleKey.RightArrow: x++; case ConsoleKey.UpArrow: y--; case ConsoleKey.DownArrow: y++; case ConsoleKey.Q: return; } 이 예제는 커서 이동 키를 입력 받아 # 문자를 상하 좌우로 움직인다.

58 콘솔의 여러 가지 기능 Console 클래스에는 ReadLine, WriteLine 같은 기본적인 입출력 메서드 외에도 콘솔 관리를 위한 여러 가지 멤버들이 제공된다. 함수처럼 필요할 때 호출할 수 있는 메서드 이고 어떤 것은 값을 읽고 쓰는 프로퍼티 형태로 되어 있다. 멤버 설병 Title 콘솔 창의 메목 문자열이다 BackgroundColor, ForegroundColor 전경색, 배경색의 색상이다 CursorSize 커서의 높이를 지정한다. CursorVisible 커서의 보임/숨김을 지정한다 CursorLeft, CursorTop 커서의 현재 위치이다. Clear() 화면을 지운다 Beep() 삑 소리를 낸다 ResetColor() 디폴트 색상으로 변경한다. SetCursorPosition(x,y) 커서의 위치를 옮긴다.

59 ConsoleMember 예제 using System; class CSTest {
public static void Main() Console.Title = "콘솔 테스트"; Console.BackgroundColor = ConsoleColor.Blue; Console.ForegroundColor = ConsoleColor.Yellow; Console.Clear(); Console.Beep(); Console.WriteLine("색상을 변경했습니다."); Console.ReadLine(); Console.ResetColor(); Console.SetCursorPosition(10, 10); Console.WriteLine("디폴트 색상입니다."); }

60 타입 타입(Type)이란 변수의 형식이며 타입에 따라 변수의 길이나 값을 해석 하는 방식이 달라진다.
정수형이나 실수형으로의 구분을 의미하며 언어마다 제공하는 타입의 종류가 다르다. 닷넷 프레임워크는 CTS(Common Type System)라는 공용 타입 체계 를 정의하고 닷넷용 언어들은 모두 공통의 타입 체계를 따른다. 그렇기 때문에 닷넷 언어끼리는 타입이 호환되어 혼합 프로그래밍이 가능한 것 이다. 닷넷의 타입들은 모두 System 네임스페이스에 정의되어 있는 구조체이 거나 클래스이다. 타입도 개별언어가 정의하는 것이 아니라 닷넷 프레 임워크에 정의되어 있다.단 프레임워크의 타입명이 너무 길기 때문에 닷넷의 각 언어들은 CTS가 정의하는 타입에 대한 짧은 별칭을 제공한 다.

61 C#에서 정의하는 별칭 분류 키워드(C#)-별칭 구조체형(CTS) 크기(byte) 숫자형 (정수형) sByte byte
short ushort int uint long ulong System.Sbyte System.Byte System.Int16 System.UInt16 System.Int32 System.UInt32 System.Int64 System.UInt64 1 2 4 8 (실수형) float double decimal System.Single System.Double System.Decimal 16 문자형 char System.Char 문자열형 string System.String 불리언형 bool System.Boolean 1비트

62 부호가 있는 32비트의 정수형은 닷넷 프레임워크의 System
부호가 있는 32비트의 정수형은 닷넷 프레임워크의 System.Int32 구조체로 표현되며 C#은 이 타입을 int 라 는 키워드로 칭한다. CTS의 타입명을 바로 사용해도 되고 C#의 별칭을 사용 해도 된다. C#에서 다음 두 선언문은 완전히 동일하다. System.Int32 Value; int Value CTS 타입은 이름이 너무 길어서 입력하기 불편하므로 가 급적이면 각 언어가 제공하는 별칭을 사용하는 것이 더 편리하다.

63 명시적 타입 변환 short s = 1234; int I = s ; 암시적 형변 환 : 정상 처리됨
에러 처리(c++ 은 가능) int I = -1 ; unit u = I ; uint x = ; int I = u; uinit : - 라는 값을 저장할 수 없음 int : 20억이 넘는 수를 저장할 수 없음  암시적 형 변환 허용 안됨 ushort us = 32000; int I = us ; ushort : 부호가 없는 16비트 타입 int : 부호가 있는 32비트 타입 부호 여부가 다르지만 표현 가능하므로 암시적 형 변환 됨 반대는 안됨 short s = ; uint u = s; uint 는 더 크지만 부호가 없으므로 암시적 형 변환 안됨

64 uint u = ; 상수는 컴파일할 때 범위를 벗어나는지 바로 알 수 있다. 타입의 범위 내부이기 때문에 유효함 uint u = -1 ; 에러

65 double d = 3.14 ; int I = d; 정수는 소수점 이하를 기억할 수 없으므로 실수를 대입 받을 수 없다. int I = ; double d = I; 반대의 경우는 가능하다. long I = ; float f = I ; long : 64비트 float : 32비트 이것은 큰 타입에서 작은 타입으로 대입이 가능하다. float 가 비록 작아서 정밀도는 충분하지는 않지만 표현 가능한 수의 크기는 long 보다 더 넓기 때문이다. 변환에 의해 정확도를 잃어버리기는 하지만 이때 발생한 오차는 값의 크기에 비해 상대적으로 작아 논리적으로 큰 문제가 없다.

66 int I = 1, j; short s = 2; j = I +s ; 타입이 다른 변수나 상수들이 한 연산식에 있을 때는 암시적 변환으로 양쪽의 타입을 맞춘 후에 연산한다. I + s 연산식에서 s 가 잠시 int 형이 된다. short a = 1 , b = 2 , c ; c = a + b ; short a = 1 , b = 2, c ; c = (short)(a + b) ; short 끼리 더해 short 형 변수에 대입했으니 아무 문제가 없어 보인다. 그러나 컴파일 시 int 를 short 로 바꿀 수 없다는 메시지가 나온다. short 나 byte 같은 작은 타입이 수식 내에서 사용되면 항상 int 형으로 변환된 후 연산되므로 a+b의 결과는 int가 되며 따라서 short 형 변수 c에 바로 대입할 수 없다. short 끼리 더한 결과가 short 범위를 넘을 수도 있으므로 c 는 반드시 int로 선언해야 한다.

67 명시적 형 변환 명시적 형 변환은 개발자가 어떤 타입을 어떻게 바꾸라 고 컴파일러에게 분명히 지시하는 것이며 캐스트 연산자 를 사용한다. 캐스트 연산자는 (int), (double) 과 같이 괄호 안에 변환 할 타입을 밝히는 형식이다. 큰 타입을 작은 타입으로 캐스팅하면 값의 소실이 발생 할 수도 있다.

68 명시적 형 변환 double d = 1.23 ; decimal m = 4.56m; d = (double)m;
m = (decimal)d; decimal 이 더 큰 타입이므로 double 이 decimal 에 대입 될 것 같지만, 두 타입의 내부적인 구조가 완전히 다르기 때문에 값의 손실이 발생한다. double : 국제 표준의 부동 소수점 포맷 decimal : 정밀도를 높이기 위한 고유 포맷  캐스팅이 꼭 필요함

69 명시적 형 변환 타입의 크기나 부호여부, 정수와 실수 사이의 변환은 명 시적으로라도 형 변환이 가능하다.
형식이 조금 다르기는 하지만 모두 수치 값이므로 손실 이 있더라도 변환 할 수는 있다. 캐스트 연산자를 사용하더라도 명시적 형 변환이 허가 되지 않는 경우는 문자열과 bool 타입은 수치형으로 변 환할 수 없다.  강제적 형 변환 필요

70 강제적 형 변환 타입의 크기나 부호여부, 정수와 실수 사이의 변환은 명 시적으로라도 형 변환이 가능하다.
형식이 조금 다르기는 하지만 모두 수치 값이므로 손실 이 있더라도 변환 할 수는 있다. 캐스트 연산자를 사용하더라도 명시적 형 변환이 허가 되지 않는 경우는 문자열과 bool 타입은 수치형으로 변 환할 수 없다.  강제적 형 변환 필요 bool b = true ; int I = (int)b ;  허가 되지 않음 : bool은 상수이지 수치값이 아니기 때 문

71 강제적 형 변환 string s = “1234”; int I = (int)s ;
 문자열과 수치는 내부적적인 포맷이 완전히 다르기 때 문에 캐스트 연산자와 같은 방법으로는 변환 할 수 없다.  System 네임 스페이스의 Convert 클래스 이용

72 Convert 클래스의 정적 메서드 메서드 설명 ToInt16 16비트 정수로 변환한다. ToInt32
32비트 정수로 변환한다. ToUInt16 부호 없는 16비트 정수로 변환한다 ToUInt32 부호 없는 32비트 정수로 변환한다 ToDouble double 타입으로 변환한다. ToString 문자열로 변환한다. ToBoolean 논리형으로 변환한다.

73 ToInt32 메서드의 원형 Convert.ToInt32(Boolean) Convert.ToInt32(Byte) Convert.ToInt32(Char) Convert.ToInt32(Double) Convert.ToInt32(Int32) Convert.ToInt32(Int64) Convert.ToInt32(String) 각 타입에 대해 19개의 오버로딩되어 있어 대부분의 타 입은 다 변활 가능하다.

74 string s = “1234”; int I = Convert.ToInt32(s); 문자열을 정수로 변환 단, 큰 따옴표 안에 있는 값이 아라비아 숫자와 부호만 있어야 된다. 그렇지 않으면 FormatException 예외가 발생한다. 실수의 경우는 소수점도 포함할 수 있다. string s = “1234” ; int I = int.Parse(s); 각 타입이 제공하는 Parse 정적 메소드를 통해 문자열 타입을 해당 타입으로 변환 할 수도 있다. Parse 메서드로 문자열을 전달하면 이 문자열을 해석하여 자신의 타입으로 변환한다. 단, 적합한 문자열이어야 한다. int I = 1234 ; string s = i.ToString(); 이 변환에 의해 값 1234 가 “1234” 문자열이 된다. ToString 메서드는 루터 클래스인 object 가 제공하므로 모든 타입이 문자열로 변환될 수 있다.

75 도움말 닷넷의 라이브러리는 아주 방대하기 때문에 외워서 사용 한다는 것은 불가능하며 권장되지도 않는다.
객체 지향은 내부 구현을 숨기는 캡슐화 기능에 의해 구 체적인 것을 몰라도 클래스를 얼마든지 활용할 수 있으 므로 상세한 것까지 알려고 할 필요도 없고 알 수도 없도 록 숨겨져 있다. 대신에 공개된 인터페이스에 대해서는 알아야 클래스를 사용할 수 있다. 객체 지향 개발 툴들은 문서화가 잘 되어 있으며 이 문서 를 얼마나 잘 활용하는가가 경쟁력의 관건이다. 즉 객체 지향세계에서는 잘 외우는 개발자보다 잘 찾는 개발자가 훨씬 더 생산성이 높다.

76 도움말 코드 창에서 System. 까지 입력하면 System 네임 스페이스에 속한 클래스, 열거형, 네임스페이스가 나열됨.

77 도움말 Con까지만 입력한 후 엔터키를 치면 Console이 완성된다.

78 Console. 점 까지만 입력하면 Console 클래스에 소속된 필드, 메서드, 프로퍼티의 목록이 나타나며 특정 항목(Clear)을 클릭시 간략한 설명까지 볼 수 있다.
도움말

79 도움말 메서드(SetCursorPosition)명까지 선택 후 괄호를 열면 인수 목록과 인수에 대한 간략한 설명이 나타난다.
또한 최근에 참조한 항목을 선택해 주는 기능까지 있다.

80 도움말 찾을 대상 : Console 클래스 입력 코드 : C# 만 선택

81 도움말 도움말이 메서드, 속성, 이벤트 등에 대해 체계적으로 잘 정리되어 있어 객체 지향적인 개념만 있다면 Console 관련 문서를 10분 정도 대충 읽어만 봐도 Console 클래스를 자유 자재로 활용 할 수 있다.


Download ppt "C# 03장. 프로그램 구성 요소와 데이터형."

Similar presentations


Ads by Google