• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

delegate는 다른 프로그램언어에도 해당되나요?

21.03.18 00:17 작성 조회수 158

1

제가 코딩을 배우기 위한 처음 시작이 HTML, CSS, JavaScript 그리고 이 강의 전까지 p5.js를 공부하고 있었는데요. 변수를 선언하고 초기화하며 함수내에서 그 값들을 바꾸는 것까지는 이해했는데 함수 자체를 변수화 하는 것, 즉 delegate하는 것에 대해서는 이해가 안되었습니다. 아직 part2 강좌는 들어가기 전이지만 이 delegate라는 개념?은 다른 프로그램 언어에서도 동일하게 존재하는 것인지 궁금합니다.

p5.js 제공하는 예제를 아래 붙여 보겠습니다.

let cnv;

let d;

let g;

function setup() {

  cnv = createCanvas(400, 400);

  cnv.mousePressed(changeGray);

  d = 10;

  g = 100;

}

function draw() {

  background(g);

  ellipse(width/2, height/2, d, d);

  

}

function mousePressed() {

  d = d + 10;

}

function changeGray() {

  g = random(0, 255);

}

이 코딩을 실행하면 canvas 밖에서 마우스를 클릭하면 원의 지름만 늘어나고 canvas안에서 클릭하면 원의 지름과 canvas의 배경색까지 같이 바뀝니다. 즉 cnv라는 변수를 선언한 후에 changeGray의 함수를 통해 canvas의 배경색을, 그것을 canvas 안에서 클릭을 할때, 랜덤으로 바꾸기 위해 cnv.mousePressed(changeGray);라는 delegate를 사용했다고 이해하면 되는지요?

유니티 강좌에서 다른 언어에 대해 질문해서 죄송합니다~~

답변 2

·

답변을 작성해보세요.

2

안녕하세요. 괜찮습니다. 물어 보실 수도 있죠 ^^

궁금하신 게 맞다고 생각합니다.

제가 공부해본 언어중에 자바에도 그렇고 안드로이드 코틀린도 그렇고요. 

IOS 개발하는 스위프트도 마찬가지이고요. 

자바스크립트도 그렇습니다. 

언어 발전 과정이 구조지향 ->객체지향 -> 함수지향 이런식으로 넘어가고 있다고 생각할 수 있고요. 

제가 자바스크립트를 잘 몰라서 그러는데요.

보여주신 예제에서 보면  cnv.mousePressed 가 있는데 이 함수는 캔버스에 있는 함수인거 같은데요. 여기에서 딜리게이트가 작동되어서 changeGray 를 받아들이고 있고요. 

조금 더 설명해보면 cnv 안에 있는 mousePressed 함수가 딜리게이트인 changeGray 를 받아들인다고 생각하고 있습니다. 인자로 함수를 받는 거죠. 그러므로 changeGray 함수를 다른 함수를 만들어서 교체해서도 동작할 것으로 예상됩니다. 

cnv.mousePressed(changeGray); 대신에  cnv.mousePressed(changeColor); 를 쓸수 있죠. 

function changeColor(){

    console.log("changeColor ");

}

------------------------------------------------------

그리고 직접 만든 위의 함수는 이벤트 함수 같습니다. 

function mousePressed() {

  d = d + 10;

이 전체 소스가 무엇인지 모르겠지만 아마 전체 화면에 대한 클래스인거 같아요. 이 클래스 안에 내부적으로 mousePressed 함수가 있고 함수 안에 저희가 원하는 내용을 구현하는 이벤트 함수 인거 같아요. 실제 이것이 내부적으로 어떻게 구현되어 있는지는 공부를 해보지 않았기에 잘 모르겠습니다. 하지만 마우스 클릭에 대한 이벤트가 이 함수로 지원되기 때문에 저희가 원하는 내용을 이 함수 안에 넣는 것이고요. 그래서 전체 화면이나 캔버스나 아무곳이 나 클릭해도 d = d+10 이 실행되는 것으로 보입니다.   저는 이것이 오버라이드(함수를 재정의)가 아닐까 생각했는데 실제 오버라이드(함수를 교체하는 기능) 은 따로 있습니다. 

제가 프로그래밍해보았을때 느낀게 문법이 비슷한 것처럼 보여도 언어마다의 느낌과 철학 그리고 동작이 조금씩 다르더라고요. 한 새로운 언어를 공부했을때 한번씩은 처음부터 끝까지 학습을 진행해서 동작이 어떻게 돌아가는지를 비교해 놓아야 합니다. 그게 되지 않고 프로젝트를 진행하면 꼭 문제가 생기더라고요. 비슷한 문법처럼 보여도 다르게 동작하는 부분이 분명히 있습니다. 

C# 보고 문법 비슷해서 자바스크립트를 그대로 시작하면 안되듯이 자바스크립트를 안다고 해서 C#을 건너뛰면 나중에 프로젝트를 진행하면서 분명히 문제점이 발생합니다. (제가 그런적이 있어서 프로젝트가 실패로 종료한 적이 있었습니다. ㅜㅜ 회사에서 그러면 문제가 커지죠..)

궁금하신점 또 물어보시고요. 좋은 하루 되세요 ^^

0

노원신님의 프로필

노원신

질문자

2021.03.18

아.. 정말 친절하신 답변 감사드립니다.

제가 코딩을 독학으로 공부하게 된 건 한 두달전부터구요.

나름의 프로젝트를 만들어서 실전 코딩을 한 건 약 한달 전부터 입니다.

처음 질문에도 말씀드렸듯이 p5.js를 이용해서 작업 중입니다.

유튭이나 p5.js 홈페이지에 강의나 레퍼런스, 예제들이 많이 올라와 있어서

제가 하는 (여기서 저는 저 혼자를 말합니다. ㅋ) 프로젝트에 필요하다고 생각하는 부분만을 가져와 짜깁기? 하는 식입니다.

코딩 중에 현재 막혀있는 부분이 첫 질문에서의 핵심인 delegate구요.

근데 유데브 part 1 강의의 마지막에 그 개념을 알려 주셔서 어느 정도는 이해가 된 상태입니다.

제가 한달 정도 스스로 코딩을 해 본 결과, 생각이 많은 것 보다는 필요한 기능만 단순하게 라도 일단 짜보고

원래 프로젝트에 접목한 후에 에러를 잡아가는 것이 중간에 포기하지 않고 꾸준히 나아갈 수 있는 방법인 것 같습니다.

유데브 유니티 강좌를 끝까지 완주해서 프로그램 언어와 프로그래밍이라는 전체 숲을 한번 보겠습니다. 

그렇게 한다면 뭔가 막막하고 갈피를 잡지 못하는 현 상황의 이정표를 찾은 느낌을 받을 수 있을 것 같아요.

코딩 초보의 수준 낮은 질문에 친절히 답변해 주셔서 다시 한번 감사드립니다.

도움이 되셨다니 다행이네요 ^^

수준낮은 질문이 어디 있나요 ㅎ 궁금하시면 물어보셔도 괜찮습니다. 

말씀하신 우선 프로젝트를 진행해가면서 하는 것도 좋은 방법입니다. 답이 있는 것은 아니니까요. 그래도 하시다가 자바스크립트의 문법도 보시면 훨씬 좋을 것 같습니다.  회사 업무에서는 보통 언어하나를 할줄 한다고 가정하니까 그렇게 말씀드린거고요. 

우선은 지금 하고 계신 방법이 좋아보입니다. 먼저 결과물을 내면 이해가 훨씬 쉽거든요.

궁금하시면 또 질문주세요, 감사합니다.