특집 기사 : SWT , Xtend 를 만나 다 - 위 클립스 
 특집 기사 : SWT , Xtend 를 만나 다 
 이지율 , 토마토 시스템 
 이 문서 는 SWT UI 를 선언 적 언어 와 유사 한 형태 로 작성 할 수 있 도록 , Xtend 의 클 로져 [ 1 ] 를 응용 하 는 방법 을 소개 하 고 , 
 그러 한 기법 들 을 재 사용 하 고 공급 하 는 방법 에 대해 설명 한다 . 
 2 빌더 문법 
 3 익명 클래스 와 클로 져 
 3 . 1 메 서드 가 하나 가 아닌 익명 클래스 
 4 재사용 
 4 . 1 정적 메 서드 임 포트 를 통한 확장 
 4 . 1 . 1 자바 를 통한 확장 공급 
 4 . 1 . 2 정적 메 서드 임 포트 를 통한 확장 의 문제점 
 4 . 2 필드 를 통한 확장 
 일 을 하 던 도중 동료 로부터 , Xtend 로 SWT UI 코드 를 작성 하 는 것 비 효율 적 이 되 기 쉬운 것 같 다는 이야기 를 들 었 다 . 왜 그런 생각 이 들 게 되 었 는지 묻 자 , Xtend 는 익명 클래스 를 지원 치 않 기 때문 에 , 리스 너 의 탈 부착 이 곤란 해 지 는 경우 가 많 다는 것 이 었 다 . 
 그래서 나 는 , 어떤 표현식 을 갖 는 언어 로 작성 하 면 , 더 쉽 게 SWT UI 를 기술 할 수 있 을지 고민 하 게 되 었 고 , Xtend 의 빌더 문법 [ 2 ] 과 클로 져 [ 1 ] 를 이용 하 면 , Xtend 내 에서 도 꽤 괜찮 은 모양 의 코드 로 나타낼 수 있 을 것 같 다는 생각 이 들 었 다 . 
 그리고 잠시 작업 후 , 다음 과 같 은 실제 잘 작동 하 는 결과물 을 얻 었 다 : 
 Xtend 소스 코드 
 shell . runLoop 
 나 는 개인 적 으로 좋 은 코드 란 , 누가 보 더라도 무엇 을 하 는 코드 인지 짐작 이 가능 할 만큼 , 의도 를 읽 어 내 기 좋 은 코드 
 라고 생각 한다 . 위 의 예제 소스 를 보 면 , 오른쪽 의 작동 UI 를 상상 해 내 는 것 이 그리 어렵 지 않 은 일임 을 알 수 있 다 . 
 그러나 우리 에게 친숙 한 자바 로 같 은 일 을 하 는 코드 를 살펴보 자 : 
 자바 소스 코드 
 이 코드 를 보 고 오른쪽 에 보이 는 작동 UI 의 그림 을 떠올리 는 것 은 쉽 지 않 은 일 이 다 . ( 이 코드 는 절반 이상 생략 되 었 다 ) 
 Xtend 에서 저런 JSON 이나 ExtJS UI 선언 코드 와 유사 한 형태 의 기묘 한 코드 ( 읽 기 는 쉽 지만 Java 프로그래머 입장 에서 낯선 ) 가 기술 될 수 있 는 이유 는 Xtend 의 빌드 문법 이 라는 특징 때문 이 다 . 
 [ 편집 ] 빌더 문법 
 Xtend 의 빌더 문법 [ 2 ] 이 란 , 개발자 들 이 주로 작성 하 는 코드 의 한 패턴 중 하나 가 : 
 객체 를 생성 하 고 , 초기 화 하 고 기존 객체 들 과 의 유기 적 인 관계 를 설립 하 는 것 
 라는 것 에서 부 터 시작 하 며 , 이 를 언어 적 인 차원 에서 지원 할 방법 을 궁리 하 며 등장 한 것 이 다 . 
 Xtend 가 이 를 지원 하 는 기본 원리 는 다음 과 같 다 : 
 마지막 인자 를 객체 를 초기 화 하 는 클로 져 로 전달 받 아 , 객체 생성 후 클로 져 로 객체 를 초기 화 하 는 함수 를 빌더 함수 라고 한다 . 이 함수 는 한 번 의 호출 로 객체 의 생 성 과 초기 화 를 완료 할 수 있 다 . 
 특정 함수 의 마지막 인자 가 클 로져 [ 1 ] 인 경우 , 마지막 인자 는 괄호 바깥 에서 '[' 와 ']' 안 에 표현 될 수 있 다 . 
 만약 함수 를 호출 할 때 괄호 안 에 아무것 도 쓸 것 이 없 는 경우 괄호 자체 를 생략 할 수 있 다 . 
 이 규칙 들 에 의해 모델 을 빌 드 하 는 코드 들 은 한결 더 간결 해 질 수 있 다 . 
 [ 편집 ] 예제 
 1 newTreeItem 함수 는 두 개 의 인자 를 갖 는데 , 2 첫 번 째 인자 parentItem 은 부모 TreeItem 이 며 , 3 두 번 째 인 자 는 초기 화 클로 져 이 다 . 
 Xtend 에서 첫 번 째 인자 는 주어 로 취급 될 수 있 으므로 , 이제 모든 TreeItem 들 은 newTreeItem 이 라는 멤버 변수 를 갖 게 된다 . 따라서 다음 과 같 은 코드 를 호출 할 수 있 게 된다 . 
 Xtend 에서 클로 져 의 인자 가 한 개인 경우 , 묵시 적 파라미터 it [ 3 ] 을 사용 할 수 있 고 , 3 이 클 로 져 는 인자 가 TreeItem 한 개 이 므로 , 묵시 적 변수 가 적용 가능 하 다 . 
 따라서 다음 과 같이 나타낼 수 있 다 : 
 자바 에서 this 키워드 가 생략 가능 한 것 처럼 , Xtend 에서 는 it 키워드 를 생략 할 수 있 으므로 다음 과 같이 다시 정리 할 수 있 다 : 
 마지막 인자 가 클로 져 인 경우 괄호 바깥 에 쓸 수 있 고 , 괄호 안 에 내용 이 없 는 경우 생략 이 가능 하 므로 : 
 위 와 같이 다시 정리 된다 . 
 초기 화 클 로 져 내부 에서 it 은 TreeItem 이 므로 , 다시 newTreeItem 을 호출 할 수 있 다 : 
 위 처럼 훨씬 더 간결 하 고 가독성 이 높 은 모델 구축 코드 를 얻 을 수 있 다 . 
 [ 편집 ] 익명 클래스 와 클 로 져 
 이 글 의 개요 에서 언급 된 문제 중 하나 는 Xtend 에서 익명 클래스 를 기술 할 방법 이 없 다는 것 이 다 . 
 예 를 들 어 아래 와 같 은 자 바코드 를 Xtend 로 작성 하 는 것 은 불 가능 하 다 : 
 Xtend 에서 익명 클래스 와 가장 근접 한 개념 을 갖 는 요소 는 클로 져 이 다 . 
 Xtend 는 기존 자바 인터페이스 를 취급 할 때 , 다음 의 요건 을 만족 하 는 경우 , 그 인 스턴스 를 클로 져 로 취급 한다 : 
 인터페이스 가 하나 의 메 서드 만 갖 는 경우 . 
 따라서 위 의 자바 코드 는 다음 과 같이 Xtend 코드 로 나타낼 수 있 다 : 
 이 는 Listener 인터페이스 가 하나 의 메소드 만 갖 기 때문 에 가능 하 다 . 앞서 배운 빌더 문법 의 특징 을 떠올리 면서 , 다음 과 같이 간추릴 수 있 다는 것 을 기억 하 자 : 
 [ 편집 ] 메 서드 가 하나 가 아닌 익명 클래스 
 그렇 다면 메 서드 가 한 개 가 아닌 인터페이스 의 익명 클래스 를 만드 려면 어떻게 해야 하 는가 ? 
 현재 Xtend 에서 는 불 가능 하 다 . 
 차후 Xtend 가 그 를 지원 할 것 인지 는 의문 이 지만 , 개인 적 으로 그것 이 Xtend 스타일 의 프로그래밍 방법 은 아니 라고 생각 한다 . 
 만약 메 서드 가 여러 개인 하나 의 익명 클래스 가 있 다면 , Xtend 에서 그것 을 여러 개 의 클로 져 로 취급 할 수 있 도록 , 중간 자바 클래스 나 Xtend 확장 을 공급 해 주 는 것 이 한 방법 이 라고 생각 된다 . 
 예 를 들 어 SelectionListener 는 다음 과 같이 두 개 의 메서 드 를 가지 고 있 다 : 
 이런 경우 , Xtend 스타일 로 문제 해결책 을 기술 하 는 방법 은 다음 과 가깝 다 : 
 물론 Button 은 onSelected 와 같 은 속성 이 없 으므로 , 다음 과 같이 확장 해 주 어야 할 것 이 다 . 
 확장 을 기술 하 려면 Xtend 에서 는 사용 불 가능 한 Java 도구 들 이 필요 한 경우 도 종종 생기 는데 , 이 에 대해서 는 다음 절 에서 다시 해결책 을 설명 하 겠 다 . 
 [ 편집 ] 재 사용 
 이제 우리 는 초기 화 클로 져 를 이용 해 모델 구축 을 간단 하 게 나타내 기 위한 1 빌더 함수 를 만들 줄 알 게 되 었 다 . 하지만 이 를 다른 팀원 에게 어떻게 보급 할 것 이 며 , 스스로 어떻게 재 사용 할 것 인가 ? 
 모델 구축 이 필요 한 Xtend 클래스 의 소스 코드 마다 빌더 함수 를 붙여 넣 을 수 도 있 겠 지만 , 더 나 은 방법 을 알 아 보 자 . 
 Xtend 에서 재 사용 방법 은 크 게 두 가지 가 있 다 : 
 자바 의 import 구문 을 통한 클래스 재사용 
 Xtend 언어 문맥 확장 
 Java 의 import 구문 을 통한 코드 재 사용 에 대해 설명 을 할 필요 는 없 을 테 니 , Xtend 언어 문맥 확장 기법 에 대해서 만 설명 하 겠 다 . 
 Xtend 에서 언어 문맥 을 확장 하 는 방법 은 크 게 두 가지 가 있 다 : 
 정적 메 서드 임 포트 를 통한 확장 
 필드 를 통한 확장 
 [ 편집 ] 정적 메 서드 임 포트 를 통한 확장 이 는 자바 가 언어 문맥 을 확장 하 는 방식 과 거의 유사 하 다 . 
 자바 에서 는 위 의 코드 처럼 static 키워드 를 임포 트 구문 에 추가 하 면 , 같 은 소스 파일 내 에서 , Collections 가 가진 정적 ( static ) 메서 드 들 을 별도 의 추가 문맥 없이 사용 할 수 있 게 된다 . 
 [ 편집 ] 자바 를 통한 확장 공급 
 Xtend 는 자바 보다 뛰어난 점 들 도 많 지만 , 그 만큼 제약 들 도 존재 한다 . Xtend 는 실용 성 에 중심 을 두 므로 , 자주 사용 되 는 패턴 은 아니 지만 이따금 필요 한 코딩 에 대해 준비 가 되 어 있 지 않 을 수 도 있 다 . 
 예 를 들 면 , Xtend 에 는 double 형 숫자 를 기술 할 방법 이 없 다 . 반 대로 Java 에서 는 Xtend 의 모든 기능 을 기술 할 수 있 기 때문 에 , Xtend 를 확장 할 때 는 Java 를 사용 하 는 경우 도 종종 생긴다 . 
 위 의 예제 와 동일 한 역할 을 하 는 빌더 함수 를 자바 로 작성 하 면 다음 과 같 다 : 
 이제 Xtend 클래스 에서 는 위 의 확장 을 아래 와 같이 이용 할 수 있 다 : 
 / / MyExtension 을 확장 으로 임포 트 한다 . 
 import static extension foo . bar . MyExtensions . * 
 / / 확장 을 통해 빌더 함수 가 공급 된다 
 자바 에 는 클로 져 가 존재 하 지 않 으므로 , 이 를 위한 인터페이스 들 이 준비 되 어 있 다 . 
 예 제 자바 소스 코드 의 Procedure 1 는 리턴 타입 이 없 고 인자 가 한 개인 클로 져 에 대응 하 는 자바 인터페이스 이 다 . Xtend / 표현식 문서 의 함수 매핑 절 에서 클로 져 와 자바 인터페이스 간 에 매핑 에 대해 자세 한 정보 를 얻 을 수 있 다 . 
 [ 편집 ] 정적 메 서드 임 포트 를 통한 확장 의 문제점 
 그런데 import static extension 키워드 를 통한 확장 기법 은 deprecated 된 상태 이 다 . 작동 은 하지만 더 나 은 툴 링 을 위함 이 라고 한다 . 
 이하 의 내용 은 순전히 필자 의 추론 임 을 알 고 읽 기 바란다 . Deprecated 된 이유 에 관심 이 없 다면 이 절 을 건너 뛰 어도 되 며 , 
 다른 방식 의 장점 에 대해서 는 다음 절 에서 다시금 설명 된다 . 
 Xtend 팀 이 말 하 는 툴 링 이란 단지 우리 가 사용 하 는 Xtend 에디터 와 플러그인 들 의 품질 측면 만 을 언급 하 는 것 은 아니 다 . Xtend 로 공급 된 확장 을 이용 하 는 측면 의 툴 링 을 포함 한 툴 링 을 의미 한다 . 후자 의 관점 에서 정적 확장 방식 은 다음 과 같 은 문제 들 을 가진다 : 
 import static extension 방식 을 통한 확장 은 , 확장 공급 이 반드시 static 메 서드 형태 로 이뤄져야 한다는 제약 이 붙 는다 . 정적 메 서 드 나 클래스 스키마 등 은 PermGen 메모리 를 사용 하 게 되 고 , 일단 로드 되 고 나 면 해제 할 수 없 다 . 따라서 수 많 은 Xtend 확장 을 사용 하 는 시스템 을 가정 할 때 그다지 장밋빛 미래 가 펼쳐질 것 이 라고 기대 할 수 없 다 . 
 또한 공급 되 는 확장 을 서비스 로 취급 하 는 SOA 관점 에서 보 았 을 때 , 정적 클래스 를 접근 하 는 아이디어 로 는 SPI 를 통해 서비스 명세 와 구현 을 나눌 수 없 으므로 , 공급 되 는 서비스 가 동적 으로 변경 될 수 없 어 치명 적 인 약점 이 된다 . 
 확 장점 구조 의 측면 에서 보 았 을 때 , 여러분 이 공급 하 는 제품 이 오픈 엔드 프로덕트 인 경우 , 서드 파티 는 서비스 ( 공급 된 확장 ) 를 수정 할 방법 이 없 게 된다 . 
 [ 편집 ] 필드 를 통한 확장 필드 를 통한 확장 은 정적 인 메서 드 들 을 임포 트 하 는 대신 , 확장 기능 을 가진 자바 객체 인 스턴스 를 필드 로 두 어 , 확장 역할 을 수행 하 게 하 는 것 이 다 . 
 이 경우 확장 공급 클래스 는 정적 메 서 드 들 로 기능 을 공급 할 필요 가 없 다 . 
 // static 이 아님 . 
 위 와 같 은 확장 이 존재 할 때 클라이언트 클래스 의 코드 는 다음 과 같 다 : 
 / / 일반 필드 를 선언 하 듯 확장 을 선언 한다 . 
 일반 멤버 변수 선언 과 다른 점 은 extension 키워드 가 사용 되 었 다는 점 이 다 . 
 확장 멤버 객체 는 언어 의 문맥 을 확장 하 는 데 사용 되 므로 , 변수 명 을 가질 필요 가 없 고 , 생략 될 수 있 다 : 
 그런데 위 와 같이 하 면 , 공급 되 는 서비스 가 동적 으로 변경 될 수 없 다는 문제점 이 있 다 . 여러 확장 이 융합 되 고 , 사용 자 가 커 스터 마이 징 하 여 제품 을 개발 하 는 툴 링 을 공급 하 는 오픈 엔드 제품 의 경우 , 이 는 문제 가 될 수 있 다 . Xtend 클래스 는 자바 클래스 로 번역 되 어 컴파일 되 므로 , Google Guice 와 같이 자바 에 적용 가능 한 인 젝 터 [ 5 ] 를 이용 할 수 있 다 . 
 이 를 적용 하 려면 먼저 SPI 를 추출 한다 : 
 그 후 클라이언트 는 다음 과 같이 기술 한다 : 
 이제 실제 확장 은 인 젝 터 모듈 에 의해 공급 되 므로 , 서비스 공급 구조 에 유연 성 이 확보 된다 . 
 인 젝 터 모듈 의 구성 은 본 문서 의 범위 에 포함 되 지 않 으므로 , @ Inject 어 노테이션 이 낯 선 사람 들 은 다음 과 같 은 문서 를 참조 하 길 바란다 : 
 디펜 던 시 인젝션 
 Xtend 의 빌더 문법 을 이용 하 면 , 객체 간 위상 을 다루 는 코드 를 훨씬 읽 기 쉽 고 효율 적 으로 나타낼 수 있 어 , 나 의 일 을 줄일 수 있 다 . 
 메 서드 가 한 개 만 선언 된 자바 인터페이스 는 Xtend 에서 클로 져 로 취급 되 므로 , 기존 자바 API 들 도 Xtend 에서 새로운 문법 의 장점 을 살려 융합 될 수 있 다 . 
 그러 한 장점 들 을 잘 살린 우수 개발 사례 는 확장 을 통해 , 팀원 들 및 미래 의 나 자신 에게 다시 공급 될 수 있 다 . 
 디펜 던 시 인젝션 등 과 Xtend 의 확장 성 이 혼합 되 면 오픈 엔드 제품 에서 , 커 스터 마이 징 이 가능 한 SOA 를 달성 할 수 있 다 . 
 ↑ 1 . 0 1 . 1 1 . 2 클 로 져 : Xtend / 표현식 문서 의 클 로 져 절 에서 자세히 알 수 있 다 . 
 ↑ 2 . 0 2 . 1 빌더 문법 : Xtend / 표현식 문서 의 빌더 함수 절 에서 자세히 알 수 있 다 . 
 ↑ 묵시 적 파라미터 it : Xtend / 표현식 문서 에서 더 자세히 알아볼 수 있 다 . 
 ↑ 선별 적 인 메 서드 임 포트 가 불 가능 한 이유 : Xtend 의 디스패치 함수 와 같 은 기능 은 여러 메 서드 가 합쳐져 하나 의 추상 화 된 분배 메 서 드 를 생성 한다 . 이런 경우 개별 적 인 메 서드 임포 트 는 혼란 을 가져온다 . 
 ↑ 인 젝 터 : 인 젝 터 란 클라이언트 를 초기 화 하 고 , 클라이언트 가 필요 로 하 는 서비스 를 공급 하 는 임무 를 가진 모듈 이 다 . 디펜 던 시 인젝션 문서 에서 자세히 알 수 있 다 . 
 원본 주소 ‘ http : / / eclipse . or . kr / wiki / % ED % 8 A % B 9 % EC % A 7 % 91 % EA % B 8 % B 0 % EC % 82 % AC : SWT , _ Xtend % EB % A 5 % BC _% EB % A 7 % 8 C % EB % 82 % 98 % EB % 8 B % A 4 ’ 
 분류 : 특집 기사 | Xtend | SWT 	 개인 도구 
 이 문서 는 2015 년 10 월 22 일 ( 목 ) 22 : 11 에 마지막 으로 바뀌 었 습니다 . 
 이 문서 는 3 , 828 번 읽혔 습니다 .