BLOG ARTICLE DEVELOP/C# | 26 ARTICLE FOUND
- 2006.10.11 14장 수업내용
- 2006.10.10 13장 수업내용
- 2006.10.09 12장 수업내용
- 2006.09.29 11장 수업내용
- 2006.09.28 10장 수업내용
- 2006.09.27 9장 수업내용
- 2006.09.26 8장 수업내용
- 2006.09.19 7장 수업내용
- 2006.09.15 4장 수업내용
- 2006.09.13 3장 수업내용
- 2006.09.11 C#시작하기
public class List<T> // T:형매개변수
-> ArrayList를 개선한것
특징
다양한 데이터형을 저장할 수 없다.
길이가 가변이다.
컴파일시 저장될 데이터형이 결정된다
생성방법
List<string> list1 = new List<string>();
List<int> list2 = new List<int>();
사용방법
List<int> list = new List<int>();
list.Add(10);
int value=list[0];//컴파일시 점검됨 형식이 다를시 에러
Queue 제네릭
FIFO
Enqueue -> -> Dequeue
//특정형만 받음
queue<string> q = new queue<string>();
q.Enqueue("wish");
string data = q.Dequeue();
Stack 제네릭
LIFO
Push -> -> Pop
Stack<string> s = new Stack<string>();
s.Push("wish");
string value = s.Pop();
개념 컴파일후에도 살아있는 주석?
소스개발자가 향후 이용이 되는 곳(컴파일러 CLR .NET Framework Server)에서 사용방법은 미리 설명해 놓은것-> 런타임시 사용되는 주석
특성의 작성
(public) class [특성명]Attribute : Attribute {}
필수 필수 기본클래스를 상속받음
특성의 사용
[특성명(Attribute)](생성자 매개변수 리스트,[필드명/속성명]=[필드값/속성값],... )
생성자 매개변수 정보 필드 또는 속성값을 설정
특성의 사용위치
[AttributeUsage(특성 적용대상, AllowMultiple = (중복적용여부/true/false), Inherited = (특성상속여부/true/false))]
생성자에 대한 정보 속성값 설정 부분
예외
실행도중 비정상적은 상황
예외발생
프로그램 다운(실행멈춤)
예외처리
프로그램이 예외를 처리해서 정상적인 실행이 되도록 하는 방법
예외처리방법
try{
//예외발생가능코드
} catch(발생예외 개체형 변수){
//예외처리코드
} finally{
//예외발생여부와는 상관없는 코드
}
예외의 종류
Exception <- 모든 예외의 최상위 클래스
발생된 예외별로 처리를 달리할 경우
try {
.... //A-Ex
.... //B-Ex
...}
catch (A-Ex e1) {....}
catch (B-Ex e2) {....}
catch (Exception e3) {....} //이외의 모든 예외(default) //무조건 맨 아래에 와야한다.
예외 정보 얻기
catch (Exception e)
{
string why = e.Message;//개발자용 에러정보다
string trace = e.StackTrace;//사용자에게 제공하면
string explain = e.ToString();}//코마루 하다
}
사용자정의 예외 만들기
Exception
↑
사용자 예외 클래스
예외발생
throw new [예외클래스명]("설명")
대리자란?
메소드를 대신해서 호출
코드 -> 대리자호출 -> 메소드호출
-> 메소드호출
-> 메소드호출
델리게이트의 선언
선언위치 : 네임스페이스,클래스
선언방법 : 메소드와 비슷
[접근지정자] delegate [반환형] [대리자명]([매개변수리스트]);
//반환형/매개변수리스트 <- 대리자가 호출할 수 있는 메소드의 모양?형식?
델리게이트가 호출할 수 있는 메소드
반환형과 메개변수리스트가 일치하는 메소드
ex1. delegate void del1();
-> void [메소드명](){....};
ex2. delegate string del2(string arg);
-> string [메소드명](string arg){....};
델리게이트의 메소드 등록
[델리게이트명] 변수 = [메소드명];
ex. delegate void Del1();
-> void Method1(){....};
-> De1 del = Method1; //del이 Method1호출할 수 있다.
-> del += Method2; //del은 Method1~2를 호출할 수 있다.
델리게이트에 등록된 메소드 제거
del -= Method2; //제거
※이벤트(Event)
개념 : 사건의 발생
이벤트와 관련된 개체
이벤트 발생자 // 교실
↓
이벤트 수신자 // 소방서
↓
이벤트 처리자 // 소방차
C#에서 이벤트와 관련된 개체
이벤트 발생자 : 이벤트 델리게이트(대리자)를 실행하는 실행하는 개체
이벤트 수신자 : 이벤트 발생자가 실행하는 메소드를 가지고 있는 개체
이벤트 처리자 : 이벤트 수신자의 실행 메소드(이벤트 핸들러)
Ex
버튼 // 이벤트 발생자 : 이벤트 델리게이트 실행
↓
폼 // 이벤트 수신자 : 이벤트 델리게이트가 실행할 메소드를 가지고 있다.
↓
폼의 메소드 // 이벤트 처리자
이벤트 발생개체 코딩방법
이벤트를 선언
[접근제한자] event [델리게이트명] [이벤트명];
(델리게이트형의 필드를 정의하는 것)
이벤트 발생방법
->델리게이트의 실행방법과 동일
이벤트명(매개변수리스트);
ex. attackedEvent(매개변수리스트);
이벤트의 델리게이트형
[접근지정자] delegate void [대리자명](object sender, EventArgs args); //관례적
이벤트발생자 , 이벤트에 대한 정보 또는 자식개체(상속)
이벤트 수신자 코팅방법
이벤트 발생개체로부터 발생된 이벤트를 처리할 메소드를 등록 -> 델리게이트의 메소드 등록
이벤트명 = 메소드명1;
이벤트명 += 메소드명2;
이벤트 처리자 코딩방법
void [메소드명] (object obj, EventArgs args){....}
속성(property)
필드와 속성의 관계
속성은 은닉화된 필드값을 설정하고 있는 역할
속성의 값은 필드값과 반드시 일치하지 않는다.※
속성은 필드값을 가공하고 값의 유효성을 체크할 수 있다.(데이터의 안정화)※
속성의 작성법
private int age;
public int Age{ //대문자
get{ [return문] } //읽기
set{ age=values; } //쓰기
}
속성 사용법
읽기
int x = 변수.Age; //get 블럭이 실행
쓰기
변수.Age = 10; //set 블럭이 실행
같은 데이터형을 index로 관리하는 참조형 개체
int [] values = new int[3];
스택 | 힙 |
values | 값/값/값 |
모든 배열은 System.Array 클래스를 상속
배열에서 자주 사용되는 속성/메소드
Length:방의 갯수
Clear:초기화 (상수형:0/참조형:null)
???
배열값의 읽기 및 쓰기
배열명 [인덱스번호] = 값;
데이터형 변수 = 배열명 [인덱스번호];
배열의 선언
데이터형 [] 배열명 = new 데이터형 [방개수];
데이터형 [] 배열명 = new 데이터형 [] {...........};
데이터형 [] 배열명 = {............};
데이터형 [] 배열명;
배열명 = new 데이터형 [방개수];
배열명 = new 데이터형 [] {...........};
배열명 = {...........};//불가
Hashtable
특징
참조형 개체를 저장
크기가 자동적으로 조절
키로 개체를 관리
키값 | 키값 | 키값 |
개체 | 개체 | 개체 |
개체를 저장하는 방법
변수.Add(object key, object value);
변수[키값] = 개체;
개체를 삭제하는 방법
변수.Remove(object key);
변수.Clear(); //모든 개체를 삭제
개체를 찾는 방법
object obj = 변수[키값]
//형변환
string value = (string) 변수[키값]
NameSpace
목적
클래스 구조체 인터페이스 열거형등을 기능별로 묶어 관리하기 위해서
쉽게 찾기 위해서
소유회사에 대한 정보를 표시하기 위하여
작성법
네임스페이스명 {.....}
작명법
첫문자는 대문자가 관례
설계회사의 URL의 역방향으로 지어주는게 관례
http://www.samsung.com
com.samsung
TV
TV1.CS
TV2.CS
멤버
네임스페이스명
{
.....
[타입정의형]
열거형
클래스
구조체
인터페이스
대리자
네임스페이스
....
}
계층표시
com{ //네임스페이스명
samsung{ //네임스페이스명
....
}
}
//동일표현으로..
com.samsung{
....
}
**시험문제 주관식
접근 제한자(액세스 한정자/Access Modifier)
(public/*internal) class 클래스명
{
(public/internal/*private/protected) void Main()
{
......
}
}
//public : 모든 설계도상에서 사용가능
//internal : 한정자의 역할, 같은 어셈블리(프로젝트) 내에서만 사용가능
//private : 한정자의 역할, 해당 타입내에서만 사용가능
다른 솔루션의 개체를 사용하기 위해서는 참조에서 해당 폴더 bin의 솔루션명.exe파일을 추가하면 사용할 수 있다..
필드/메소드
종류
인스턴스/정적
인스턴스(필드/메소드):반드시 개체를 만들어서 사용해야함
(개체별로 따로 갖고 있음)
ex. Car myCar = new Car();
myCar.Sound();
정적(static)(필드/메소드): 클래스 이름으로 사용해야함
(데이터 영역에 한번 만들어짐)
ex. Console.WriteLine();
클래스명.정적메소드
상수와 읽기 전용필드
공통점
값이 할당되면 변경할 수 없다.
차이점
초기값 할당위치가 다르다
상수는 값형 스트링만 가능
읽기전용필드는 값형 모든 참조형 가능
접근방식이 다르다
(상수:클래스명.상수명)
(읽필:참조변수.필드명)
상수의선언
클래스의 멤버/지역변수도 선언가능
[접근제한자] const [데이터형/값형,스트링] 상수명 = 값;
정적(필드/메소드)의 특징
static키워드가 붙는다.
클래스명으로 사용
공유의 의미가 있다.상수와 읽기 전용필드
공통점
값이 할당되면 변경할 수 없다.
차이점
초기값 할당위치가 다르다
상수는 값형 스트링만 가능
읽기전용필드는 값형 모든 참조형 가능
접근방식이 다르다
(상수:클래스명.상수명)
(읽필:참조변수.필드명)
상수의선언
클래스의 멤버/지역변수도 선언가능
[접근제한자] const [데이터형/값형,스트링] 상수명 = 값;
읽기전용필드
클래스의 멤버로만 쓰임
[접근제한자] readonly [데이터형/값형,참조형] 필드명(=값/생략가능);
생성자에서 초기화 될 수 있다.
생성자(){필드명=값;}
코드영역 | 데이터영역 | 스택영역 | 힙영역 |
기계어 명령 | 정적데이터,Console.WriteLine | 지역변수(값형,참조형) | Car개체 Sound() |
오버라이딩
상속일 경우에만 사용
자식(파생) 클래스에서 부모(기본)클래스의 멤버를 재정의
오버라이딩의 방법 2가지
new 한정자 : 부모 클래스의 모든 멤버(상수/필드/속성/인덱서/메소드)를 재정의
override 한정자 : 부모 클래스의 abstract, virtual 메소드만 재정의
new 한정자
부모에서는 그냥 선언 public void [Method] {....}
자식에서 (new) public (new) void [Method] {....}
부모 변수 = new 부모();
변수.메소드();
자식 변수 = new 자식();
변수.메소드();
** 부모 변수 = new 자식(); //예외
변수.메소드();
virtual한정자와 override한정자
//virtual : 파생클래스가 재정의 하지 않을 경우, 기본클래스의 원래멤버가 호출되도록 함
//override : 한정자는 부모멤버가 virtual, override로 정의 된 경우 자식 멤버 정의시 사용
public virtual void [method] {....}
public override void [method] {....}
추상클래스
클래스의 종류(p116)
일반 클래스 : 상속, 개체생성, 실행(Main()이 있을경우)
추상 클래스 : 상속-파생클래스를 무조건 만들어서 사용
추상클래스는
구체적인 설계도가 아니라 파생 클래스가 가져야 될 멤버(필드/속성/인덱스/메소드)를 정의하는 클래스
추상클래스(개념적 부모)//실제내용이 없음
파생클래스(구체적인 자식)//실제내용이 있음
추상클래스 작성법
abstract class [클래스명] {....}
클래스명 변수 = new 생성();//이런식으로 생성할 수 없다.
//오로지 상속받아서만 사용
추상클래스의 멤버
상수/필드/인덱서/속성
생성자/소멸자
연산자 오버로딩
메소드
+ 추상메소드
추상 메소드(abstract method)
정의만 있고 실행내용이 없는 메소드
abstract 반환형 메소드명(매개변수 리스트); //{} <- 내용이 없다
추상메소드를 갖는 클래스는 추상클래스(abstract class ..)여야만 한다.
인터페이스(interface)
개념
나 - 리모콘 - 테레비
//리모콘을 통해서 테레비를 조정
//리모콘=사용설명서
//택배박스위의 송장
//개체의 사용방법을 설명한 것
개발자 - 설명서 - 컴파일된 클래스
M1,M2 M1{.....},M2{....}
-> //구현
인터페이스의 필요성
다양한 개체를 통일된 방법으로 사용하고자 할 경우 인터페이스를 사용
ex. 통합리모콘으로 TV,audio,VTR조종
인터페이스의 작성법
namespace [네임스페이스명]
{
(접근제한자) interface 설명서이름
{
속성/인덱서/메소드/이벤트
}
}
메소드 정의
public (접근제한자 불가) [변환형] [메소드명](매개변수리스트);
구현 클래스 작성법
(접근제한자) class [클래스명] : (부모클래스 or (인터페이스1,인터페이스2...))
{.....}//인터페이스에서 선언한것은 꼭 구현해야함
구현 클래스 사용법
구현클래스 변수 = new 구현 클래스 생성자();
//변수.M1();,변수.M2();,변수.M3();,변수.M4();
인터페이스1 변수 = new 구현클래스 생성자();
//변수.M1();,변수.M2();
인터페이스2 변수 = new 구현클래스 생성자();
//변수.M3();,변수.M4();
인터페이스의 상속
interface [인터페이스명] : [기본 인터페이스명 1],[기본 인터페이스명 2]...//인터페이스만 다중상속 가능
{
//M1,M2가 정의되어있으므로
M3();
M4();
}
구조체
설계도 클래스(참조형) - 개체(힙)
구조체(값형) - 개체(스택)
구조체의 작성법
namespace [네임스페이스명]
{
(접근지정자) struct [구조체명]
{
상수/필드..../메소드.../
}
}
주의사항
기본생성자는 명시적으로 작성불가(컴파일러가 무조건 만들기 때문에..)
인스턴스 필드가 있을 경우 필드 선언시 초기화를 할 수 없다.
private string name;
인스턴스 필드 개수만큼 매개변수를 갖는 생성자가 반드시 있다.
소멸자는 없다.
다른 구조체를 상속 못함(그러나 인터페이스는 구현 가능)
//다른 구조체 포함은 가능??
구조체를 써야하는 이유
없다. 다만 유리할 경우가 있을뿐이다.
메소드 내부에서 많은 객체를 생성하고 사용할 경우
이 객체를 구조체로 만들면 좋다.
-> 개체를 힙에 만들면 참조변수관리
-> 힙에 사용되지 않는 개체를 없애는 시간이 필요(쓰레기수집자)
하지 말아야할것
-> 구조체를 다른 변수에 할당하지마라
구조체 S1 = new 구조체();
구조체 S2 = S1; //Deep Copy가 이루어짐
//이런경우는 클래스를 이용해서 참조하는것이 더 빠름
메소드의 매개변수값?? 사용하지 마라.
구조체 S1 = new 구조체();
M1(S1);//통째로 복사되므로 지양해야함
값비교
< > == !=
문자열비교(스트링형은 참조형이지만 예외)
== !=
주소번지비교(참조형의 경우)
== !=
if (x>3 & y<10) => 거짓 & (?) => 거짓
if (x>3 && y<10) => 거짓 && (?) => 거짓 <= 더빠름
if (x>3 | y<10) => 참 | (?) => 참
if (x>3 || y<10) => 참 || (?) => 참 <= 더빠름
한개짜리는 비트연산도 가능하므로 나름 유용
|
Value Type
|
Int32
클래스명 | | | |
인터페이스명 | | | |
배열명 | | 변수 | = 개체 |
델리게이트명 | | | |
클래스명 | | |
object 변수 = 개체;
(클래스)(참조형변수)
string 변수 = 개체;
int32 변수 = 개체;
(구조체)
console.writeline의 비밀
int a=100;
console.writeline(a.tostring()); //100이 아니라 자동으로 "100"으로 찍음..
console.writeline(a.tostring()); //"100"
a는 개체
형변환
자동 형변환이 되는 경우
값형
(큰 사이즈 데이터형 = 작은 사이즈 데이터형) & (호환가능형)
참조형
부모 클래스형 = 자식 클래스형
수동 형변환
값형
작은 사이즈 데이타형 = (작은 데이터형) 큰 사이즈 데이터형
0 1 2 3
x x x O
로 취하므로 값 손실이 생길 수 있다.
int i = f (x)
int i = (int) f (O)
참조형
자식 설계도형 = (자식설계도) 부모 설계도형
자식설계도로부터 생성된 개체만??
A
/\
B C
B b = new B();
A a = b;
B c = (B)a;//(O) //C c = (C)a;//(X)
System.Int32 - 메소드 - parse(string)
public static int parse(string) //static이 있으면 개체생성없이도 사용가능
※static이 붙은 메소드 호출방법
클래스명|
구조체명|.메소드명(...)
int x = int32.parse("300");
= int.parse("300");
0+100=100
null+100=null
- 기능1 // <-[namespace]
~~.CS
~~.CS
- 기능2
~~.CS
~~.CS
using [namespace]; //기능을 불러옴
class hello
{
public static void Main()
{
Console.WriteLine("Hello, C# !"); //Console <-설계도명 // WriteLine <-메소드명
}
}
MSDN에서 설계도찾기
Console.WriteLine("{0,-3}+{1,-3}={2,-3}", 99, 1, 100); //기본
Console.WriteLine("{0,-3}+{1,-3}={2,-3}", 100, 100, 200); //3자리정렬
Console.WriteLine("{0,-3:f}+{1,-3:f}={2,-3:f}", 100, 100, 200); //3자리정렬//소수점2자리도 표현