클래스 컨스트럭터가 아래 처럼 클래스 머리에 붙어있는데
처음에는 + 책 읽는 동안은 이게 뭐병... 이랬는데, 실제 쓰다보니 너무 직관적입니다.
오브젝트 필드 초기화가 위에서 부터 차례대로 내려오니
변수가 모두 상수화 되서 정의될 수가 있습니다. (실제로 상수는 없지만, 어쨌든 변하지 않는 변수로)
C#, Java 등에서는 오브젝트 초기화하려면 필드 봤다가 컨스트럭터 봤다가
lazy 필드도 없으니 초기화 순서 어떻게 되는지 모든 경우마다 신경쓰고 해야하는데,
스칼라에서는 그럴일이 엄청나게 줄어듭니다.
예전에 베이직에서 goto 로 프로그래밍 하다가 파스칼 처음 썼을 때
머리가 깨끗해지는, 그때와 비슷한 느낌을 받고 있습니다.
주류 OO 언어들은 왜 이런 생각을 하지 못했을까요.
class PostRack(http: Http) extends Rack(http) {
val post = new PostDomain(this)
val session = new HttpSession(http)
...
그리고 Groovy 도 코드량 줄여주는 것이 장난 아니였는데 Scala 가 더 심해보입니다.
코드가 더 압축되고 있습니다.
타입 언어가 이렇게 할 수 있다는 것이 참 신기하고 +
주술 처럼 적어도 인텔리센스 칼 같이 동작하니 때마다 IDEA 만든 사람들도 대단해 보입니다.
스칼라 기본 문화에서 배우는 점들도 있어서
다른 언어에서 구축했던 것 보다 먼가 모듈들이 짜임새 있어지는 것 같습니다.
무엇보다 스칼라가 노가다를 줄여주니 노가다 걱정 없이 원하는 모듈을 원하는 위치에 놓을 수 있습니다.
자바나 C#에서 이리 하면 손가락에 난리났을 겁니다.
예로 Grails 만 하더라도 자주 쓰는 변수에 편하게 접근하기 위해서
주요 오브젝트가 모두 컨스트럭터에 달라 붙습니다.
모듈 구분하자니 손가락이 고생이고, 손가락 편하게 하자니 프로젝트가 떡덩어리가 됩니다. =o=
스칼라는 오브젝트의 필드를 임포트 할 수가 있습니다.
import myVeryMajorVIPObject._
그리고 implicity converter 가 오브젝트 타입 변환을 자동으로 해줘서
캐스팅 역할하는 코드가 대폭 줄어듭니다.
아직은 하루에 몇 시간씩 삽질하는 사건이 벌어지긴 하는데,
제가 잘 못랐던 부분들 때문에 그렇고,
익숙해지면서 점점 속도 붙고 있습니다.
Scalate 도 감동입니다. 잘 작동합니다.
물론 에러 한번 뜨면 덤프 장난아니지만, 소스 코드는 진짜 이쁩니다.
여태까지 템플릿 언어의 문제점 ( 속도 문제 + 타입 보존 문제 + 마스터 파일 문제 ) 이 일소 됩니다.
아래 짤방은 요즘 작업하고 있는 사이트의 마스터 레이아웃을 Haml 로 코딩한 것입니다.
!!! 5
-@ import var rack: fa.app.rack.PostRack
-@ var body: String
%head
- render("layout/header_.scaml")
%body
.site-t
%a(href="/") Sleek
- if (auth.logged)
.search-form.cmd
%form(action="/search" method="get")
%input(type="text" name="q" value={http.params("q")} class="tb"
max="512")
%input(type="submit" value="검색" class="submit")
#menu-p
%ul.menu.blk-link
- for (category <- session.categories)
- if (category.categoryId > 0)
%li<
- if (category.categoryId == post.categoryId)
%a(href={url.postList(category.categoryId)} class="current")><
= category.desc
- else
%a(href={url.postList(category.categoryId)})><
= category.desc
- else
%li.sep
#main-p
!= body
%script(type="text/javascript") $(function() { $("#menu-
p").attachVerticalMover() })