Skip to content

Instantly share code, notes, and snippets.

@kil9
Last active August 29, 2015 14:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kil9/b211eee8e61d01b0dfc2 to your computer and use it in GitHub Desktop.
Save kil9/b211eee8e61d01b0dfc2 to your computer and use it in GitHub Desktop.
scala의 assign에 대하여
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Scala의 tuple assign문법\n",
"kim kil9 <krieiter@gmail.com>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"----"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"Scala에서 다음은 유효한 문법이다."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[36ma\u001b[0m: \u001b[32mInt\u001b[0m = \u001b[32m3\u001b[0m\n",
"\u001b[36mb\u001b[0m: \u001b[32mInt\u001b[0m = \u001b[32m4\u001b[0m"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"val (a, b) = (3, 4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"위의 코드에서 a는 3, b는 4의 값을 가진 Int 타입으로 각각 초기화된다. 하지만 다음 코드를 보자."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[31m<console>:1: ';' expected but '=' found.",
"(c, d) = (3, 4)",
" ^\u001b[0m"
]
}
],
"source": [
"var c, d: Int = 0 // c와 d를 mutable Int 타입으로 선언한다.\n",
"(c, d) = (3, 4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"하지만 이미 존재하는 변수 c와 d에 3, 4를 동시에(엄밀히 말하면 '동시'는 아니다) assign하는 것은 불가능하며, 위와 같은 에러를 낸다. 조금 이상하지만 이유는 단순하다. `(c, d)`는 기본적으로 `Tuple2(c, d)`와 동치로 취급되며, `Tuple2`에는 원래 assign이 불가능하기 때문이다. 그렇게 생각하면 우리가 의심을 가져야 했던 쪽은 최초의 `val (a, b) = (3, 4)`가 문제 없이 실행되었다는 점이다.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"그렇지만 이건 왠지 이상하다. 똑같아보이는 문법으로 init과 assign을 동시에 하는 것은 가능한데, assign만 하는 것은 불가능하다니 반대가 안되면 모를까 이쪽이 안되는건 이상하지 않나? 문법에 일관성이 없는 것처럼 보이는데, 한편으론 이걸 허용해주면 `(c, d)`를 `Tuple2(c, d)`의 '짧은 표현'으로 간주하는 다른 문법 상의 일관성이 깨지게 된다. 결국 여러 가지를 고려해보면 최초의 `val (a, b) = (3, 4)`가 일종의 예외이며 Scala의 syntactic sugar였다고 보는 것이 가장 자연스러운 설명이다."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"프로그래밍 언어를 디자인하는 사람은 언제나 이런 종류의 trade off에 부딪히게 마련이다. `(c, d) = (3, 4)`가 안된다는 것을 깨달았을 때 당황하게 되는 순간은 아마도 잠깐일 것이며, 그에 비해 변수 여러 개를 묶음으로 assign하거나 `Tuple2(c, d)`라고 쓰는 대신 `(c, d)`라고 쓸 때의 편리함은 훨씬 자주 느끼고 오래 갈 것이라고 Martin Odersky는 생각했을 수도 있다. 하지만 프로그래밍 언어에 있어서는 '문법의 일관성에 대한 기대감' 같은 것이 더 중요할 때도 있다."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Scala 2.11",
"language": "scala211",
"name": "scala211"
},
"language_info": {
"codemirror_mode": "text/x-scala",
"file_extension": "scala",
"mimetype": "text/x-scala",
"name": "scala211",
"pygments_lexer": "scala",
"version": "2.11.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment