해결된 질문
작성
·
266
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
아.. 정말 친절하신 답변 감사드립니다.
제가 코딩을 독학으로 공부하게 된 건 한 두달전부터구요.
나름의 프로젝트를 만들어서 실전 코딩을 한 건 약 한달 전부터 입니다.
처음 질문에도 말씀드렸듯이 p5.js를 이용해서 작업 중입니다.
유튭이나 p5.js 홈페이지에 강의나 레퍼런스, 예제들이 많이 올라와 있어서
제가 하는 (여기서 저는 저 혼자를 말합니다. ㅋ) 프로젝트에 필요하다고 생각하는 부분만을 가져와 짜깁기? 하는 식입니다.
코딩 중에 현재 막혀있는 부분이 첫 질문에서의 핵심인 delegate구요.
근데 유데브 part 1 강의의 마지막에 그 개념을 알려 주셔서 어느 정도는 이해가 된 상태입니다.
제가 한달 정도 스스로 코딩을 해 본 결과, 생각이 많은 것 보다는 필요한 기능만 단순하게 라도 일단 짜보고
원래 프로젝트에 접목한 후에 에러를 잡아가는 것이 중간에 포기하지 않고 꾸준히 나아갈 수 있는 방법인 것 같습니다.
유데브 유니티 강좌를 끝까지 완주해서 프로그램 언어와 프로그래밍이라는 전체 숲을 한번 보겠습니다.
그렇게 한다면 뭔가 막막하고 갈피를 잡지 못하는 현 상황의 이정표를 찾은 느낌을 받을 수 있을 것 같아요.
코딩 초보의 수준 낮은 질문에 친절히 답변해 주셔서 다시 한번 감사드립니다.
도움이 되셨다니 다행이네요 ^^
수준낮은 질문이 어디 있나요 ㅎ 궁금하시면 물어보셔도 괜찮습니다.
말씀하신 우선 프로젝트를 진행해가면서 하는 것도 좋은 방법입니다. 답이 있는 것은 아니니까요. 그래도 하시다가 자바스크립트의 문법도 보시면 훨씬 좋을 것 같습니다. 회사 업무에서는 보통 언어하나를 할줄 한다고 가정하니까 그렇게 말씀드린거고요.
우선은 지금 하고 계신 방법이 좋아보입니다. 먼저 결과물을 내면 이해가 훨씬 쉽거든요.
궁금하시면 또 질문주세요, 감사합니다.