제네릭, 클로저, 코루틴
정수용 max와 실수용 max를 꼭 따로 써야 할까?
다형성의 세 형태
하나가 여러 타입을 받습니다
제네릭 서브프로그램(generic subprogram)은 부를 때마다 다른 타입의 매개변수를 받습니다. 다형(polymorphic) 서브프로그램이라고도 하고, 다형성에는 세 형태가 있습니다.
객체는 값과 기능을 묶은 덩어리입니다(5강). 부모·자식 타입은 11강에서 봅니다.
매개변수 다형성
타입 자리를 비워 둡니다
타입을 매개변수로 받는 것이 매개변수 다형성입니다. C++에서는 template 절로 시작하고, 호출을 만나면 그 타입의 버전이 저절로 만들어집니다. 실행 중에 고르는 동적 바인딩보다 비용이 적은 방법입니다.
컴파일러는 소스를 기계어로 번역하는 프로그램입니다. a > b ? a : b는 a가 크면 a, 아니면 b라는 뜻입니다. int는 정수, double은 소수 타입입니다.
언어마다의 제네릭
같은 생각, 다른 규칙
C++은 타입마다 버전을 만들지만, 자바 5.0의 제네릭 메서드는 한 번만 만들어지고 제네릭 매개변수는 클래스여야 합니다. F#은 타입을 정할 수 없으면 스스로 제네릭 타입으로 추론합니다. 이것이 자동 일반화(automatic generalization)입니다.
와일드카드(wildcard)는 어떤 클래스든 된다는 표시이고 C# 2005에는 없습니다. 'a는 추론한 제네릭 타입을 적는 F#의 표기입니다.
클로저
변수를 품은 함수
클로저(closure)는 서브프로그램과, 그것이 정의된 참조 환경을 묶은 것입니다. 아무 데서나 불려도 정의된 곳의 변수를 쓸 수 있도록, 바깥 함수가 끝난 뒤에도 그 변수를 살려 둡니다.
참조 환경은 그 자리에서 보이는 이름들입니다(4강). 바깥 함수가 끝나도 x의 칸이 남아 있어야 합니다. 이것을 무제한 수명(unlimited extent)이라고 합니다.
코루틴
멈춘 자리에서 이어 갑니다
코루틴(coroutine)은 진입점이 여럿이고, 어디로 들어올지를 스스로 제어하는 서브프로그램입니다. 부르는 것을 재개(resume)라고 하고, 부른 쪽과 불린 쪽이 대등합니다.
대등해서 대칭 제어(symmetric control)라고 합니다. 한 번에 하나만 실행되는 준병행 실행(quasi-concurrent execution)이고, Lua가 지원합니다. 예시 그림입니다.
8강 정리
서브프로그램, 한 장으로
서브프로그램은 프로세스 추상화의 핵심 수단입니다. 그 한가운데에 매개변수 전달이 있고, 거기서 효율과 안전이 맞섭니다.
다음 강의