반응형

16-1. 스트림의 분리

입출력 스트림의 분리 

입력을 위한 파일포인터와 출력을 위한 파일 포인터를 독립적으로 유지.

스트림을 분리하는 이유

프로그래밍을 단순하게 한다.

입출력 겸용 스트림의 경우 입출력 작업 전환시 버퍼를 비워야 한다.

일반적인 프로그래밍 방식.

주의할 사항

출력 스트림 종료시 EOF 전송이 된다.

문제점 : fclose함수를 통해 출력 스트림 뿐만 아니라 입력 스트림까지 완전 종료가 발생할 수 있다.

발생 상황 : 디스크립터가 하나고 그걸 통해 입출력(2개)용 FILE포인터를 만들 때 발생.


16-2. 파일 디스트립터의 복사와 스트림의 분리

파일 포인터(FILE*)를 이용한 소켓의 종료과정

fclose 함수의 호출은 파일 디스크립터의 종료로 이어지고, 이는 소켓의 완전종료를 의미한다.


※ 하나의 파일 디스크립터를 기반으로 입출력 파일 포인터 생성시 하나의 파일 포인터만 종료되어도 완전 종료된다.

※ 시스템 리소스(여기서는 소켓)는 가리키는 포인터(여기서는 파일 디스크립터)가 없을 때 종료된다.


하나의 파일 디스크립터를 기반으로 하나의 파일포인터만 생성

파일 디스크립터가 두 개일 경우에는 두 개의 파일 디스크립터가 종료되어야 완전 종료된다.


파일 디스크립터 복사

하나의 파일(혹은 소켓)에 접근할 수 있는 파일 디스크립터를 하나 더 만들어 내는 것.


#include<unistd.h>

int dup(int fildes);

int dup2(int fildes, int fildes2);

리턴 : 성공시 복사된 파일 디스크립터(번호), 실패시 -1

fildes : 복사하고자 원하는 파일 디스크립터

fildes2 : 복사되는 파일 디스크립터의 값을 명시적으로 지정하고 싶을 때 사용.


※ 쓰기 파일 디스크립터를 half close 함으로서 EOF가 전송됨.

fflush(sock);

shutdown(fileno(wstrm), SHUT_WR);    //  1차 종료, EOF 메세지 전송

fclose(wstrm);

반응형
반응형

15-1. 표준 입출력 함수의 장점

표준 입출력 함수의 장점

이식성이 좋아진다.

 - 모든 시스템은 ANSI 표준 C를 지원한다.

효율성을 높일 수 있다.

 - 표준 입출력 함수에 의한 버퍼를 제공받는다. (표준 입출력버퍼, 소켓 버퍼)

 - 소켓 생성 버퍼 목적 :  프로토콜의 완성을 위한 것.

 - 표준 입출력 버퍼 목적 : 성능 향상


파일 포인터와 파일 디스크립터

파일 포인터

 - 표준 입출력 함수 호출을 위해서 필요한 파일 포인터. = FILE 구조체의 포인터.

파일 디스크립터를 이용한 시스템 입출력

 - 시스템 입출력 함수 사용 시 필요

 - 정수값이다.

※ 소켓 기반의 표준 입출력 함수 사용을 위해 파일 디스크립터를 기반으로 파일 포인터를 생성.


15-2. 표준 입출력 함수의 사용

파일 디스크립터 -> 파일 포인터

#include<stdio.h>

FILE * fdopen(int files, const char *mode);

리턴 : 성공시 FILE 포인터, 실패시 NULL


fdopen 후 파일 디스크립터와 파일 포인터 상태


※ 표준 입출력 함수를 사용할 경우 : 파일 버퍼 -> 소켓 버퍼 -> 실제 전송 혹은 수신.


파일 포인터 -> 파일 디스크립터

#include<stdio.h>

int fileno(FILE *stream);

리턴 : 파일 포인터가 가리키는 파일의 디스크립터 리턴.

stream : 파일 포인터. 파일 디스크립터는 파일 모드와는 상관이 없다.


15-3. 소켓 기반의 표준 입출력 함수의 사용

파일에 버퍼가 필요한 이유

CPU가 직접 I/O를 하면 비효율적이기 때문에 버퍼에 그 내용을 저장했다가 파일로 전송한다.

flag를 두어 CPU가 여유 있을 때 system call을 통해 버퍼 내용을 파일로 보낸다.

system call을 이용하면 모아서 입출력 하는 것이 힘들다.

하지만 파일 버퍼를 이용하면 데이터를 모아서 입출력하는 데 좋아진다.

반응형
반응형

유선 : 고객에게 서비스를 제공. 멀티캐스트 방식(가입이 필요)

안테나 방송 : 서비스를 지정된 채널로 제공. 브로드캐스트 방식(가입 필요 없음)


14-1. 멀티캐스트(Multicast)

멀티캐스트 전송 방식.

UDP를 기반으로 하는 전송 방식. 

멀티캐스트 그룹(클래스 D에 속하는 IP주소)을 기반으로 멀티캐스트 패킷을 주고 받음.

하나의 멀티캐스트 패킷은 라우터를 통해서 다수의 호스트에 전송.

(한 번만 방송하면 가입자 모두 시청 가능.)

(정보를 단방향으로 제공할 때 주로 사용.)


라우팅(Routing)과 TTL(Time To Live)

라우팅 : 라우터에 의해서 패킷이 경로를 찾는 과정

TTL 

거쳐갈 수 있는 라우터의 수(홉)를 의미. 

이 값이 0이 되면 패킷은 더 이상 전달되지 못하고 소멸된다.


멀티캐스트 Sender와 Receiver

Sender : 멀티캐스트 그룹에 데이터를 전송하는 호스트

Receiver : 멀티캐스트 그룹으로부터 데이터를 수신하는 호스트

※ Sender는 서버(제공자), Receiver는 클라이언트로 구분 지을 수 있지만 요청하는 부분과는 관련이 적다.


멀티캐스트 Sender와 Receiver

 Sender Receiver 
 UDP 소켓 생성
 반드시 TTL 설정(소켓 옵션 설정)
 멀티캐스트 그룹으로 데이터 전송
UDP 소켓 생성
멀티캐스트 그룹 지정(ip_mreq)
멀티캐스트 그룹 가입(소켓 옵션 설정) 

Sender TTL 설정

state = setsockopt(send_sock, IPPROTO_IP, IP_MULTICAST_TTL, (void*)&multi_TTL, sizeof(multi_TTL));


Receiver 멀티캐스트 그룹 지정.

struct ip_mreq

{

    struct in_addr imr_multiaddr;    // 가입하고자 원하는 D 클래스 ip주소

    struct in_addr imr_interface;     // 나의 ip 주소. htonl(IN_ADDR);을 써주면 된다.

};

※ 서로 포트는 일치 해야 한다.


14-2. 브로드캐스트(Broadcast)

브로드캐스트 전송방식

UDP를 기반으로 하는 전송 방식(=멀티캐스트와 같다.)

일반적으로 UDP 패킷과의 차이점은 전송 목적지 ip주소 뿐이다.

(멀티캐스트와의 차이점)

동일 네트워크에 속하는 모든 호스트에 동시 전송

인터넷 상에서 지역 네트워크 내에서만 브로드캐스를 허용한다. (네트워크 부하를 고려)


주소선택에 따른 브로드캐스트 방식 구분

지정된 브로드캐스트

예 : 192.12.31.255 -> 자신이 속한 IP주소만 설정 가능. (지역적 브로드캐스트를 더 많이 사용.)


지역적 브로드캐스트 

예 : 255.255.255.255 -> 알아서 현재 네트워크(LAN)에 브로드캐스트.


반응형
반응형

13-1. recv & send 입출력 함수

read & write 함수와 달리 데이터 입출력 방법에 있어서 옵션 부여.

#include<sys/types.h>

#include<sys/socket.h>


int recv(int sock, void *buf, int len, unsigned int flags);

int send(int sock, const void * buf, int len, unsigned int flags);


옵션의 종류와 의미

 - MSG_DONTROUTE (send 함수 호출시에만 사용하는 옵션)

    데이터 전송 시 라우팅 테이블(라우터에 있음)을 참조하지 않음.

    => Local network 내에서만 패킷을 전송하겠다는 뜻.

 - MSG_DONTWAIT (send, recv 함수 모두에 사용하는 옵션)

    not blocking 입출력 기능

 - MSG_OOB (send, recv 함수 모두에 사용하는 옵션)

    데이터 전송 시, 긴급 데이터(Out-of-band data) 전송

    ※ Out-of-band : 도로 상의 갓길을 생각하면 좋음.

 - MSG_PEEK (recv 함수 호출시에만 사용하는 옵션)

    버퍼에 데이터 유무 확인.


긴급한 데이터의 전송

전송 프로그램 예시

write(sock, "123", 3);

send(sock, "4", 1, MSG_OOB);

write(sock, "567", 3);

send(sock, "890", 3, MSG_OOB);


수신 프로그램 예시

① fcntl(send_sock, F_SETOWN, getpid());

파일 디스크립터를 제어하는 함수.

send_sock : 소켓의 파일 디스크립터

F_SETOWN 소유자를 설정.

getpid(); : 현재 프로세스의 ID

※ 뜻 : send_sock의 소유자를 현재 프로세스로 설정한다.
※ 사용 이유 : 어느 프로세스에게 시그널을 발생시킬지 정해야 한다. SIGURG를 받기 위해 반드시 소켓의 소유자를 지정해야 한다. 


② state = sigaction(SIGURG, &act, 0);

SIGURG : 긴급 데이터(out-of-band)를 받을 때 발생하는 시그널.


긴급 데이터 전송 시 생성되는 패킷

recv함수를 호출할 때 urgent point-1 위치부터 1바이트만 읽어들인다.

긴급 데이터 전송의 특징

- 버퍼 상황에 관계 없이 데이터 전송 ( 버퍼가 비어지길 기다리지 않고 바로 전송)

- Nagle 알고리즘 무시


입력버퍼 검사하기

sleep 함수 사용 이유 : 패킷을 온전히 다 받기 위해 사용.

MSG_PEEK : 메세지를 읽어도 소켓의 수신 버퍼에 데이터 내용을 지우지 않는다.

MSG_DONTWAIT : 버퍼가 비어 있지 않아도 바로 리턴 받기 위해서...

※ 두 개의 옵션을 같이 사용한다.


13-2. readv & writev 입출력 함수

데이터를 모아서 전송(writev) : 한 번 호출하여 한 번에 보낸다.

#include<sys/io.h>

int writev(int fd, const struct iovec *vector, int count);

리턴 : 성공시 전송한 바이트 수, 실패시 -1

데이터 여러 개(count개)를 모아서 전송한다.

fd : 데이터 전송의 목적지를 나타내는 소켓의 파일 디스크립터

vector : iovec 구조체 이름을 인자로 전달. 전송하고자 하는 데이터에 대한 정보가 담겨진다. 

count : iovec 구조체 변수의 개수.


데이터를 분산 수신(readv) : 한번 호출하여 나누어진 버퍼에 저장한다.

#include<sys/io.h>

int readv(int fd, const struct iovec *vector, int count);

리턴 : 성공시 수신한 바이트 수, 실패시 -1

fd : 데이터를 수신할 파일 디스크립터

vector : iovec 구조체 이름을 인자로 전달. 어디에 얼마칸큼 데이터를 수신할 것인지 정보를 전달.

count : iovec 구조체 변수의 개수.


배열을 정의하기 위한 구조체의 선언

struct iovec{

    ptr_t iov_base;    // 보내고자 하는 데이터의 시작주소

    size_t iov_len;    // 보내고자 하는 데이터의 크기

};


readv&writev 함수의 적절한 사용

1. 함수호출 회수가 적으면 효율적임.

2. nagle알고리즘을 적용하지 않는 경우 다음과 같은 장점을 가진다.

일반 write 3번 호출 : 3개의 패킷을 생성하여 전송

nagle알고리즘을 적용한 경우

writev 호출 : 1개의 패킷을 생성하여 전송.

3. 큰 배열을 생성하여 하드코딩해서 보내는 것보다 한번의 함수로 모아서 보내는 게 편리하다.


13-3. 윈도우즈 기반으로 구현하기

윈도우즈 기반 OOB 데이터 송수신

1. 윈도우즈 기반에서는 'signal 핸들링' 이라는 개념이 존재하지 않는다.

2. select 함수는 소켓을 통해서 예외 상황(OOB 데이터 수신)이 발생하였는지 확인 가능하다.

예시)

FD_ZERO(&except);

FD_SET(hSendSock,&except);

exceptCopy = except;

select(?, ?, ?, &exceptCopy, ?);


반응형
반응형

12-1. I/O 멀티플렉싱 기반의 서버

하나의 전송로를 여러 사용자가 동시에 사용해서 효율성을 극대화 하는 것. 전송로를 공유.

전송로를 공유하기 위해서는 서로 약속이 필요하다.

TDMA : 자료 전송 시간을 일정한 시간 폭으로 나누어서 함께 공유하는 방식

FDMA : 주파수 대역 폭을 나누어서 함께 공유하는 방식


I/O 멀티플렉싱

클라이언트와의 입/출력을 담당하는 프로세스를 하나로 묶어버리는 것.

프로세스 = 고속의 전송로.


multitasking(멀티태스킹) 예시


multiplexing(멀티플렉싱) 예시

※ 데이터 입출력 및 접속 모두를 하나로 묶어서 처리한다.

※ 멀티플렉싱 서버가 멀티태스킹 서버보다 성능이 좋다. -> context switching이 없음.


멀티 프로세스 vs 멀티 플렉싱

멀티 프로세스

클라이언트와 서버간의 송수신 데이터 용량이 큰 경우.

송수신이 연속적으로 발생하는 경우에 적합.

멀티 플렉싱

클라이언트와 서버간의 송수신 데이터 용량이 작은 경우.

송수신이 연속적이지 않은 경우에 적합. (예: 채팅)

멀티 프로세스 기반의 서버에 비해 많은 수의 클라이언트 처리에 접함.


12-2. Select 함수 사용하기

파일 디스크립터의 설정

지정된 파일 디스크립터의 변화를 확인한다.

파일 디스크립터 변화 : 파일 디스크립터를 통해 데이터 송수신이 가능한 상태

예시)


1. 파일 디스크립터 설정

관찰하고자 하는 파일 디스크립터를 모아놓는다. (총 3묶음)

2. 파일 디스크립터의 변화(3가지 종류 존재)

입력 버퍼의 변화 : 수신할 데이터가 존재하는가? (입력 버퍼에 데이터 존재)

출력 버퍼의 변화 : 데이터 전송이 가능한 상태인가? (출력 버퍼에 충분한 여유공간 존재)

예외(OOB)상황 관련 버퍼의 변화 : 소켓에서 예외상황이 발생 하였는가?

3. fd_set 자료형

파일 디스크립터를 구분 지어 모아두기 위한 자료형(비트단위 배열)


파일 디스크립터 검사 범위 설정
매크로 함수

FD_ISSET(int fd, fd_set *fdset);
fdset에서 해당 fd(번호)의 비트가 1인지 확인한다. 1이면 TRUE, 0이면 FALSE.

검사해야 할 파일 디스크립터의 개수(범위)를 지정해 준다.

(select 마지막에 리턴된 디스크립터 값에) 가장 큰 파일 디스크립터 값에 1을 더해서 인자를 전달.


Timeout(타임아웃) 설정

Timeout : 정해 놓은 시간이 지나면 (select)함수가 리턴하게 한다.
struct timeval
{
    long tv_sec;    // 초단위
    long tv_usec;  // 마이크로초단위 1/10^6
};

select함수
#include<sys/time.h>
#include<sys/types.h>
#include<unistd.h>

int select(int n, fd_set * readfds, fd_set *writefds, fd_set * exceptfds,struct timeval * timeout);
리턴 : 오류 발생이면 -1, 타임아웃이면 0, 변화가 발생하면 0이 상에 상태가 바뀐 파일 디스크립터 수.
n : 파일 디스크립터 개수(범위) 지정.
readfds : 입력버퍼(수신)할 데이터가 있는지 검사.
writefds : 출력버퍼가 충분히 여유가 있는지 검사.
exceptfds : OOB에 대한 검사. ※ 추후설명
timeout : 타임아웃 설정관련 인수.


select함수를 호출하기 전에는 fd_set에 검사하기 원하는 index의 비트를 1로 세팅해 놓는다.
예시) FD_SET(0, &read_s);    // standard input에 대한 디스크립터를 1로 세팅.
select함수가 리턴이 되면 fd_set에 검사한 결과에 대한 index의 비트만이 1로 세팅되어 있을 것이다.
※ select함수 호출 전과 호출 후에 값이 바뀌기 때문에 select함수를 호출할 때마다 초기화할 수 있도록 원본 fd_set을 복사하여 사용한다.
※ timeout도 select함수 호출 전과 호출 후에 값이 바뀌기 때문에 루프 시작할 때 값을 새로 초기화 주는 것이 좋다.

12-3. 멀티플렉싱 서버의 구현
FD_SET(serv_sock, &reads);
※ 서버소켓으로 오는 입력버퍼(데이터)의 내용이 중요하다. 그 내용은 클라이언트로부터 들어오는 연결요청(일종의 데이터이기 때문)이다.
fd_max : 검사할 디스크립터 개수(범위)를 저장하기 위한 값. 0~fd_max+1의 범위로 설정한다.

12-4. 윈도우즈 기반으로 구현하기
select 함수와 timeval 구조체는 선언된 형태와 기능이 리눅스와 같다.
int select(int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout);

※ fd_set 자료형은 기능이 리눅스와 같지만 선언형태는 다르다.
typedef struct fd_set{
    u_int fd_count;                                 // 얼마나 많이 설정되어 있는가?
    SOCKET fd_array[FD_SETSIZE];      // SOCKET의 배열
}fd_set;
※ 소켓의 핸들 값이 일정하지 않고 윈도우즈에는 리턴된 핸들 값을 기억하는 것이 편하다.
그러므로 소켓 핸들의 개수를 fd_set 내부적으로 보관하고 있다.


※ 다음 매크로는 리눅스와 사용 방법은 거의 같다.
FD_CLR(s, *set)
:set 포인터가 가리키는 배열에서 핸들 s를 삭제한다.
FD_ISSET(s, *set)
:핸들 s가 set포인터가 가리키는 배열의 멤버라면 TRUE를 아니면 FALSE를 리턴한다.
FD_SET(s, *set)
:핸들 s를 set포인터가 가리키는 배열의 멤버에 포함시킨다.
FD_ZERO(*set)
:set 포인터가 가리키는 배열을 0으로 초기화한다. 

select(0, &temps, 0, 0, &timeout)
※ 윈도우즈 기반에서는 nfds인수가 필요없다.

반응형
반응형

원본 참고주소 : http://en.wikipedia.org/w/index.php?title=Planet&oldid=77980546

지식iN에 작성했던 내용 : http://kin.naver.com/open100/db_detail.php?d1id=11&dir_id=110206&eid=66zRuRDk4GdUYWGVdAflaXILPeV+b2C5&l_url=




행성의 정의

국제천문연맹(IAU)은 천체로써 태양계에만 해당하는 행성에 대해 공식적이고 과학적인 명명법을 다음과 같이 정의하였다.

 

1. 태양을 공전한다.

2. 충분한 질량을 가져 자체 중력으로 유체역학적 평형을 이루는 한편 타원형이 아닌 구형(球形)을 유지~ (구형을 유지할만한 질량을 가져야 한다는 뜻입니다~)

3. 주변 궤도의 다른 천체들을 깨끗이 흡수할 수 있는 천체(공전 구역 내에서 지배적인 역할을 하는 천제)

 

우리 태양계는 이 정의에 의해 8개의 행성이 고려되었다. : 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성

 

왜행성(행성의 형태가 아님)은 천체로서 다음과 같이 정의하였다

 

1. 태양을 공전한다.

2. 충분한 질량을 가져 자체 중력으로 유체역학적 평형을 이루는 한편 타원형이 아닌 구형(球形)을 유지~ (구형을 유지할만한 질량을 가져야 한다는 뜻입니다~)

3. 주변 궤도의 다른 천체들을 깨끗이 흡수할 수 있는 천체가 아니다.

4. 위성이 아니다.

 

기준에 맞는 다른 천체들이 있을지라도 (우선은) 태양계에서 3개의 천체는 왜행성으로 인식된다 : 세레스, 명왕성, 에리스(제나)

 

이 정의는 다른 항성을 공전하는 천체에는 적용되지 않는다. 외부 태양계에 대한 국제천문연맹 working group은 다음과 같이 정의하고 있다.

 

1. 별을 공전하는 중수소 핵융합을 위한 최소한의 질량 미만의 질량을 가지는 천체이다. 행성이 되기 위해 외부태양계를 위해 요구되는 최소 질량/크기는 우리 태양계에서 사용되는 것과 같다.

2. 중수소 핵융합을 위한 최소한의 질량 이상의 질량을 가지는 천체는 갈색왜성이다. 어디에 있고 어떻게 형성되었는지 신경쓰지 않는다.

3. 중수소 핵융합을 위한 최소한의 질량 이하의 질량을 가지는 젋은 별 클러스터에서 자유롭게 떠다니는 천체는 행성이 아니다. 그들은 부갈색왜성이다.

 

다른 별에서 발견된 행성은 200개가 넘는다.

 

2006년 결정의 채택이 있기 전까지 행성의 과학적인 정의는 없었다. 정의가 없더라도 행성의 수는 바뀌어 왔다. (다양하게 보여져 왔다.)

 

천문학이 발전하고 지동설이 받아들여지면서 태양과 달이 (행성에서) 제외되었고 현재처럼 행성의 구성원이 추가되었다. 행성이 태양을 공전하는 큰 천체라고 생각될 지라도 행성의 정의에 대한 과학적으로 구체화되지 않았다. 과학적인 합의와 문화에 의해 수천년동안 받아들인 행성의 숫자는 다양했다.

 

1500년대 이전까지 - (7개)달, 수성, 금성, 태양, 화성, 목성, 토성 - 천동설

1550년 - (6개) 수성, 금성, 지구, 화성, 목성, 토성 - 지동설

1781년 - (7개) 수성, 금성, 지구, 화성, 목성, 토성, 천왕성

1807년 - (11개) 수성, 금성, 지구, 화성, 케레스, 팔라스, 주노, 베스타, 목성, 토성, 천왕성

1845년 - (12개) 아스트라이아 추가

1846년 - (13개) 해왕성 추가

1851년 - (8개) 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성(소행성대 제외)

1930년 - (9개) 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성, 명왕성

2006년 - (8개) 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성

반응형

'번역' 카테고리의 다른 글

MEMORY Storage Engine  (0) 2016.11.04
테스트 주도 개발  (0) 2016.01.22
Computer virus  (0) 2009.10.07
악성코드  (0) 2009.10.07
BHO  (0) 2009.10.07
반응형

Main() 메소드 : 응용 프로그램의 진입점.

※ Main()진입점이 여러개면 /main 플래그를 사용하거나 속성->시작 개체를 설정해야 한다.

static : 클래스의 범위에 있으므로 바로 호출할 수 있는 메소드

Console.WriteLine() : 텍스트 문자열을 표준 콘솔에 찍는다.


Main()의 3가지 signature

public static void Main(string[] args);

public static void Main();

public static int Main(string[] args);


System.Array의 Length 속성을 이용하면 배열의 개수를 셀수 있다.

foreach(string s in args)

와 같은 for문도 사용할 수 있다.


※ C#은 garbage collection이 가능하기 때문에 delete 키워드를 지원하지 않는다.


클래스 멤버 변수에는 자동으로 기본 값이 할당된다.

지역 변수에는 '출력' 매개변수로 기능하는 지역변수를 제외하고 초기 값을 할당해야 한다.


Console.Write() : Carriage Return 없는 텍스트 문자열을 표준 콘솔에 출력

Console.ReadLine() : Carriage Return 전까지 쌓인 입력 스트림으로 부터 정보를 얻음.

Console.Read() : 하나의 문자를 읽어옴.


포멧 지정자(placeholder) : {0}, {1}, {2}

WriteLine()은 객체 배열을 포맷 지정자로 지정할 수 있도록 오버로드 되어 있어 개수 제한 없이 항목 추가가 된다.


문자열 포멧 지정 플래그

{0:C} 같은 형식으로 사용

C : 통화(Currency) 포멧. local culture 기호를 앞에 붙인다. (\같은)

D : 10진수(Decimal) 포멧

E : 지수(Exponent) 표현

F : 고정 소수점(Float) 포멧

G : 일반(General), 고정 소수점 혹은 지수 포멧에 사용한다.

N : 기본 숫자 포멧

X : 16진수 포멧 지정.


값 형식과 참조 형식

값 형식 : 간단한 데이터 형식, 구조체

참조 형식 : 클래스

참조 형식에 대해 깊은 복사를 하기 위해서는 IClonable 인터페이스 구현 필요.

 질문 값 형식   참조 형식
 할당되는 곳 스택   관리힙
변수는 어떻게 나타내는가   local 복사본 할당 인스턴스에 의해 점유된 메모리 
 기본 형식  System.Value에서 파생 sealed 형식이 아니면 모든 형식으로부터 파생 가능. 
 다른 형식의 기본 형식이 될 수 있는가? 없다. 값 형식은 항상 sealed되어 있어 확장 불가  sealed되지 않았으면 다른 형식의 기본형식 가능 
 매개변수 전달 방식? 값으로 전달  참조로 전달 
 Object.Finalize()재정의 불가능  간접적으로 가능. 
 생성자 정의 가능. 기본생성자는 예약됨.  가능 
 소멸시기 scope를 벗어날 때  garbage collect될 때 


System.Object

Equals() : 메모리 상에 동일한 항목을 가리키면 true. 

(재정의)일반적으로 비교되는 객체들의 내부 상태 값이 동일한 경우 true를 리턴.

GetHashCode() : 특정 개체 인스턴스를 식별할 수 있는 정수 반환

GetType() : 현재 참조형식을 자세하게 설명하는 객체 바환

ToString() : "namespace.classname' 형태의 문자열 반환

Finalize() : 객체가 힙으로부터 제거될 때 런타임에 의해 호출되는 메소드

MemberwiseClone : 멤버대 멤버로 복사된 새로운 객체 반환(얕은 복사)


System.Object 정적 멤버

object.Equals(), object.ReferenceEquals()


모든 C# 데이터 형식은 System namespace에 정의되어 있다. (밑은 별칭)

sbyte, byte, short, ushort, int, uint, long(64bit), ulong, char, float, double, bool(true,false), decimal(10^0~10^28), string(유니코드 문자집합), object


※ StringBuilder : 자바의 StringBuffer와 비슷한듯.


boxing과 unboxing

boxing : 명시적으로 값 형식을 이에 상응하는 참조 형식으로 변환하는 과정 <=> unboxing

※ unboxing시 데이터 형식이 box된 형식과 일치하는 지 검사하고 일치하면 복사가 진행됨. (InvalidCastException 발생 가능)

※ C# 클래스는 필요할 때 boxing, unboxing을 수행한다.


const : 자바의 static final 과 비슷한 의미. 값이 컴파일 시간에 계산된다. 고정되고 변경할 수 없는 값.


foreach (변수타입 변수명 in 배열)

배열 반복 처리 뿐만 아니라 시스템 컬렉션이나 사용자 지정 컬렉션도 반복 처리 가능.


C# 흐름 제어 구조

자바처럼 Boolean 표현식에만 반응한다.


메소드 접근 한정자

public

private

protected

internal : 해당 어셈블리 내에 있는 모든 형식에서 접근 가능하게 정의

protected internal : 메소드 접근이 현제 어셈블리나 파생된 형식으로 제한한다.


메소드 매개변수 한정자

COM의 attribute와 비슷

(없음) : in attribute와 비슷

out : 출력 매개변수는 호출된 맴버에 의해 할당된다.

ref : [in,out] attribute와 유사. 값은 호출자에 의해 할당. 메소드는 호출 범위 안에서 재할당 가능.

params : 여러 개의 매개변수를 한 매개변수처럼 보낼 수 있다.


out 매개변수 예시

※ 초기화 될 필요가 없다.

public static void add(int x,int y, out in ans)

{

    ans = x+y;

}


int ans;

Add(90,90, out ans);

Console.WriteLine("90 + 90 = {0}", ans);


ref 매개변수

※ 반드시 초기화 되어야 한다.


참조형식을 값, 참조 형식으로 전달하기

참조형식 -> 값으로 전달 : 객체 상태 데이터는 변경 가능. 다른 객체를 참조하도록 변경되지 않음.

참조형식 -> 참조로 전달 : 상태데이터, 다른 객체를 참조하도록 변경됨.


배열

크기가 고정된 배열을 생성할 때 new 필요.

배열에 데이터를 넣으려면 index연산자 이용. (bookOnPl[0] = "haha"; )

중괄호 사용 가능.

 - int[] ages = {20,22,23,0}

 - string firstnames = new string[5]{"Steve", "Gina", "Swallow",'Baldy","Gunner"};


System.Array 기본클래스

162P 참조


문자열 조작하기 

164p참조

+ = Concat() 동일하다.

C#에서도 escape 문자 (\t, \\, \n, ...) 사용 가능.

@를 통해 적힌 문자열 그대로 출력 가능.


StringBuilder

MFC의 CString이나 COM의 CComBSTR과 유사.

Append메소드.


열거형

0부터 시작, 혹은 프로그래머 마음대로 다른 번호 부여 가능.

암시적으로 System.Enum에서 파생.


네임스페이스 별칭 사용하기

using The3DHexagon = My3DShapes.Hexagon;

using 별칭 = 원래네임스페이스.클래스;

반응형

'C#' 카테고리의 다른 글

Nullable Type  (0) 2009.09.07
Generic  (0) 2009.09.07
Partial Class  (0) 2009.08.29
C# 2장 간단 정리  (0) 2009.07.30
C# 1장 간단 정리  (0) 2009.07.30
반응형

csc 컴파일러

/t(artget):exe (디폴드) : 파일 출력을 어떻게 할건지 결정. exe, library, module, winexe

/out (생성될 출력 파일 이름)

/r(eference):?.dll;?.dll... : 참조된 네임스페이스가 어떤 어셈블리에 포함되었는 지 알려준다.

/bugreport:bugs.txt : 빌드와 관련한 다양한 자료와 컴파일 과정 에러 정보를 얻을 수 있다.

57페이지에 기타 옵션 참고


지시파일(response 파일)

컴파일 시 사용하는 모든 명령어를 적어놓을 수 있는 파일(*.rsp)

csc @?.rsp

같은 옵션이 있을 때 뒤에 옵션으로 재정의된다.

기본 지시파일 : csc.rsp


명령중 디버거(cordbg.exe)

소스를 보기 위해서는 컴파일 할 때 /debug 옵션이 필요하다.

※ Visual Basic 6.0 응용 프로그램을 만드는 것은 VS .NET에서 할 수 없다.


C# 프로젝트 형식

윈도우즈 응용프로그램, 클래스 라이브러리(dll), 윈도우즈 컨트롤 라이브러리(windows forms, activeX와 비슷)

ASP .NET 웹 응용 프로그램, ASP .NET 웹 서비스, 웹 컨트롤 라이브러리, 콘솔 응용 프로그램, 윈도우즈 서비스


VS .NET의 주요 기능

서버 탐색기 창 : 보기-> 서버 탐색기

로컬 또는 원격 데이터 베이스에 붙어 작업 가능.

메세지 대기열, 머신에 대한 일반 정보 볼 수 있음.


개체 브라우저

보기 -> 개체 브라우저

네임 스페이스, 형식, 해당 솔루션이 참조하고 있는 각 어셈블리의 형식 멤버를 볼 수 있다.


C# 전처리기 

#define, #undef : 조건부 컴파일 기호를 정의하거나 해제하는 데 사용

#if, #elif, #else, #endif : 소스 일부를 조건적으로 건너뛰는데 이용

#line : 에러와 경고의 줄 번호를 제어

#error, #warning : 해당 빌드에 대한 에러와 경고 생성

#region, #endregion : 소스 코드 일부를 명시적으로 표시하는 데 이용(확대 및 축소)

디버그 모드에서만 컴파일 되는 예시

#define DEBUG // 가장 처음에 작성.

...

#if (DEBUG)

#warning 경고! Debug가 정의되어 있음. 릴리즈 빌드로 구성하시오.

...

#endif


#line 3000

// 3000번으로 line이 바뀜.


System.Environment 클래스

다양한 정적 멤버를 통해 운영체제 context 관련 여러 세부사항을 알 수 있다.


반응형

'C#' 카테고리의 다른 글

Nullable Type  (0) 2009.09.07
Generic  (0) 2009.09.07
Partial Class  (0) 2009.08.29
C# 3장 간단 정리  (0) 2009.07.30
C# 1장 간단 정리  (0) 2009.07.30
반응형

.NET 구성요소

CLR

공용 언어 런타임

자동 메모리 관리, 언어 통합, 형식 안전성 보장

mscoree.dll 또는 common object runtime execution engine



CTS

공용형식 시스템

런타임에 지원되는 프로그래밍 구조, 데이터 형식

상호작용 -> 어떻게 메타 데이터에 나타나는지.

CLS

공통 언어 사양

언어가 호응할 수 있는 프로그래밍 구조와 공용 형식들을 정의

모든 언어에 의해 동일한 방식으로 접근될 수 있는 코드 생성을 위한 지침서.

※ 규칙 1 : 형식이 정의된 어셈블리 외부로 '노출된' 부분에만 적용.



C#이 가져온 것

포인터 없음.

자동 메모리 관리

열거, 구조체, 클래스 속성도 공식 문법 구조

사용자 지정 연산자 오버로딩 가능.

인터페이스 기반 프로그래밍 기술 완벽 지원

어트리뷰트를 이용한 aspect 기반 프로그래밍 기법 지원


.NET 바이너리

IL + 메타데이터(항상 존재, 컴파일러에 의해 자동 생성)로 구성

IL : 플랫폼에 무관한 중립 명령어

자바의 바이트 코드와 유사

 *. COM 형식 정보의 문제점 

   - 존재가 보장 안됨.

   - IDL 코드가 포함된 Coclass의 올바른 동작을 위해 필요한 외부 참조 서버의 목록을 만들 방법이 없음.

   - IDL이 내부의 형식들을 정확히 반영하는 지 프로그래머가 직접 일일히 확인해야 한다.

manifest 

어셈블리 현재 버젼 정보

리소스를 지역화하는 데 사용되는 culture 정보

모든 외부 참조 어셈블리 목록


단일 파일 어셈블리

CIL 메타데이터 manifest가 모두 한 파일에

다중 파일 어셈블리

여러개의 닷넷 바이너리로 구성.

주 모듈에는 manifest가 있어야 한다.


※ signature : 메소드의 식별 가능한 특성을 나타내기 위한 일련의 모든 정보

 - 메소드 이름, 반환 형식, 인수 개수, 데이터 형식, (호출 규칙)


.NET 형식 메타데이터의 역할

binary 안에 정의된 모든 형식(클래스, 구조체, 열거형 등)

형식의 멤버들(속성, 메소드, 이벤트 등)에 대한 설명

.NET manifest : 외부 참조 어셈블리에 대한 설명

자가 기술적(self-descriptive)인 어셈블리


JIT : CIL을 의미있는 CPU 명령어로 컴파일 하는 것

jitter라고도 불린다. (대상 OS에 맞는 방식으로 메모리에 캐싱)


sealed class?

인터페이스 : 추상 멤버 정의를 모아 놓은 것.

열거형 : 사용자 지정 열거형도 가능 { 위저드 5 100, ... }

delegate : C스타일의 함수포인터와 비슷

형식멤버 : 생성자, 중첩형식, 연산자, 메소드, 속성, 필드, 상수, 이벤트 등


※ widget : 응용 프로그램과 상호 작용하는 데 이용되는 GUI 요소, 아이콘, 버튼, 체크박스, 스크롤바, 창, 토글 단추, 폼 등


ildasm.exe : IL 어셈블러. mscorlib.dll

※ ctor : 생성자

파일 / 트리뷰 덤프 : 텍스트 파일로 .NET 어셈블리를 볼 수 있음.


wincv.exe

클래스 뷰어


.NET 런타임 배포하기

http://www.microsoft.com에서 Dotnetfx 다운로드 가능


다른 운영체제에서 .NET 실행

http://www.microsoft.com : Shared Source Common Language Infrastructure

http://msdn.microsoft.com/net/ecma

http://www.go-mono.com


반응형

'C#' 카테고리의 다른 글

Nullable Type  (0) 2009.09.07
Generic  (0) 2009.09.07
Partial Class  (0) 2009.08.29
C# 3장 간단 정리  (0) 2009.07.30
C# 2장 간단 정리  (0) 2009.07.30
반응형

1. WPF개요

Windows Presentation Foundation

MS의 UI, 미디어 및 문서가 통합된 프로그래밍 모델(닷넷 3.0에 소개)

브라우저와 데스크톱에서 동시에 실행될 수 있는 프로그래밍 모델 제공.

Markup(XAML)과 코드 프로그래밍을 동시에 지원한다.

디자인이 가능한 프로그램 모델을 개발하였다. (Blend 프로그램으로 가능)

WPF는 DirectX를 Application UI에 통합했다.


2. WPF Architecture

 PresentationFramework

 PresentationCore

 Common Language Runtime

 

milcore 

 User32

DirectX 

 Kernel


PresentationFramework, PresentationCore : 순수한 관리코드로만 구성. 서로 분리되어 있음.

PresentationCore : API형태의 라이브러리, 컴포넌트 형태

milcore : DirectX와 효율적인 통신을 위해 비관리 코드로 제작된 부분. 개발자가 접근하기 힘듬.


WPF관련 어셈블리

WindowsBase.dll : WPF를 위한 기본 서비스 제공.

  DispatcherObject 

    Dispatcher : 복수의 작업을 대기시킬 수 있는 큐.

    namespace : System.Windows.Threading

    ※ STA : 실행 context에 하나의 쓰레드만 존재.

    Frame Queueing 가능 : Invoke(), BeginInvoke()

  DependencyObject

    WPF의 속성 시스템의 지원을 받기 위해 필요.

    프레임 수준의 바인딩 종속성, 손쉬운 데이터 공유 등을 객체 인스턴스에 저장하지 않고 가능.

    데이터 구조 중심 프로그래밍(XAML에서 이벤트와 액션까지 모델화하고 선언적으로 처리)


PresentationCore.dll

  Visual

    랜더링을 담당하는 객체. 컨트롤 클래스의 시작점. micore 컴포넌트와 밀접한 관련.

    WPF는 멀리 있는 객체를 먼저 그리고 가까이 있는 객체를 나중에 그린다.

    주요 기능 : 출력 표시. 변환, 클리핑, 적중 테스트, 경계 상자 계산.

    입출력, 이벤트 레이아웃 X

  UIElement

    Layout, 입력 및 이벤트 등의 핵심 기능을 담당.

    Measure : 크기를 정의, Arrange : 위치와 정렬. (2단계 레이아웃)

    입력과 Command의 분리 가능. -> CommandBinding으로 관리 가능.


PresentationFramework.dll

  FrameworkElement

    WPF 프레임워크 수준 요소 클래스와 UIElement 서비스를 연결해 주는 지점.

    레이아웃 시스템 정의 : 핵심 기능 손상 없이 새로운 레이아웃을 정의 가능.

    논리적 트리 : markup을 이용해 구조를 표현할 때 이용.

    객체 수명 이벤트 : Initialized, Loaded, Unloaded 세가지 지원.

    데이터 바인딩 및 동적 리소스 참조 지원 : Expression으로 바인딩 -> Framework는 해석.

    스타일 : 컨트롤의 외관을 변형하기 위해 사용.

    에니메이션 지원 

  Control

    탬플릿 지원 기능 : UI를 편리하게 수정 가능. 속성, 이벤트, Command, Template 기능 지원.

    XAML을 통한 탬플릿 정의 -> 랜더링 시 스트립트를 읽어 들여 반영

  

※ WPF 클래스 다이어그램 예시


반응형

+ Recent posts