SC에서 클래스 만들기
<SC의 클래스만들기 규칙>
Platform.systemExtensionDir; // Extensions available to all users on the machine, .rtf가 아니라, .sc로 저장해서 여기에 넣으면 됩니다.
home/library/applicationsupport/supercollider/extensions 에 저장 후 cmd + k
0. 한글 주석 사용 불가
1. Getter vs Setter
<는 클래스 외부에서 변수의 값을 불러올 수 있게. (Getter)
>는 클래스 외부에서 변수의 값을 변경할 수 있게. (Setter)
<> 두개 동시에 가능
2. classvar vs var
classvar 는 클래스 차원에서 접근이 가능하고, (Cc.classvar이름)
var는 인스턴스 차원에서만 접근이 가능하다. (a = Cc.new; a.var이름)
3. ‘메소드’ = ‘함수’라고 생각해도 무방.
둘 모두 그 이름을 불렀을 때 수행될 일들을 적어놓는 곳.
클래스에 대해 적용될 함수는 정의되는 이름앞에 *을 붙이고, 인스턴스에 대해 적용될 함수는 *를 붙이지 않는다.
4. ^(꺾쇠)표시는 다른 언어에서의 ‘return’과 같은 의미.
뒤따라 나오는 구문의 결과값을, 함수를 부른(실행하라고 명령한) 곳으로 돌려준다.
5. 인스턴스 메소드와 클래스 메소드를 구분짓는 것은, SC(혹은 그것의 모태인 smalltalk)만의 특징인 듯.
SC의 클래스 구조에는 별도의 생성자(Constructor)개념이 없고, 기본적으로 상속받게 되는 최상위의 Object 클래스의 메소드를 빌려 필요한 메모리 공간 등을 할당받는 구조로 보임. Object 클래스의 내용을 이용하는 일종의 생성자 개념.
Object.new;
//새로운 인스턴스를 할당한다. 어떤 클래스든 실제로 인스턴스를 만들어 내기 위해서는 이것이 꼭 필요하다.
새로 정의되는 어떠한 클래스라도 그것을 실제 사용할 수 있는 인스턴스로 만들기 위해서는 위와같은 명령이 반드시 필요. 관습적으로 쓰여지는 아래와 같은 .new라는 메소드의 내용은 최소한 위와 같은 동작을 수행하기 위해서이다.
*new{
//new라는 이름으로 생성의 역할을 정의하는 것은 다른 클래스들과의 통일성으로보면 당연하지만 다른 이름이어도 상관 없을 듯.
^ super.new; //Object.new 를 하는것과 마찬가지.
}
여기에 클래스만의 특별한 초기화 조건을 덫붙이기 위해서는,
Object.new와 동시에 수행될 인스턴스 함수를 정의하여 실행한다.
*new{
^ super.new.init(500, 0.5, 0.7); //Object.new + 그로인해 만들어진 인스턴스.init(아규먼트에 각각 500, 0.5, 0.7)
}
init{arg f = 200, a = 1.0, p = 1.0; //init는 그저 initialize 역할임을 표기하기 위한 이름. 다른 이름이어도 상관 없음.
var freq, amp, pan;
freq = f;
amp = a;
pan = p;
}
6. 실습코드
Mtr{ // classvar var <>routine, <>bpm, <>amp, <>tick, <>synth, <>synthNode, <>intv; *new{| argbpm, argamp, argtick = 4, argsynth = \default | ^super.new.play(argbpm, argamp, argtick, argsynth); } play{| argbpm, argamp, argtick, argsynth | bpm = argbpm; amp = argamp; tick = argtick; synth = argsynth; routine = fork{ inf.do{| i | if(i % tick == 0, { intv = 60000 / bpm; //millisecond synthNode = Synth.new(synth, [\freq, 700, \amp, amp]); }, {synthNode = Synth.new(synth, [\amp, amp]);}); ((intv/1000)/2).wait; synthNode.free; ((intv/1000)/2).wait; } }; } stop{ routine.stop; synthNode.free; } }
mortp 2월 29, 2012의 9:59 pm 퍼머링크 |
엔터를 쳐도 줄간격이 안늘어나요 이런;;;
morogado 3월 1, 2012의 12:22 am 퍼머링크 |
기대되요! 클래스나라.
joynimm 3월 1, 2012의 1:01 am 퍼머링크 |
this 가 뭐라그랬져? ^ 는 리턴…
요즘 느끼는 바는 sc 같은 oop에서는 class 작성을 배워두면 많이 유용할 듯합니다.
mortp 3월 1, 2012의 2:18 pm 퍼머링크 |
this는,
클래스메소드를 정의할 때 쓰면 클래스를,
인스턴스메소드를 정의할 때 쓰면 인스턴스를 참조한다고 하네요.
음.. super와 대비되는 개념으로 생각하면 될 것 같아요.