ASP.NET - Better than yesterday

Download Report

Transcript ASP.NET - Better than yesterday

쉽게배우는
ASP.NET 2.0
(ASP.NET Fundamental)
Park Yong Jun
(RedPlus)
Microsoft MVP, MCSD
http://www.dotnetkorea.com/
Chapter 02.
C# 기본 문법
.NET 기반 언어 살펴보기
.NET Framework상에서의 다중 언어 지원


.NET Framework는 다중언어를 지원한다.

20가지(?) 이상의 언어

Visual Basic .NET

C#

현실적으로는 C#과 Visual Basic이 주 사용
다중 언어 지원의 장점

사용된 코드의 재 사용성

모든 언어에서의 API 접근이 동일

하나의 언어만 익혀도 닷넷의 모든 기능 구현
CLR(Common Language Runtime)

하나의 런타임으로 모든 닷넷 언어 사용

쓰레드와 메모리 관리


가비지 컬렉션(Garbage collection)
DLL 버전 문제 해결
CLR에서의 컴파일과 실행
default.aspx
JIT 컴파일러
Native 코드
Compiler(C# or VB)
MSIL
네임스페이스란?

관련된 클래스들의 모임



네임스페이스는 계층적이다.
명명(Naming) 출동 방지
Visual Basic .NET 에서 네임스페이스 사용
(Imports)
Import System.Data.SqlClient

C#에서의 네임스페이스 사용(using)
using System.Data.SqlClient;
객체의 암시적 선언 및 명시적 선언

암시적 객체 선언 예
Improts System.Web.UI.WebControls
…
Dim listBox1 As New ListBox()
listBox1.Items.Add(“첫번째 항목”)
using System.Web.UI.WebControls;
…
ListBox listBox1 = new ListBox();
listBox1.Items.Add(“첫번째 항목”)

명시적 객체 선언 예
Dim listBox1 As New System.Web.UI.WebControls.ListBox()
listBox1.Items.Add(“첫번째 항목”)
System.Web.UI.WebControls.ListBox listBox1 =
new System.Web.UI.WebControls.ListBox();
listBox1.Items.Add(“첫번째 항목”);
Visual Basic .NET 과 C#
Visual Basic .NET과 C#의 특징



VB.NET

Visual Basic 6.0 과는 차이가 많이 남.

객체 지향적인 언어
C# :

.NET Framework기반의 새로운 언어

C, Visual C++, Java 스타일과 비슷

완전한 객체 지향적인 언어
ASP.NET 웹 애플리케이션은 Visual Basic .NET 또는
C#, 기타 어느 언어를 사용해도 무관하다.(평소 써오던 스
타일의 언어 선택)

.NET Framework기반에서 동작하므로 속도차 없음
개요

C# 프로그램의 구조

기본 입출력문

추천 사용법

컴파일, 실행, 디버깅
 C# Program의 구조

Hello, World 프로그램

클래스(Class)

Main 메서드(Main Method)

using 지시자, System Namespace

데모: Visual Studio .NET을 사용한
C# Program 생성
Hello, World 프로그램
using System;
class Hello
{
public static void Main()
{
Console.WriteLine("Hello, World");
}
}
클래스(Class)

C# 프로그램은 클래스, 구조체, 타입의 집합체

클래스는 데이터와 메서드의 집합

클래스 문법
class name
{
...
}

C# 프로그램은 많은 파일들로 구성됨

동일한 클래스는 여러 파일에서 사용될 수 없다.
Main 메서드



Main 메서드 작성시 유의할 점

Main 의 ‘M’자는 대문자

Main는 프로그램의 시작점(entry point)

Main는 public static void Main로 선언
여러 클래스에서 Main 메서드를 가질 수 있다.
Main 메서드가 끝나거나 값을 리턴할 때 애플리
케이션도 종료된다.
using Directive와 System Namespace

.NET Framework는 많은 유용한 클래스 제공

네임스페이스로 조직화.

최상의 네임스페이스 : System

네임스페이스.클래스.메서드
System.Console.WriteLine("Hello, World");

using 지시자(directive)
using System;
…
Console.WriteLine("Hello, World");
 기본 입/출력문

Console Class

Write / WriteLine 메서드

Read / ReadLine 메서드
콘솔 클래스(Console Class)

콘솔(도스창/명령프롬프트)

콘솔 응용프로그램만 가능

Standard input – keyboard

Standard output – screen

Standard error – screen
Write / WriteLine 메서드

Console.Write / Console.WriteLine

WriteLine : 문자열 출력 후 한 줄 내림
인덱스의 구문
{인덱스[,폭][:서식화 문자열]}
인덱스 : 참조할 매개변수를 나타냄
폭 : 출력할 폭을 결정
표준 숫자 형식 문자열 : 표시할 내용의 서식을 지정
D : 10진수 정수
X : 16진수 정수
C : 통화량
E : 지수
F : 실수
G : E/F
N : 콤마로 구분된 수
Read / ReadLine 메서드

Console.Read / Console.ReadLine

Read : 한 글자 입력 : 프로그램 종료 후 대기

ReadLine : 한 줄 입력
주석(Comment)의 이해


주석의 의미

실행파일의 속도 및 크기와 무관

개발자 사이의 정보전달 및 가독성 향상 기능

유지보수, 기능개선에 절대적으로 필요
주석의 종류

/* .... * / : 블럭 단위 주석

// : 라인 단위 주석

/// : XML 주석
•- Compile시 지정된 XML 파일로 출력
•- Document 처리에 매우 유용
주석 처리

주석 처리는 중요하다.


잘 선언된 주석은 개발로가 해당 애플리케이
션을 이해하는데 도움을 준다.
한줄 주석(Single-line comments)
// Get the user’s name
Console.WriteLine("What is your name? ");
name = Console.ReadLine( );

여러줄 주석(Multiple-line comments)
/* Find the higher root of the
quadratic equation */
x = (…);
XML 문서 생성
/// <summary> The Hello class prints a greeting
/// on the screen
/// </summary>
class Hello
{
/// <remarks> We use console-based I/O.
/// For more information about WriteLine, see
/// <seealso cref="System.Console.WriteLine"/>
/// </remarks>
public static void Main( )
{
Console.WriteLine("Hello, World");
}
}
데이터형(DataType)과
변수(Variable)
데이터형(DataType)의 종류
C# 형식
.NET Framework 형식
C# 형식
.NET Framework 형식
sbyte
System.SByte
float
System.Single
byte
System.Byte
double
System.Double
short
System.Int16
decimal
System.Decimal
ushort
System.UInt16
bool
System.Boolean
int
System.Int32
char
System.Char
uint
System.UInt32
string
System.String
long
System.Int64
object
System.Object
ulong
System.UInt64
.NET 프레임워크 형


형의 종류

C#형

.NET형(alias형)
변수에 형을 지정하는 방법은 아래 둘 다 가능

int //C#형
- or 
System.Int32 //.NET형
지역 변수(Local Variables)

데이터형과 변수명 사용해서 선언
int itemCount;

한번에 여러 개의 변수 선언 가능
int itemCount, employeeNumber;
--or-int itemCount,
employeeNumber;
변수에 값 할당

선언된 변수에 값을 할당하는 방법
int employeeNumber;
employeeNumber = 23;

선언과 동시에 초기화
int employeeNumber = 23;

작은 따옴표를 사용한 문자 대입
char middleInitial = 'J';
변수명 짓기의 규칙 및 추천방식

Rules


문자, 언더스코어(_), 숫자,
한글(유니코드) 사용 가능
Answer42
42Answer


different
Different


BADSTYLE
_poorstyle
BestStyle



Msg
Message


Recommendations

모두 대문자 피할 것

언더스코어로 시작 금지

생략형 피할 것

파스칼 표기법
(PascalCasing naming)
사용 권장
C# Keywords

키워드 ; 이미 만들어진 C#의 예약어
abstract, base, bool, default, if, finally

키워드를 변수명으로 사용하면 안된다.


컴파일 에러 발생
키워드와 동일한 모양의 변수 선언 금지
int INT; // Poor style
상수(Constant)

상수의 의미



프로그램 실행 도중 값을 변경할 수 없는 메모
리
선언
• const 자료형 상수명 = 초기값 ;
상수의 사용 목적

프로그램의 가독성 향상

유지보수 및 기능개선의 편리성 제공
형 변환

원래의 자료형이 아닌 자료형으로 변환 되는 현상

연산 및 대입에서 발생

연산의 우선 순위와 함께 다른 결과 유발

예상치 못한 오류의 원인이 될 수 있으므로 주의
형 변환 (1)

형 변환


정의
•서로 다른 데이터 형 사이에 발생하는 데이터 형의 변
환
형 변환 종류

암시적(묵시적) 변환(Implicit)
•작은 범위의 데이터를 큰 범위에 할당하는 경우와 같
이 값의 변화가 발생하지 않는 변환

명시적 변화(Explicit)
•큰 범위의 데이터를 작은 범위에 할당하는 경우는 변
환하고자 하는 아래와 같이 데이터 형을 지정한다.
byte
bData;
int iNum = (int)bData;
암시적 형 변환

특정한 구문 표시 없이 연산 또는 대입에 의하여 형 변환 발
생

예상치 못한 결과를 초래할 수 있으므로 사용하지 않을 것
을 권장

형식
기본적으로 작은형에서 큰형으로의 변화만 가능
대상
sbyte
short, int, long, float, double 또는 decimal
byte
short, ushort, int, uint, long, ulong, float, double 또는 decimal
short
int, long, float, double 또는 decimal
ushort
int, uint, long, ulong, float, double 또는 decimal
int
long, float, double 또는 decimal
uint
long, ulong, float, double 또는 decimal
long
float, double 또는 decimal
char
ushort, int, uint, long, ulong, float, double 또는 decimal
float
double
ulong
float, double 또는 decimal
명시적 형 변환



프로그래머가 분명하게 형의 변환을 표시하여 형
변환 유도
캐스트(cast)연산자 또는 System.Convert
Class 사용
캐스트 연산자


(자료형) 변수명 ...
System.Covert Class

다수의 Method를 이용하여 형 변환 유도
연산자
(Operators)
주요 연산자
Common Operators
•
•
•
•
•
•
•
Equality operators
Relational operators
Conditional operators
Increment operator
Decrement operator
Arithmetic operators
Assignment operators
Example
== !=
< > <= >= is
&& || ?:
++
-+ - * / %
= *= /= %= += -= <<= >>= &=
^= |=
산술 연산자
연산자
설명
+
덧셈
-
뺄셈
*
곱셈
/
나눗셈
%
나머지 연산자
할당(대입) 연산자
연산자
설명
+=
덧셈 연산 후 대입
-=
뺄셈 연산 후 대입
*=
곱셈 연산 후 대입
/=
나눗셈 연산 후 대입
%=
나머지 연산자 연산 후 대입
증감 연산자
연산자
설명
++a
// 연산 전에 1 증가
a++
// 연산 후에 1 증가
++
--a
// 연산 전에 1 감소
a--
// 연산 후에 1 감소
--
관계 연산자
연산자
설명
<
Less than
<=
Less than or equal
>
greater than
>=
Greater than or equal
==
Equal
!=
Not equal
조건 연산자
연산자
설명
&&
논리 AND
||
논리 OR
예
if ((x<y) && (x>0))
if ((x<y) || (x>0))
비트 연산자
연산자
설명
예
&
AND
int result = bi & bi2;
//result=00000000
|
OR
int result = bi | bi2;
//result=00110011
^
XOR
int result = bi ^ bi2;
//result=00110011
연산자의 종류(1)
연산자 범주
연산자
산술 연산자
=+ - * / %
논리 연산자(부울 및 비트)
& | ^ ! ~ && ||
문자열 연결 연산자
+
증가, 감소 연산자
++ --
시프트 연산자
<< >>
관계 연산자
== != < > <= >=
대입 연산자
= += -= *= /= = %= &= |= ^= <<= >>=
멤버 액세스 연산자
.
True false
연산자의 종류(2)
연산자 범주
연산자
인덱스 연산자
[]
캐스트 연산자
()
조건 연산자
?:
대리자 연결 및 제거 연산
자
+ -
개체 작성 연산자
new
형식 정보 연산자
is sizeof typeof
오버플로 예외 처리 연산자
checked unchecked
간접 참조 및 주소 연산자
* -> [] &
제어문 : 조건문/반복문/분기문



조건문

if~else문

switch~case문
반복문

for문

while문

do문
기타(점프문)

continue문

break문

goto문
블록이란?

단일 블록
{
// code
중첩된 블록내에서
는 동일한 변수
명 사용이 불가
능
다른 블록내에서
는 동일한 변수
명 사용 가능
}
{
{
int i;
int i;
...
{
...
}
int i;
...
...
{
}
int i;
}
...
}
조건문

조건문


조건을 판단한 후 조건에 따라 분기하여 수행
if 문
• 조건을 만족하면 문장을 실행하고 다음 라인을 수행
• if 문의 조건을 만족하지 않으면 수행을 한 번도 하지 않음
.
• 형식
if (조건)
{
문장;
}
조건문

if  else 문
• 형식
if (조건)
{
문장 1 ;
}
else
{
문장 2 ;
}
• 조건을 만족하면 조건 다음의 문장1을 수행
하고 조건을 만족하지 않으면 else 다음의
문장 2를 수행
조건문

다중 if 문
• 형식
if (조건1)
{
문장 1 ;
}
else if (조건2)
{
문장 2 ;
}
(else if를 붙여 연속적으로 만들 수 있음)
else
{
기본문장;
}
switch 문

여러 개의 case 구문을 사용하여 여러 조건
처리
switch (trumps) {
case Suit.Clubs :
case Suit.Spades :
color = "Black"; break;
case Suit.Hearts :
case Suit.Diamonds :
color = "Red"; break;
default:
color = "ERROR"; break;
}
for 문

for 문

특징
•[시작값], [최종값], [증가값]을 설정하여 반복적인
수행을 할 수 있는 문장
•규칙적인 증가를 하는 경우에 많이 사용

형식
for (초기식; 논리식; 증감식)
{
명령문 ;
}
•한 문장 이상인 경우에는 ‘{‘와 ‘}’ 기호를 이용하여
문장을 묶어줌.
for 문

0부터 9까지 반복
for (int i = 0; i < 10; i++) {
Console.WriteLine(i);
}

0123456789
for문내에서 선언되 변수는 블록을 빠져나가면 소멸
for (int i = 0; i < 10; i++)
Console.WriteLine(i);
Console.WriteLine(i); // 에러 발생

구문내에서 여러 개의 변수 선언 가능
for (int i = 0, j = 0; ... ; i++, j++)
반복문

while 문

특징
• [조건만족]이 true인 동안은 문장을 반복하고 false일 경우에는 while 문 다음의 문장을
수행
• 조건을 먼저 확인하기 때문에 한 번도 수행하지 않는 경우도 있음.

형식
while (조건식)
{
명령문;
}
초기값;
while (조건식)
{
for (초기값; 최종값; 증감식)
{
명령문;
증감식;
}
명령문;
}
while 문

조건이 만족하는 동안 반복 실행
int i = 0;//초기식
while (i < 10)//논리식
{
Console.WriteLine(i);//명령문
i++;//증감식
}
0123456789
do 문

선 실행 후 조건 처리
int i = 0;
do {
Console.WriteLine(i); // 구문을 먼저 실행
i++;
} while (i < 10);
0123456789
foreach 문

배열 또는 컬렉션과 같은 데이터에 데이터가 있는
만큼 반복
ArrayList numbers = new ArrayList( );
for (int i = 0; i < 10; i++ ) {
numbers.Add(i);
}
foreach (int number in numbers) {
Console.WriteLine(number);
}
0123456789
goto 문 : 사용금지(?)

레이블을 만들어 놓고 해당 레이블 위치로 이동시
킬 수 있는 기능을 제공

스파게티 코드를 만들 가능성이 있다.
if (number % 2 == 0) goto Even;
Console.WriteLine("odd");
goto End;
Even:
Console.WriteLine("even");
End:;
break 및 continue 문

break문은 반복문을 빠져나간다.

continue문은 다음 반복위치로 이동한다.
int i = 0;
while (true) {
Console.WriteLine(i);
i++;
if (i < 10)
continue;
else
break;
}
배열(Arrays)
배열이란?

배열은 요소들의 집합이다.

배열의 각 요소들은 모두 동일한 데이터 타입
을 가짐

구조체는 서로 다른 데이터 타입을 가짐

각 요소들은 정수형 인덱스로 접근 가능
(0)
정수 Index 0
(1)
(2)
(3)
(4)
(5)
(6)
정수 Index 6
C#에서의 배열 표기법

배열 변수를 아래와 같이 선언할 수 있다.

배열의 데이터 타입

배열의 차원 수

배열 변수의 이름
type [ ] name;
배열
배열의
배열
변수의
이름
차수
기록
요소의
데이터
기록
유형
배열의 랭크(차원 수)

배열의 종류

n열의 요소로 구성된 1차원 배열

n열의 요소가 m행으로 구성된 2차원 배열
long[ ] row;
long형 데이터를 가지는 1차
원 배열 row
int[,] grid;
int형 데이터를 가지는 2차원
배열 grid
배열 요소에 접근하기

각 랭크에 정수형 인덱스를 지정함

인덱스는 0부터 시작한다.
long[ ] row;
...
row[3];
int[,] grid;
...
grid[1,2];
2
3
1
배열의 경계 체크하기

모든 배열의 경계를 체크 가능


잘못된 인덱스 지정 :
IndexOutOfRangeException
Length 속성과 GetLength 메서드 사용
row
row.GetLength(0)==6
grid
grid.GetLength(0)==2
grid.GetLength(1)==4
row.Length==6
grid.Length==2*4
배열과 컬렉션의 비교

배열은 꽉 찼을 때 크기 조절이 안 됨


배열은 하나의 데이터 타입만 지정/저장 가능


컬렉션은 서로 다른 요소 저장 가능
배열의 각 요소에 읽기 전용 설정 안됨


ArrayList와 같은 컬렉션 클래스는 크기
조정 가능
컬렉션은 읽기 전용 가능
일반적으로, 배열이 컬렉션보다 빠르다. 하지
만 유연성은 떨어진다.

컬렉션은 조금 느리지만 유연성은 크다.
 배열 생성하기

배열의 인스턴스 생성

배열 요소의 초기화

다차원 배열 요소의 초기화

계산된 크기의 배열 생성

배열 변수의 복사
배열의 인스턴스 생성

배열을 선언한다고 배열요소가 만들어지는건 아님

배열의 요소를 생성하려면 new 연산자 사용

배열 요소들은 기본값으로 0으로 초기화
row
long[ ] row = new long[4];
0
Variable
int[,] grid = new int[2,3];
grid
0
0
Instance
0
0
0
0
0
0
0
배열 요소의 초기화

배열 요소의 선언과 동시에 초기화

배열의 요소를 초기화할 때 줄여 사용
long[ ] row = new long[4] {0, 1, 2, 3};
long[ ] row = {0, 1, 2, 3};
0
row
동일
1
2
3
2차원 배열 요소의 초기화

2차원 배열 요소의 초기화도 아래와 같다.

모든 요소가 명시되어야 함
int[,] grid = {
{5, 4, 3},
{2, 1, 0}
};
int[,] grid = {
{5, 4, 3},
{2, 1
}
};
암시적으로 new int[2,3]
 grid

5
4
3
2
1
0
계산된 크기의 배열 선언

컴파일 시 배열 크기 지정

컴파일시에 미리 배열의 크기를 지정해 놓는
게 다른 방법보다 속도가 향상된다.
long[ ] row = new long[4];

런타임 시 배열 크기 지정
string s = Console.ReadLine();
int size = int.Parse(s);
long[ ] row = new long[size];
배열 변수의 복사

배열 변수의 복수는 배열 변수 자체만 복사

배열의 인스턴스는 복사되지 않음

2개의 배열 변수는 동일한 배열 인스턴스를 참조
long[ ] row = new long[4];
long[ ] copy = row;
row
...
row[0]++;
copy
long value = copy[0];
Console.WriteLine(value);
Variable
0
0
0
Instance
0
배열의 배열

배열의 배열(Jagged Arrays)

배열의 요소가 일정하지 않은 배열

달력의 12개월 각각의 날짜수가 다름
int [] [] intDaysInMonth;
intDaysInMonth = new int [12][];
intDaysInMonth[0] = new int[31];
intDaysInMonth[1] = new int[28];
…
intDaysInMonth[11] = new int[31];
intDaysInMonth[0]
0
1 … 30
intDaysInMonth[1]
0
1 … 28
 배열 사용

배열 관련된 속성

배열 관련된 메서드

메서드로부터 배열 반환

인수로 배열 전달

명령줄 인수(Command-Line Arguments)

foreach문을 사용한 배열 사용
배열 관련된 속성
long[ ] row = new long[4];
0
0
0
0
row.Rank
1
row.Length
4
row
int[,] grid = new int[2,3];
grid
0
0
0
0
0
0
grid.Rank
2
grid.Length
6
배열 관련된 메서드

일반적으로 사용되는 메서드


Sort – 차수 1에 대한 배열 요소를 정렬
Clear – 배열 요소의 범위를 0또는 null로 초
기화

Clone – 배열 복사

GetLength – 주어진 차수의 길이값 반환

IndexOf – 주어진 값의 첫번째 인덱스 값 반
환
메서드로부터 배열 반환

배열을 반환하는 메서드 선언 가능
class Example {
static void Main( ) {
int[ ] array = CreateArray(42);
...
}
static int[ ] CreateArray(int size) {
int[ ] created = new int[size];
return created;
}
}
인수로 배열 전달

배열 인수는 배열 변수의 복사본

배열 인스턴스의 복사가 아님
class Example2 {
static void Main( ) {
int[ ] arg = {10, 9, 8, 7};
Method(arg);
System.Console.WriteLine(arg[0]);
}
static void Method(int[ ] parameter) {
parameter[0]++;
이 메서드는 Main 메서드에서
}
생성된 원본 배열을 수정함
}
명령줄 인수(Command-Line Arguments)

런타임시 명령줄 인수를 Main 메서드로 전달

Main 메서드는 매개변수로 문자열 배열을 전
달 받음
class Example3 {
static void Main(string[ ] args) {
for (int i = 0; i < args.Length; i++) {
System.Console.WriteLine(args[i]);
}
}
}
foreach문을 이용한 배열 사용

foreach문은 배열의 요소를 다루는데 유용한 구
문
class Example4 {
static void Main(string[ ] args) {
foreach (string arg in args) {
System.Console.WriteLine(arg);
}
}
}
메서드와 파라미터
(Methods and Parameters)
함수 : 메서드


함수(메서드)

어떤 특정한 로직을 모아놓은 프로그램 코드

C#에서는 함수라는 이름을 사용하지 않는다.

같은 클래스 안에서의 메서드를 함수라한다.
함수의 종류

내장 함수
•ToString()

사용자 정의 함수
•매개변수가 없는 함수
•매개변수가 있는 함수
•반환값이 있는 함수
메서드 선언

Main도 메서드이다.

새로운 메서드도 Main과 같은 형식으로 정의
됨
using System;
class 샘플클래스
{
static void 샘플메서드( )
{
Console.WriteLine(“샘플 메서드");
}
static void Main( )
{
// ...
}
}
메서드 호출

메서드 선언 후에 할 수 있는 사항들

같은 클래스 안에 있는 메서드 호출
•괄호안에 파라미터 목록을 사용한 메서드 이
름 사용

다른 클래스 안에 있는 메서드 호출
•반드시 컴파일러한테 해당 메서드를 포함하
는 클래스의 이름을 지정해주어야 함l
•호출되는 메서드는 반드시 public 키워드로
선언되어야 함

중첩 호출 가능
•메서드는 중첩 호출이 가능하다. 즉, 메서드
가 또 다른 메서드를 호출 가능하다.
return 구문 사용

즉시 리턴

조건문을 사용한 리턴
static void ExampleMethod( )
{
int numBeans;
//...
Console.WriteLine("Hello");
if (numBeans < 10)
return;
Console.WriteLine("World");
}
로컬 변수 사용


로컬 변수(Local variables)

메서드가 시작될 때 생성

메서드에 대해서 Private

메서드 종료와 함께 소멸
공용 변수(Shared variables) : 전역 변수


공유 용도로 사용되는 클래스 변수
범위 충돌(Scope conflicts)

컴파일러는 로컬/클래스 변수의 충돌에 대해서
경고를 발생시키지 않음
반환 값

반환값이 있는 메서드 선언

return 키워드를 구문에 추가


반환값 설정

호출한 곳으로 반환값 반환
반환값이 있는 메서드는 반드시 값을 리턴해야 함
static int TwoPlusTwo( ) {
int a,b;
a = 2;
b = 2;
return a + b;
}
int x;
x = TwoPlusTwo( );
Console.WriteLine(x);
 파라미터 사용

파라미터 정의 및 호출

파라미터 전달 기법

값에 의한 전달(Pass by Value)

참조에 의한 전달(Pass by Reference)

Output 매개변수(Output Parameters)

매개변수 리스트 사용

파라미터 전달 예시

재귀적 메서드(Recursive Methods) 사용
파라미터 정의 및 호출


파라미터 정의

메서드명 다음에 나오는 괄호안에 위치

각 파라미터에 데이터형과 이름 지정
파라미터를 사용한 메서드 호출

각 파라미터에 값이 전달됨
static void MethodWithParameters(int n, string y)
{ ... }
MethodWithParameters(2, "Hello, world");
파라미터 전달 기법

파라미터 전달의 3가지 방법
in
값에 의한 전달(Pass by value)
in
out
참조에 의한 전달(Pass by reference)
out
Output 매개변수(Output parameters)
값에 의한 전달(Pass by Value)

파라미터 전달의 기본 기법

파라미터 값이 복사됨

변수는 메서드 안에서 바뀜

메서드 밖에 있는 값에는 영향을 미치지 않음

파라미터는 반드시 같거나 호환 가능해야 함
static void AddOne(int x)
{
x++; // Increment x
}
static void Main( )
{
int k = 6;
AddOne(k);
}
Console.WriteLine(k); // Display the value 6, not 7
참조에 의한 전달(Pass by Reference)

참조형 매개변수란?


참조란 메모리 상의 위치(포인터)이다.
참조형 매개변수 사용

메서드 선언 및 호출시 ref 키워드 사용

타입과 변수값이 맞아야 함

호출자에 의해서 원본 데이터에 영향

메서드를 호출하기 전에 매개변수를 초기화해
야함
Output 매개변수(Output Parameters)

Output 매개변수란?


매개변수값이 메서드 안에서 밖으로 전달
Output 매개변수 사용


기본적을 ref 매개변수와 같다.
• 그렇지만 값이 메서드 안으로 전달되지는
않음
메서드 선언과 호출시 out 키워드 사용
static void OutDemo(out int p)
{
// ...
}
int n;
OutDemo(out n);
가변형 매개변수

params 키워드 사용

값 전달

한 번에 여러 개의 매개변수(배열형) 전달 가능
static long AddList(params long[ ] v)
{
long total, i;
for (i = 0, total = 0; i < v.Length; i++)
total += v[i];
return total;
}
static void Main( )
{
long x = AddList(63,21,84);
}
오버로드된 메서드 선언(Overloaded Methods)

클래스 안에서 메서드 이름 공유
Distinguished by examining parameter
lists
class OverloadingExample

{
}
static int Add(int a, int b)
{
return a + b;
}
static int Add(int a, int b, int c)
{
return a + b + c;
}
static void Main( )
{
Console.WriteLine(Add(1,2) + Add(1,2,3));
}
사용자 정의 데이터 타입(열거형과 구조체형)

Enumeration Types

Structure Types
열거형

enum


상수의 열거형태
[modifiers] enum identifier [:base-type]
{enumerator-list}

상수를 나열하는 개념

base-type생략시 일반적으로 int형으로 취급

base-type은 char을 제외한 정수형 사용 가
능
열거형

Defining an Enumeration Type
enum Color { Red, Green, Blue }

Using an Enumeration Type
Color colorPalette = Color.Red;

Displaying an Enumeration Variable
Console.WriteLine(“{0}”, colorPalette); // Displays Red
구조체(Structure Types)

구조체

하나의 이름으로 여러 데이터형을 보관

클래스 구조보다 접근이 빠름(스택 사용)

상속 불가능

프로그램 내에서 데이터 보관 용도로 사용
Structure Types

Defining a Structure Type
public struct Employee
{
public string firstName;
public int age;
}

Using a Structure Type
Employee companyEmployee;
companyEmployee.firstName = “RedPlus”;
companyEmployee.age = 21;
Overflow


연산 또는 대입된 데이터가 선언된 자료형의 크기
를 넘는 현상
checked & unchecked 연산



Overflow 발생에 대하여 예외를 발생시키는
연산
예외처리 기준에 따라 처리 가능
프로그램 효율에 영향을 주기 때문에 신중한
사용 필요
예외의 의미



프로그램 실행도중 발생하는 예상치 못한 오류
처리되지 않은 예외는 프로그램의 실행을 중단시
키는 원인
신뢰도 및 안정성 측면에서 매우 중요
Exception Handling
using System;
public class Hello
{
public static void Main(string[ ] args)
{
try{
Console.WriteLine(args[0]);
}
catch (Exception e) {
Console.WriteLine("Exception at
{0}", e.StackTrace);
}
}
}
Exception Objects
Exception
SystemException
OutOfMemoryException
IOException
NullReferenceException
ApplicationException
try ~ catch 블록

예외(에러) 처리

예외가 발생할만한 구문을 try절에 놓음

try절에서 예외가 발생하면 catch절 실행됨
try {
Console.WriteLine("Enter a number");
int i = int.Parse(Console.ReadLine());
}
catch (OverflowException caught)
{
Console.WriteLine(caught);
}
Program logic
Error handling
throw 구문

예외를 직접 발생시킴
throw expression ;
if (minute < 1 || minute >= 60) {
throw new InvalidTimeException(minute +
" is not a valid minute");
// !! Not reached !!
}
finally 절

예외가 발생하던 발생하지 않던간에 항상 실행되어
야 하는 구문을 입력하는 곳
Monitor.Enter(x);
try {
...
}
finally {
Monitor.Exit(x);
}
Any catch blocks are optional
네임스페이스(Namespace)


네임스페이스

클래스명의 중복 방지

클래스를 계층적으로 관리

회사마다 회사명을 Top 네임스페이스로 구성
System네임스페이스


System.Console.WriteLine();
System 네임스페이스 안에 있는 Console 이
라는 클래스 안에 있는 WriteLine 이라는 메서
드
Namespace 란

클래스 및 기타 Type을 구조화

클래스 이름과 기타 Type의 이름이 충돌하지 않도록 방지

표준 namespace는 대부분 System으로 시작한다.


ex) System.Net, System.Threading, …
사용가이드라인

PascalCasing 을 사용할 것
•예) VandorA.SuiteB

회사 이름 혹은 잘 알려진 브랜드 이름을 접두어로 사용
할것
•예) Microsoft.Biztalk, BEA.Weblogic, IBM.Corba

필요하다면, 복수형 이름도 상관 없음
•예) System.Collections

네임스페이스 이름과 클래스 이름으로 동일한 이름을 사
용하는 것을 피할 것
네임스페이스(The .NET Framework)
System.Web
Services
Description
UI
HtmlControls
Discovery
WebControls
System.WinForms
Design
Protocols
ComponentModel
System.Drawing
Caching
Security
Drawing2D
Printing
Configuration
SessionState
Imaging
Text
System.Data
System.Xml
ADO
SQL
XSLT
Design
SQLTypes
XPath
Serialization
System
Collections
IO
Security
Runtime
InteropServices
Configuration
Net
ServiceProcess
Diagnostics
Reflection
Text
Remoting
Globalization
Resources
Threading
Serialization
네임스페이스(Base Framework)
System
Collections
Security
Configuration
ServiceProcess
Diagnostics
Text
Globalization
Threading
IO
Runtime
InteropServices
Net
Reflection
Remoting
Resources
Serialization
네임스페이스(Data And XML)
System.Data
ADO
SQL
Design
SQLTypes
System.Xml
XSLT
XPath
Serialization
네임스페이스( Web Forms And Services)
System.Web
Services
UI
Description
HtmlControls
Discovery
WebControls
Protocols
Caching
Security
Configuration
SessionState
네임스페이스( Win Forms)
System.WinForms
Design
ComponentModel
System.Drawing
Drawing2D
Printing
Imaging
Text
System.Math 클래스

System 네임스페이스 안에 있는 Math 클래스


수학관련 주요 기능 제공
자주 사용하는 수학 관련 메서드

필드
•Math.E : 자연 로그 상수
•Math.PI : 원주율

메서드
•Math.Abs() : 절대값
•Math.Max(,) : 최대값
•Math.Min(,) : 최소값
•Math.Pow(,) : 승수
•Math.Round(,) : 반올림
System.DateTime 구조체

DateTime 구조체


날짜 관련 주요 속성 및 메서드 제공
주요 멤버

Visual Studio .NET 도움말 참조

검색어 : DateTime 구조체
System.TimeSpan 구조체

TimeSpan 구조체


시간 간격 관련 주요 속성 및 메서드 제공
주요 멤버

Visual Studio .NET 도움말 참조

검색어 : TimeSpan 구조체
System.Random 클래스

Random 클래스



임의값 반환
주요 멤버

Visual Studio .NET 도움말 참조

검색어 : Random 클래스
관련 실습

로또 번호 생성기 작성
System.Array 클래스

Array 클래스


배열 관련 주요 속성 및 메서드 제공
주요 멤버

Length

Rank

GetLength()

Sort()

Reverse()

Clear()

기타
System.Exception 클래스 : 예외 처리

throw문을 사용한 사용자 정의 예외 처리
using System;
public class 예외처리{
public static void Main(){
Exception 예외내용;
예외내용 = new Exception("예외 발생!!!");
try{
throw(예외내용);
}
catch(Exception e){
Console.WriteLine(e.Message);
}
finally{
Console.WriteLine(
"[예외 발생]이라는 예외가 발생했군요.");
}
}
}
System.String 클래스 : 중요

String 클래스의 생성자

String 클래스의 주요 멤버
string s = "Hello";
s[0] = 'c'; // Compile-time error
퀴즈 : 파일명과 확장자 분리하기

주어진 원본 디렉터리명
string strDir = “c:\\inetpub\\wwwroot\\pyj.love.gif”

출력(모든 경우의 수 충족)
파일명 : pyj.love
확장자 : gif
System.StringBuilder 클래스


StringBuilder 클래스

String 클래스와 비슷, 좀 더 확장된 기능 제공

성능 향상
실습
System.Object 클래스


Synonym for System.Object
모든 클래스의 기본 클래스(Base class for all
classes)
Object
String
Exception
SystemException
MyClass
Unified type system

모든 형은 궁극적으로 System.Object 을 상속
예약어
구조체
sbyte, byte
System.SByte, System.Byte
short, ushort
System.Int16, System.UInt16
int, uint
System.Int32, System.UInt32
long, ulong
System.Int64, System.UInt64
char
System.Char
float
System.Single
double
System.Double
bool
System.Boolean
decimal
System.Decimal
공통 메서드들(Common Methods)

Common methods for all reference
types

ToString method

Equals method

GetType method

Finalize method
공통형 시스템(Common Type System;CTS) 개요

CTS는 크게 값형과 참조형으로 구분한다.
Type
Value Type
Reference Type
Value Type vs Reference Type

메모리와 할당과 환원 방식의 차이
구분
Value Type
Reference Type
유형
enum, struct
class, delegate, interface
스택
관리되는 힙
생성
선언과 동시에 자동 생성
명시적으로 생성자 호출시 생성
상속
불가
자료형의 성격에 따라 가능
값의 복사
값의 공유
소속구역 탈출 시
GC의 관리하에서 환원
소규모
대규모
메모리
매개변수
환원
메모리 크기
Value / Reference types


Value types

데이터를 직접 담고 있는 변수

Null 일수 없다.

변수의 선언과 정의가 일치
Reference types

데이터(객체)에 대한 참조를 포함.

Object를 참조하고 있는 변수

Null 일수 있다.

변수의 선언과 정의가 일치 하지 않음
i
s
123
int i = 123;
string s = "Hello world";
"Hello world"
내장형과 사용자정의형 비교
Value Types
Built-in Type
Examples of
built-in value types:
int
float
User-Defined
Examples of user-defined value types:
enum
struct
is 연산자

만약에 변환이 가능하다면 true 값을 반환
Bird b;
if (a is Bird)
b = (Bird) a; // Safe
else
Console.WriteLine("Not a Bird");
as 연산자

Reference-Type 간의 데이터 형 변환

잘못된 데이터 형 변환시


null 을 반환

예외(Exception)을 발생하지 않음
as 는 is 연산자 + 캐스팅
Bird b = a as Bird; // Convert
if (b == null)
Console.WriteLine("Not a bird");
Unified type system


Boxing

Box화 한다. 즉, 포장한다. 비싼 영역으로 옮긴다.

값을 복사하여 넣는다.

암시적 형변환 : 데이터의 손실이 없음.
Unboxing

Box의 Type를 Check

값을 들어낸다.

명시적 형변환 : 데이터의 손실이 있을수 있으며 예외도 있을수 있다.
i
int i = 123;
object o = i; //Boxing
int j = (int)o; //Unboxing
123
System.Int32
o
j
123
123
앞으로 우리가 배워야 할 주요 기능

파일 처리(System.IO)

데이터베이스 처리(ADO.NET)

웹 컨트롤(ASP.NET)

XML 처리

기타 모든 분야…
System.IO Namespace

파일 처리관련 클래스 제공

File, Directory

StreamReader, StreamWriter

FileStream

BinaryReader, BinaryWriter
System.Xml Namespace

XML/XSLT 관련 풍부한 클래스 제공
System.Data Namespace

System.Data.SqlClient


SQL Server 관련된 주요 클래스 제공
System.Data

데이터베이스 처리 관련 클래스 및 네임스페이
스 제공