head에다가 집어 넣어줍시다.
<script language=javascript> <!-- toggle=0; function dblclick() { if (toggle==0) { var sc=99999; toggle=1; } else { var sc=0; toggle=0; } window.scrollTo(0,sc); } if (document.layers) { document.captureEvents(Event.ONDBLCLICK); } document.ondblclick=dblclick; var IE = document.all?true:false; if (!IE) document.captureEvents(Event.MOUSEMOVE) document.onmousemove = getMouseXY; var tempX = 0; var tempY = 0; function getMouseXY(e) { if (IE) { // grab the x-y pos.s if browser is IE tempX = event.clientX + document.body.scrollLeft; tempY = event.clientY + document.body.scrollTop; } else { // grab the x-y pos.s if browser is NS tempX = e.pageX; tempY = e.pageY; } if (tempX < 0){tempX = 0;} if (tempY < 0){tempY = 0;} return true; } // --> </script> |
'잡다한것들전부 > 기타' 카테고리의 다른 글
| [펌]컴퓨터 게임 제작 : 길찾기 알고리즘 구현 (0) | 2014.01.13 |
|---|---|
| [펌]왕초보 게임 만들기 - 길찾기 알고리즘 A*(A star, A스타) (0) | 2014.01.13 |
| [블로그] 더블 클릭시 맨 하단으로 이동하는 코드입니다. (0) | 2014.01.13 |
| [펌][블로그] 글자 클릭시 해당 지점으로 이동하는 방법 (0) | 2014.01.13 |
| [잡담] 어둠속을 헤매는 초보분들을 위해 ~ (0) | 2014.01.12 |
| [블로그] 블로그에 코딩 색 입히는 방법. (0) | 2014.01.10 |
동기화란 말이 다방면에서 사용하고 있어서 개념을 잡기가 좀 어렵습니다.
비동기식이니 동기식이라는 말도 있고요.
동기화를 이해할려면 클라이언트와 서버라는 개념을 먼저 이해해야 합니다.
클라이언트에서 작업을 요청하면 서버에서 응답하는 형식이죠.
그런데 이 응답하는 방식에 따라 동기식이니 비동기식이라고 합니다.
여기서 동기식은 클라이언트의 요청이 있어야만 서버가 응답을 보내고
서버의 응답을 기다리다가 응답이 와야만 그에 따라 클라이언트가 반응하는 방식으로 서버와 클라이언트의 작업을 하나로 일치시키는 방식입니다.
요청과 응답,응답과 작업, 다시 요청과 반응 이라는 식이죠.
폴더의 자료를 최신으로 유지하는 것도 클라이언트에서 자료갱신을 요청하면 서버에서 응답해서 최신자료를 보내주고 클라이언트 받아서 갱신하는 것입니다.(하나의 작업으로 일치시켜서 작동하는 동기식입니다.)
일반화하면 어떤 작업을 하기 위해 두 개의 별개의 장치간에 시간적으로 동시에 하나의 연결을 만드는 것입니다.
그렇게하면 두 개의 장치 안의 자료가 시간적으로 일치하게 됩니다.
이런 방식은 시간적으로 데이타가 서로 일치해야 하는 경우에 꼭 필요한 방식입니다.
예를 들어 은행계좌 입출금시 동기화식으로 데이타가 처리됩니다.
만약 비동기식으로 처리된다면 CD기에서 출금을 했는데 은행의 중앙컴퓨터에서는 처리가 안 되어 있게 되는 자료의 불일치성이 나타나게 됩니다.
출처: http://www.open21.kr/bbs/board.php?bo_table=terminology&wr_id=51&page=1
동기화는 시간에 딱딱 맞춰서 무슨 일을 진행시키는 것을 말합니다.
대한민국 군인들은 모두 아침 6시에 일어나서 8시에 일을 하고 11시쯤에 밥을 먹고 5시 30분부터 휴식을 취한 후 밤 10시에 취침에 들죠. 이런게 바로 동기화의 예입니다. 기준(보통은 시간입니다.)에 맞춰서 동작이 딱딱 이루어지죠.
네트워크에서 송신측과 수신측이 동기화되어있다고 말하는데, 한마디로 어떤 시간에 누가 데이터를 보내는지 모두 알고 있다는 뜻입니다. 맨처음 1분은 A가 데이터를 보내고 그다음 1분은 B가 데이터를 보내고 그다음 1분은 C가 데이터를 보낸다는 걸 송신측과 수신측 모두 알고 있기때문에 누가 데이터를 보내고 있는지에 대한 혼란이 없죠.
전산쪽에서는 TDM 이라는 방식이 있거든요. 각각의 source(데이터를 보내는 쪽)는 자신에게 주어신 시간동안만 데이터를 전송할 수 있도록 디자인되어있는데 대표적인 동기화 방식이라고 할 수 있습니당.
그리고 비동기식은 어떤 기준에 맞춰서 데이터가 전송되는게 아니라, 필요할때마다 그때그때 데이터를 전송하는 거죠... 그때그때 데이터를 보내야 하기때문에 가장 큰 문제는 지금 전송되는 데이터가 누구에게 도착하는 것이고 또 누가 보내고 있는지, 그 길이는 어느정도인지(어디까지만 받아야 하는지) 를 결정해야 해요. 따라서 보내기 전에 "내가 이제부터 A에게 보내려고 한다"라고 알려주고, 다 보내고 나면 "이제 다 보냈다" 라는 것 등을 알려줘야 해요.
게다가 동시에 여러명이 보내려고 할 수도 있겠죠. 동기식에서는 기준에 맞춰서 보내는 순서가 있으니까 질서가 잡혀있지만 비동기식에서는 이런 순서가 없으니까 한마디로 개판이라고 할 수 있져..^^;;(서로 보내겠다고 난리치는 경우도 있을수 있을거에요..) 따라서 비동기화가 질서를 잡는데 더 어렵죠..
그렇다고 동기화가 더 좋은건 아니에요. 동기화는 매 단위시간마다 데이터를 전송할 수 있는 송신자가 정해져 있는데, 만일 B는 더이상 보낼 데이터가 없어도 자신에게 주어진 시간은 여전히 B만 데이터를 보낼 수 있어서 많은 데이터를 보내야 하는 다른 송신자들은 데이터 전송에 더 오랜 시간이 걸릴 수 밖에 없어요.(효율성이 많이 떨어진다는 얘기이기도 하죠..)
양쪽 모두 일장일단이 있으니까 주어진 환경에 맞게 어느 방식을 써야할지 결정해야 하겠죠..
동기식 전송은 한 문자 단위가 아니라 미리 정해진 수 만큼의 문자열을 한 묶음으로 만들어서 일시에 전송하는 방법이다. 이 방법에서는 데이터와는 별도로 송신측과 수신측이 하나의 기준 클록으로 동기신호를 맞추어 동작한다. 수신측에서는 클록에 의해 비트를 구별하게 되므로, 동기식 전송을 위해서는 데이터와 클록을 위한 2회선이 필요하다. 송신측에서 2진 데이터들을 정상적인 속도로 내 보내면, 수신측에서는 클록의 한 사이클 간격으로 데이터를 인식하는 것이다.
동기식 전송은 비동기식에 비해 전송효율이 높다는 것이 장점이지만 수신측에서 비트 계산을 해야하며, 문자를 조립하는 별도의 기억장치가 필요하므로 가격이 다소 높은 것이 단점이다
*비동기식 asynchronous (transmission)
에디터 내에 동기신호를 포함시켜 데이터를 전송한다. 송신측의 송신 클록에 관계없이 수신신호 클록으로 타임 슬롯의 간격을 식별하여 한번에 한 문자씩 송수신한다.
이때 문자는 7~8 비트로 구성되며, 문자의 앞에 시작비트 (start bit)를, 끝에는 정지비트 (stop bit)를 첨가해서 보내는 방법이다.
비동기식 전송은 시작비트와 정지비트 사이의 간격이 가변적이므로 불규칙적인 전송에 적합하다. 또한 필요한 접속장치와 기기들이 간단하므로 동기식전송 장비보다 값이 싸다는 장점이 있다.
이력 A 가 들어가면 출력 B가 바로 나오게끔 만들어져 있게 설계 되고요
비동기식은 그렇지 않죠
비동기식은 딜레이같은 문제를 해결해야 되기땜에 더 복잡하고
기술적으로 어렵습니다.
'잡다한것들전부 > C, C++, C#' 카테고리의 다른 글
| [펌] 단순연결리스트(Single Linked List) 예제 (0) | 2014.01.13 |
|---|---|
| c++에서 bool 형 값 true false 실수할 수 있는 부분 (0) | 2014.01.13 |
| 동기화 비동기화 동기식 비동기식 이란? (0) | 2014.01.13 |
| 추상 클래스 (C++) (0) | 2014.01.10 |
| Duff's Device (0) | 2014.01.10 |
| c++ 11 이란?? (0) | 2014.01.09 |
1. 델리게이트(Delegate)
오늘은 델리게이트(Delegate)에 대해서 알아보려고 합니다. 델리게이트는 한마디로 말해서 대리자라고 말할 수 있습니다. 즉, 대신 일을 해주는 녀석이라고 할 수 있겠죠? 다른 말로 해서는 메소드 참조를 포함하고 있는 영역이라고 말할 수 있습니다. 아래는 델리게이트의 선언 형식입니다.
1 | delegate 반환형 델리게이트명(매개변수..); |
위의 선언 형식을 보아하니, 델리게이트가 메소드같이 생겼죠? 델리게이트는 위에서 말한 대로, 메소드의 참조를 포함합니다. '메소드를 참조한다니, 그럼 메소드를 매개변수로 넘길 수 있다는 말인가요?'라고 생각하시는 분들이 있을지 모르겠는데, 네 맞습니다. 델리게이트를 이용해서 메소드를 넘겨줄 수 있습니다. 델리게이트는 메소드를 참조 하는 것이고, 참조하는 메소드가 달라진다면 델리게이트 역시 달라집니다. (한가지 주의하실 것이 있다면, 매개변수의 데이터 형식과 반환형은 참조할 메소드의 매개변수의 데이터 형식과 반환형에 맞추어야만 합니다. 개수 역시도.)
무엇보다 이 델리게이트란 녀석이 어떤 일을 하는지는, 직접 해보는게 더 빠를지도 모릅니다. 아래는 델리게이트의 사용 예제입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication39{ delegate int PDelegate(int a, int b); class Program { static int Plus(int a, int b) { return a + b; } static void Main(string[] args) { PDelegate pd1 = Plus; PDelegate pd2 = delegate(int a, int b) { return a / b; }; Console.WriteLine(pd1(5, 10)); Console.WriteLine(pd2(10, 5)); } }} |
결과:
15
2
계속하려면 아무 키나 누르십시오 . . .
코드를 보시면 9행에 PDelegate라는 델리게이트가 보이죠? 매개변수 부분에는 int형 매개변수 a, b를 명시해주었습니다. 13~16행에서는 Plus란 메소드가 정의되었습니다. 이제부터 자세히 보셔야 합니다. 20행을 먼저 봅시다. Plus 메소드 자체를 델리게이트에 집어넣고 있는것 같죠? Plus 메소드와 연결하여 대리자를 인스턴스화 합니다. 이제부터 델리게이트 pd1은 Plus 메소드를 참조하게 됩니다. 26행을 보시면 Plus 메소드를 쓰듯, a와 b를 더해서 값을 반환합니다. 21행을 보시면 아무 이름이 없는 메소드를 델리게이트에 집어넣습니다. 별도로 메소드를 만들지 않았죠? 이런 무명 메소드의 사용은 한번 사용하면 불필요해지는 메소드를 만들때도 사용되는 등, 매우 유용합니다. 27행도 26행과 마찬가지로 pd1처럼 사용할 수 있습니다.
2. 델리게이트 체인(Delegate chain)
델리게이트 체인이라고 하니, 무언가가 체인처럼 이어져 있을거라고 생각이 들지 않나요? 네, 맞습니다. 델리게이트 하나를 가지고 여러개의 메소드를 한번에 호출할 수 있습니다. 한번 볼까요?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication39{ delegate void PDelegate(int a, int b); class Program { static void Plus(int a, int b) { Console.WriteLine("{0} + {1} = {2}", a, b, a + b); } static void Minus(int a, int b) { Console.WriteLine("{0} - {1} = {2}", a, b, a - b); } static void Division(int a, int b) { Console.WriteLine("{0} / {1} = {2}", a, b, a / b); } static void Multiplication(int a, int b) { Console.WriteLine("{0} * {1} = {2}", a, b, a * b); } static void Main(string[] args) { PDelegate pd = (PDelegate)Delegate.Combine(new PDelegate(Plus), new PDelegate(Minus), new PDelegate(Division), new PDelegate(Multiplication)); pd(20, 10); } }} |
결과:
20 + 10 = 30
20 - 10 = 10
20 / 10 = 2
20 * 10 = 200
계속하려면 아무 키나 누르십시오 . . .
코드를 보시면 13~31행에 사칙연산(더하기, 빼기, 나누기, 곱셈) 메소드가 정의된 것을 보실 수 있습니다. 이제, 델리게이트를 이용하여 이 모두를 묶어주어 한꺼번에 호출할 수 있습니다. 35~36행을 보세요. Delegate.Combine 메소드가 쓰였습니다. 이 메소드는 두개 이상의 대리자의 호출 목록을 연결해주는 역할을 합니다. Plus와 Minus, Division, Multiplication 메소드는 이제 델리게이트 pd만 호출하여도 간편하게 모두를 호출할 수 있습니다.
3. 이벤트(Event)
이벤트는 실제론 '잔치', '행사'와 같은 의미로 쓰이나 프로그래밍 세계에 와서는 의미가 '특정 사건이 벌어지면 알리는 메시지'라고 할 수 있습니다. 이벤트를 예로 들자면, 사용자가 컨트롤(버튼, 이미지, 레이블, 텍스트박스 등..)을 클릭하거나 창을 닫거나 열때 사용자에게 개체를 알리는 것을 이벤트 발생이라고 합니다. C#에서는 우리가 방금 배운 델리게이트를 사용하여 이벤트를 처리할 수 있습니다. 이벤트의 기본적인 선언 형식은 다음과 같습니다.
1 | 한정자 event 델리게이트 이름; |
위와 같이 event 키워드를 사용하여 이벤트를 선언할 수 있습니다. 한번 직접 보도록 해볼까요?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication42{ public delegate void MyEventHandler(string message); class Publisher { public event MyEventHandler Active; public void DoActive(int number) { if (number % 10 == 0) Active("Active!" + number); else Console.WriteLine(number); } } class Subscriber { static public void MyHandler(string message) { Console.WriteLine(message); } static void Main(string[] args) { Publisher publisher = new Publisher(); publisher.Active += new MyEventHandler(MyHandler); for (int i = 1; i < 50; i++) publisher.DoActive(i); } }} |
결과:
1
..
Active!10
..
Active!40
..
49
계속하려면 아무 키나 누르십시오 . . .
자 이제, 코드를 볼까요? 9행을 보시면 MyEventHandler라는 델리게이트가 선언되었습니다. 11행을 보시면 Publisher라는 클래스가 선언되었고, 이 클래스 내에는 event 한정자로 수식한 델리게이트의 인스턴스를 선언합니다. 그리고 DoActive라는 메소드도 정의되었습니다. number라는 매개변수를 가지고, number를 10으로 나눴을때 나머지가 0이면, 이벤트가 발생하게끔 했습니다. 그게 아니라면 그냥 숫자만을 출력하도록 했습니다. 이제 Subscriber 클래스로 내려와서 바로 보이는게 이벤트 핸들러 부분인데, 위에서 선언한 델리게이트와 일치합니다. 그리고 더 아래로 내려가면 클래스의 인스턴스를 만들고 Active 이벤트에 MyHandler 메소드를 이벤트 핸들러로 등록하라는 말과 같습니다. 이제 아래서 특정 조건을 만족하면 이벤트가 발생하며 Active가 출력됩니다. 이벤트가 조금 생소하죠?
궁금하신 부분은 언제나 물어보시고, 보충해야 할 부분이 있다면 추가 설명을 달도록 하겠습니다.
출처 : http://blog.eairship.kr/151
'잡다한것들전부 > C#' 카테고리의 다른 글
| 유니티 c# RayCast 디버그 방법(눈으로 디버그라인을 그리는방법) (0) | 2014.01.19 |
|---|---|
| [펌]C# 델리게이트 및 이벤트 함수 (1) | 2014.01.13 |
| [queue] Queue 관련 함수 (Dequeue, Enqueue, Peek) (0) | 2014.01.12 |
| C# 동영상 강의 모은 곳 사이트 주소 (0) | 2014.01.04 |
| c# delegate (0) | 2013.12.30 |
| c# 제네릭 (0) | 2013.12.30 |





