출처 : http://www.hoons.net/board/asptip/content/30981


- 위 출처에 나와있는 포스팅 내용을 요약하여 정리하였다.



먼저 들어가기 전 용어 정의.


<< Terminology >>

Method : 클래스에서 사용되어지는 함수 형태

Function : 일반 C언어나 Script 에서 사용되어지는 함수 형태

Function Pointer : 일반 C언어나 Script 에서 사용되어 지는 함수 포인터



위 포스팅한 분이 정리해놓은 Delegate 에 대해 정의하자면

- 특정한 때에 조건에 부합한 특정 클래스의  Method 를 실행

- 언제 무엇이 실행될 지 모를 때 사용하는 것


ex ) 유언장과 유언장을 집행하는 대리자

: 유언장에 죽은 후 해야 할 몇 가지 Method(유언) 들을 적어 놓고, 이 Method 들이 언제 실행될까?

정답은 '아무도 모른다'이다. 예를 들어 대리자 입장에서 유산이 얼마 없는데 백억을 후손에게 물려줘야 된다고

유언장에 적혀있다면 그 유언은 실행되지 않을 것이다. 즉, 조건이 맞아야 그 Method 를 실행시킬 수 있다.


위 예제를 다시 요약하면 패러미터 타입과 리턴 타입이 동일 + 성립된 조건 하에 어떤 Method 든지 실행이 가능하다.

특정한 때에.


=> 여기서 '이벤트'를 떠올린다.



delegate 선언을 보면,


delegate void SimpleDelegate(); 


밑줄 친 부분을 보면 클래스의 Method 로 보이고, C언어라면 함수의 형태를 띄고 있다고 할 수 있다.


But, 객체지향 언어는 클래스 기반이라 C언어에 있는 함수라는 게 존재하지 않아 위와 같은 형태로 사용하는 것은 불가능!



그런데...... "delegate 는 클래스처럼 인스턴스를 생성시킬 수 있다."


SimpleDelegate simpleDelegate = new SimpleDelegate();


클래스가 아님에도 하나의 함수가 마치 클래스처럼 동작한다는 점.



-> 왜 이렇게 동작을 시켜야 하는지, 필요한 이유가 무엇인지

: 이벤트로 인해 일반적으로 "클래스가 아닌 특정한 때에 특정 Method 만을 호출" 할 수 있는 

무언가가 필요하기 때문. 그 무언가가 'delegate' 이다.


아래 예제를 보자.


eTest.ckEvent += new evnetDelegate(MainClass.Click);


이벤트가 발생해 특정 Method 만을 호출하고 그 Method 에 개발자가 원하는 동작을 하도록 코딩을 한다.

실제 동작하는 코드가 있는 Method 는 MainClass.Click 인데 이 경우 MainClass 에 대한 참조가 필요하다는 것이다.


클래스가 아닌 저 Click 이벤트 핸들러에서 정의된 메소드만 필요하건만, 

객체지향 에서는 저 메소드 하나때문에 불가피하게 MainClass 를 생성할 수 밖에 없다는 거......



delegate 가 필요한 이유를 잘 읽어보면,

C 에서의 함수 포인터C# 의 delegate 는 사실상 같다고 볼 수 있다.


C에서의 함수 포인터란 ?

- 함수가 존재하는 메모리의 주소를 가리키는 특수한 변수. 또한 실행(호출)도 가능하다.


delegate 는 Method 를 실행시키고 함수포인터는 함수를 실행시킬 뿐 사실상 같은 역할을 하고 있다.




<< Delegate 사용법 >>


참고로 위 코드를 보면 알겠지만 Delegate 는 MainClass.Click 과 같이 일반화된 메소드 역시 참조할 수 있다. 

또한 하나의 Delegate로 여러 개의 메소드를 동시에 참조할 수 있다 : Delegate.Combine()

그리고 Combine 된 참조를 해제할 수 도 있다 : Delegate.Remove() 또는 '-=' 연산자


Calculate calc;

calc = delegate(int a, int b){ return a + b; }    // 이렇게 익명 메소드로도 사용할 수 있다.


delegate myDel = (int a, int b) => a+ b;    // 람다식 사용도 가능



by kelicia 2013. 12. 20. 16:20


람다식 (Lambda Expression)

- A lambda expression is an anonymous (익명인) function

tha you can use to create delegates or expression tree types.


- 람다 연산자 : '=>'



- 귀차니즘(?)으로 인해 생겨났다는... 점잖게 얘기하자면 번거로움을 줄이기 위해 생겨났다는 람다식.

어떤 번거러움을 덜어주는 지에 대한 예제를 가져와봤다.


출처 : http://rintiantta.blog.me/40115460090


C#

static void Main(string[] args)

{

List<string> list = new List<string>()

{

"A", "B", "C", "D", "E", "F"

};


Console.WriteLine( (list.Where(data => data.Contains("A"))).Count() );    // 1

}


List 에는 Where 라는 메소드가 있고, 그 메소드는 조건에 맞는 녀석들을 뽑아서

다시 배열로 만들어 주는 메소드 입니다. 패러미터로 Func<string, bool> predicate 를 받는데

뜻은 string을 인자로 주면 bool 로 리턴한다는 뜻이랍니다. 


저렇게 람다식을 바로 안 넣고 패러미터를 string을 받고 bool로 리턴하는 메소드를 따로 만들어 

그 메소드를 predicate 로 넣어도 되지만 저렇게 간단한 메소드인 경우 

메소드를 따로 정의하기엔.. 코드도 길어지고 귀찮기도 하겠죠ㅎㅎ


static void Main(string[] args)

{

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

int oddNumbers = numbers.Count(n => n % 2 == 1); // Count 메소드도  위 Where 메소드와 비슷합니다


Console.WriteLine(oddNumbers); // 5, 1, 3, 9, 7

}




C# 람다식 문법

( 출처 : http://msdn.microsoft.com/ko-kr/library/bb397687.aspx )


 delegate int del(int i);

static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); // j = 25
}



1. C# Expression Lambda :


(input parameters) => expression

왼쪽 괄호는 매개 변수가 1개일 경우, 생략가능



ex )


  x => x * x

(x, y) => x == y
(int x, string s) => s.Length > x
() => SomeMethod() : 입력 매개 변수가 0개 일 경우



2. C# Statement Lambda :


(input parameters) => {statement;}



ex )


delegate void TestDelegate(string s);

...

TestDelegate myDel = n => { string s = n + " " + "World"; Console.WriteLine(s);  };

myDel("Hello"); // Hello World




3. Asynchronous Lambda


4. 람다 식의 변수 범위


- 3, 4 번 관련 내용은 위 C# 람다식 관련 출처 링크를 통해 보는 게 나을듯.





Python 람다식 문법 

( 출처 : http://www.trypython.org/#part2-page4 ) : ctrl + c, v 가 안 되는 이 슬픔..


>>> def make_incrementor(n) :

return lambda x : x + n

...

>>> f = make_incrementor(42)

>>> f(0)

42

>>> f(1)

43




쌩뚱맞게 C# 이랑 Python 람다식 문법을 가져온 이유는..

람다식에 대한 내용을 Python 공부하다가 어쩌다 발견하게 되었고 예제 또한 이해가 잘 되서 가져왔다.

C# 의 경우 delegate(대리자) 과 관련되서 람다식이 나오는 것을 보고 가져와봤다.

대리자 관련 포스팅도 따로 할 예정.



by kelicia 2013. 12. 19. 16:57


얼마 전에 Ruby 와 Python 어떤 Script Language 를

공부해볼까 고민하면서 이것저것 고민해보다가

여러 좋은 자료들을 발견해서 블로그에 정리해본다 :D







조금 오래된 자료이지만 도식화 되있어서 보기 편리하다는 장점ㅎㅎ

개인적으로는 PHP 가 가장 경험많고, Python 은 진짜 맛 보기만 해봤고 Ruby 는 전혀..경험이 없다.


Ruby 를 웹에서 간단하게 해볼 수 있는 유용한 사이트가 있다. 

사이트 디자인도 제법 귀여운 요소가 많아서 좀 의외.(좀 일본느낌나지만)


http://tryruby.org/levels/1/challenges/1  : Script 언어 처음이신 분은 조금 신세계 일지도.




Ruby 와 Python 을 비교해놓은 오래된 포스팅도 발견.

일단 링크는 적어놓지만.. 마지막 포스팅이 2009 년이라 언제 없어질지 모르는 자료라서 여기에 옮겨놓는다.(죄송ㅠㅠ)

http://nextcontext.tistory.com/17 : 아래 접어놓은 글 중에 링크들은 안 긁혀져서 여기 링크를 통해야 된다.





Ruby 의 경우 개발자들을 위해 만든 언어라서 그런지 생각보다 한번 빠지신 분들은 깊은 충성도(?)를 자랑하는 듯 했다.

Python 은 Google 의 3대 개발 언어 중 하나이고, 지금은 어떤지 모르나 위의 Performance 표를 비교해 보면

확실히 눈에 띌 정도로 High Performance 를 자랑한다. 안정되면서도 뛰어난 성능을 자랑하니

개인적으로 선호하는 건 Ruby 이지만.. Python 을 더 공부하는 게 나을 것 같은.. 애매한 생각이 든다.




by kelicia 2013. 12. 19. 16:01


인턴하면서 WPF 프로그래밍을 접해봤고, MVVM 패턴이라는

디자인 패턴을 처음 접해보았다. 


학교에서 배운 디자인 패턴들도 있었으나 그 패턴들을

직접 코딩해보면서 알아가지 않아 확실히 느낀 바가 없어서 

배워도 그게 뭐였더라 하면서 애매했었는데 이번 기회에 정리해보려고 한다 :D





그림이 쬐끔해서 엄청 마음에 안듦



위 그림들을 서술형으로 정리해보자면



MVC (Model - View - Controller)

- Controller 에 직접 Input

- View 와 Controller : Many to One 관계

- View 는 Controller 를 참조하지 않음

- Model 은 View 를 간접적으로 참조함


- > Controller 에 입력이 들어오면 Controller 는 Model 에 있는 Data 를 조작하고, View 는 Model 에서 조작된 data 를

참조하여 View 를 수정한다. 이 때 View 가 Model 을 참조하거나 Model 이 View 를 참조하거나 하는 방식으로

변화에 대한 업데이트를 할텐데 결국 View 와 Model 이 참조를 할 수 밖에 없다는 이야기.



MVP (Model - View - Presenter)

- View 에 직접 Input

- View 와 Presenter : One to One 관계

- View 는 자신의 Presenter 를 참조하고 Presenter 역시 View 를 알고 있음

- View 는 Model 를 참조하지 않아 Presenter 를 통해 Model 을 업데이트함


-> View 에 입력이 들어오면 Presenter 에 data 를 요청하고, Presenter 는 자신이 참조하는 Model 에 업데이트를

요청하는 방식으로 동작한다. 이 경우 View와 Model 은 완벽히 분리되지만 View 와 Code 가 완벽히 분리됐다고

보기는 어렵다.



MVVM (Model - View - ViewModel)

- View 에 직접 Input

- View 와 ViewModel : Many to One 관계

- ViewModel 은 View 를 참조하지 않음

- View 는 Model 를 참조하지 않아 ViewModel 를 통해 Model 을 업데이트함


-> View 에 입력이 들어오면 View 가 참조하고 있는 ViewModel 에서 Binding 된 객체를 찾아 업데이트를 한다.

MVP 패턴에서는 Presenter 는 전적으로 View 의 형태에 따라 달라지지만,

MVVM 패턴에서는 ViewModel 이 View 를 참조하지 않으므로 Model 의 형태를 따른다고 할 수 있다.

View 는 Model 과 완벽히 분리되며 ViewModel 과도 Binding 을 통해 자동 업데이트 되므로 data 와도 완벽히 분리된다.


ex )

- .xaml (xaml의 .cs 파일에서 DataContext 프로퍼티를 참조할 ViewModel 로 Set)

<TextBlock Text={Binding TestText} />


- ViewModel.cs

private string _testText = "";

public string TestText

{

get { return _testText; }

set { _testText = value; OnPropertyChanged("TestText"); }

}




- 참고 자료

1. 선배님 발표자료 'WPF / MVVM 소개'

2. http://geekswithblogs.net/dlussier/archive/2009/11/21/136454.aspx




by kelicia 2013. 12. 19. 15:27

하아....

정말 어제 하루 종일 뻘짓을 달리고나서 포스팅을 하게됐다.

제목 그대로 HTML5 Canvas Element 를 사용할 때 주의할 점이 있다.


Canvas 요소에 관련된 예제들은 인터넷에 널리고 깔리고 w3schools.com 에도 잘 나와있지만

제대로 안 읽으면 나처럼 뻘짓을 하게 된다.......... OTZ

무턱대로 Canvas 를 썼다가 원하는 결과가 안 나오고 그 원인조차 못 찾으면 정말 미친다.


그 경우 이 Note 에 주의해야한다.



아래에 보면 밑줄 친 Note 에 꼭 주의하자.

반드시 Id, Width, Height 속성 값을 명시해줘야 한다. 

안 그러면 결과가 엉망진창인데다 나처럼 하루종일 뻘짓하게 된다.

( 그런데 필요에 따라 id 값은 반드시 꼭 붙일 필요는 없는 듯.. 하지만 width, height 명시는 반드시 해주자 )


이.렇.게.

왼쪽은 img 태그 사용한 결과,  오른쪽은 canvas를 그릇되게 사용한 결과.(drawImage 태그로 뿌려준 결과)

- canvas 에서 width 와 height 값을 명시하지 않을 경우 이 따위 결과가...orz 사용법을 잘 읽고 사용합시다.


이미지를 제대로 뿌려주기 위해서는 canvas의 width, height 속성 값이 뿌려줄 이미지 크기와 같아야만 한다.

( ※ 여기서 주의해야할 점은 canvas의 width, height 속성 값이지, 

 style(css)의 width, height 값이 아니다. )


나같은 경우, 여러 이미지를 갖고 계속 테스트를 해봤는데 width, height 를 css 로 조절을 하다보니까

계속 이상한 결과를 얻게 되고 - jQuery 를 사용하다 보니 .css() 함수로 조절했었는데..

'아니, 이미지 크기가 같게 변환을 해줬는데도 왜 안되는 거임? AO 빡쳐' 하다가 어쩌다보니

.attr() 함수를 찾고 해보니까 정말 매우 아름다운 결과를 얻었다. 하루종일 뻘짓하다보니 감격 T^T 엉엉orz


암튼 모두 주의합시다. 혹시나 나처럼 뻘짓하시는 분들 계실까 해서 포스팅 해봅니다. (울 이쁜 냥이에게 이 영광을)



마지막으로 주의해야할 점이 있다면 context.drawImage() 를 쓸 때 반드시

이미지가 다 로딩이 된 다음에 메소드를 실행해야지, 안 그러면 원하는 결과를 얻기가 어렵다.

이 얘기는 어느 블로거님의 포스팅을 읽고 알고는 있었는데, 여러 테스트(?)를 거쳐본 결과

onload 하고 drawImage() 를 걸어놨는데 그래도 가끔씩 이미지가 뻑나서... 완전한 솔루션은 못 찾았지만

메소드를 약간 천천히 유도(?)하면 - 예를 들어 이미지 로딩하는 데 0.4초 걸리는데 클릭을 0.5초 뒤에 한다던가.

정상적으로 뿌려진다. 워낙 테스트를 많이 하다보니까 테스트를 매우 빠른 속도로 하게 되는데 그때마다 거의 이미지가 뻑났다.

그래서 조금 천천히 테스트를 해보니까 대부분 정상적으로 뜨는 듯. 약간 애매하다.


뭐 어쨌든 그래도 해결해서 다행 ㅠㅠ


뜬금없지만 프로그래머든 뭐든 진짜 경험치가 높아야 하는 것 같다..... 

흑 정말 이거 찾아내느라고 12시간 넘게 붙들고 있었으니 orz


암튼 사용법을 정확히 알고 써야지 함부로 오남용은 ㄴㄴ

주의합시당


'Programming' 카테고리의 다른 글

Delegate (대리자)  (1) 2013.12.20
[Python, C#]Lambda Form  (0) 2013.12.19
PHP vs. Ruby vs. Python  (0) 2013.12.19
jQuery : css() 그리고 jQuery UI 소개  (0) 2013.01.02
jQuery : val(), text(), html()의 차이  (2) 2013.01.02
by kelicia 2013. 1. 11. 00:35


보통 html 문서를 컴파일할 때 css 파일이 있는 경우 이 파일 역시 컴파일 된다.

그리고나서 jQuery 를 이용해 어떤 html code를 삽입을 했는데 이미 css 파일이

한번 읽혀졌기 때문에 이 html code의 style은 정말 찾아볼수 없을 정도로 안 예쁘다. (필자의 경우 확 짜증이 난다)


이럴 때 html code를 한 뒤,

이 code를 가리킨만한 selector를 이용해 

$('selector').css(propertyName, value); 

요런 식으로 style을 입힐 수 있다. - 깨닫고 나서 엄청 감동먹음orz

value 말고도 function(index, value) 함수도 가능한듯. (자세한 예제는 http://api.jquery.com/css/ - only 영어)


꼭 이런 경우가 아니더라도 어떤 event가 발생했을 때 style을 바꾸는 아주 단순한 경우에도 쓰인다.ㅎㅎ

(예를 들어 버튼을 클릭했더니 글씨가 커진다던가, 배경색이 바뀐다던가 등)


뭔가 아리송한 건 .css(map) 인데 자세한 예제도, 설명도 없는 것 같아서 일단 PASS -



그리고... 내게 신세계를 열어준 jQueryUI (http://jqueryui.com/) .......

솔직히 UI API 라는 게 굉장히.. 뭐랄까 편리하면서도 제한적이라 좀 찜찜하지만 overwrite 가능하니까

결론은 편리하고 예.... 예뻐~~~~~ 흐흐흐


아코디언 타입의 메뉴 펼침 같은 경우 요렇게. 그 외에 많은 UI를 지원해서 한번 맛들리면 

직접 수작업하기 매우 귀찮아지는 경향이 생긴다는게 단점이랄까.


사이트 들어가서 요리조리 해봤는데 확실히 UI 사이트라 그런지 http://www.w3schools.com/ 보다 

훨씬 Test 하기도편한 것 같고 아기자기(색상, 폰트, 형태 등 전체적으로) 하면서도 예제 코드도 보기 잘해놨당 :D


jQuery 기본기도 없는 상태에서 코드가 굉장히 정신없어서.. 솔직히 처음엔 좀 많이 회의적이었는데

이렇게 또 써보니까 조금씩 재미를 붙이고 있다 ㅋㅋㅋ 한번 시도해 볼 가치가 있는 듯 하다.

게다가 지금 Node.js (한빛미디어) 책을 보고 있는데 온통 jQuery 코드라서 이해하려면 필수인듯 orz


'Programming' 카테고리의 다른 글

Delegate (대리자)  (1) 2013.12.20
[Python, C#]Lambda Form  (0) 2013.12.19
PHP vs. Ruby vs. Python  (0) 2013.12.19
HTML5 Canvas Element 를 사용할 때 주의할점 - drawImage() 관련  (2) 2013.01.11
jQuery : val(), text(), html()의 차이  (2) 2013.01.02
by kelicia 2013. 1. 2. 06:05

 참고 : http://api.jquery.com 


val() : Form Element 의 값을 받아오는데 쓰인다. (주로 input 이나 textarea 정도?)

- 주의해야할 점은 Form Element 이외의 값은 받아오질 못한다는 점.

★ val(value) : value의 경우 string 또는 string의 배열(이 경우 value들의 matching을 잘 시켜야 오류를 피할 수 있다) 

또는 함수(function(index, value) 이런 형태)로 넣을 수 있다.

이 함수 역시 Form Element의 Value 값을 Set할 때 주로 쓰인다.


text() : XML과 HTML 문서에서 둘다 사용될 수 있다. input elements 의 value를 받아오지 못한다(이 경우 val을 사용)

아주 쉬운 예로 <button>1</button> <button>2</button> <button>3</button> : button 대신 li 라던가.

$('button').text() 의 결과는 1 2 3 이다. 이런 식으로 사용된다. 

tag attribute의 value가 아니라(대표적으로 form 요소들) <tag>_____</tag>에서 _____에 해당하는 value를 get한다.

참고 사이트에 의하면 The .text() method cannot be used on form inputs or scripts. 

라고 적혀있다. ( form inputs 의 경우 val()를 말하는 거고 scripts 의 경우 html()을 가르킨다. )

● text(value) : textString 또는 함수(function(index, text) 이런 형태)로 넣을 수 있다. 이 역시 Set 하기위해 쓰인다.


html() : XML 문서는 사용 불가, HTML만 가능. value가 아니라 html code(contents)자체를 get한다.

class 네임이 여러 개 매칭되는 경우 제일 처음 매칭되는 class 안에 속하는 html code만 가져온다.

api 설명에 의하면 IE의 경우 알파벳 문자를 포함하고 있는 속성값들의 경우 " ' " (quote)를 빼먹고 get 할 수도 있다고 한다.

html(value) : htmlString 또는 함수(function(index, oldhtml) 이런 형태)로 넣을 수 있다. 이 역시 Set 하기위해 쓰인다.

class 네임이 여러 개 매칭되는 경우 매칭되는 모든 class 내부에 html code를 삽입.

만약 class 내부에 이미 어떤 code가 삽입되있는 경우, Set 할 html code로 완전히 Replace 해버린다.



by kelicia 2013. 1. 2. 05:37
| 1 2 3 4 |