Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

메타 프로그래밍에 대해서...

190 views
Skip to first unread message

AlexK

unread,
Jun 29, 2010, 11:47:36 PM6/29/10
to 한국 Groovy & Grails 사용자 그룹
groovy같은 언어들은 메타 프로그래밍 기능을 제공하잖아요.

java나 c++만 사용하던 사람이 얼핏 보기에 장점은
- 신기하다 ;;;
- 코딩을 줄여준다.
- 위의 이유로 인해서 소스 보기가 편하다.

정도로 보이는데요.

뭔가 결정적인 잇점이 있을까요?

Sungchul Park

unread,
Jun 29, 2010, 11:52:54 PM6/29/10
to kg...@googlegroups.com
반문을 하는 게 죄송스럽지만 말씀하신 메타 프로그래밍 기능이라는 게 어
떤 것을 말씀하시는지요.
제 질문의 의도는 반대하려는 게 아니고 구체적으로 어떤 기능을 두고 말씀하
시는지 궁금해서요. "메타 프로그래밍"이란 단어를 어떤 뜻으로 사용하신 것
인지도 알고 싶고요.

자바에서도 애노테이션 같은 메타 프로그래밍 기능이 있고 개인적으로 자바
언어 차원의 지원은 약하지만 아키텍쳐적으로 메타프로그래밍이 가능하다고
생각합니다. 자바라는 언어가 원래 언어는 단순하게 유지하고 객체지향 설계
와 아키택쳐를 통해 문제를 해결하자는 철학을 가졌다고 봅니다.

10. 6. 30. 오후 12:47, AlexK 쓴 글:

Sukmin Kim

unread,
Jun 30, 2010, 12:04:02 AM6/30/10
to kg...@googlegroups.com
아 제가 말씀드린건, 동적인 메쏘드 추가 삭제 같은

a.metaClass.newPrint = { ->
println 'hi'
}

이런 식으로 메쏘드를 동적으로 추가 삭제 하는 것을 생각하고 말씀 드린
겁니다.

category, closure 도 메타 프로그래밍의 범주에 속하는 것 같은데, 정확히는 잘
모르겠습니다.

사실 정확한 메타 프로그래밍의 정의는 잘 모르겠어요. ^^;;;
--
"한국 Groovy & Grails 사용자 그룹" 에 가입하셨기에 이 메시지를 보내드립니다
이 그룹에 게시하려면 다음 주소로 이메일을 보내주십시오.
KG...@googlegroups.com
이 그룹에서 탈퇴하시려면 다음으로 이메일을 보내주십시오.
KGGUG+un...@googlegroups.com
추가 옵션을 보려면 http://groups.google.com/group/KGGUG?hl=ko의 그룹을
방문하세요.

Sukmin Kim

unread,
Jun 30, 2010, 12:12:58 AM6/30/10
to kg...@googlegroups.com
제가 밥 먹기 전에 질문을 올리고 돌아와서 다시 읽어보니, 참 답변하기 어렵게
적어 놨네요.
뭘 물어보는지도 애매하고 ;;;

제가 하려는 질문을 다시 정리해 볼께요.

1. 제가 생각하는 메타 프로그래밍은 개발 당시에 이미 정해 놓지 않는 것들에
대해서 실행중에도 수정,추가,삭제등이 가능 한 것입니다.
- 이 정의가 맞는지 궁금하구요.

2. 1번이 맞다고 하면, 아래와 같은 방식으로 사용하는 것을 생각해 봤는데

void main(){
//뒤에 클로져 안에는 상황에 따라 다른 코드가 들어갈 수 있다고 하면,
//회원에 따라 처리해야할 메쏘드를 외부로 빼서 관리 할 수도 있을 것
같구요.
member.metaClass.action = { -> println 'member method executed'; }

//결과 : 'member method executed'
meber.action();
}

- 위의 경우 java 에서는 interface + anonymous class 로 조합할 수 있을것
같은데, 위의 경우는 java 잘 쓰는 사람이면 'java로도 되!'라고 할 것 같구요.

- 다른 예로 없는 메쏘드를 추가하는 경우(ruby의 ActiveRecord같이)는,
신기하긴 한데, 그런 것의 사용 예가 어떤게 있을까요?
-> 위의 경우 없는 메쏘드인 action을 추가했는데, 이런것들이 실전에서
획기적인 편의성을 제공하는 예가 있을까요?



-----Original Message-----
From: kg...@googlegroups.com [mailto:kg...@googlegroups.com] On Behalf Of

ENOCH KIM

unread,
Jun 29, 2010, 11:58:58 PM6/29/10
to kg...@googlegroups.com, uki...@gmail.com
갑자기 메일이 와서, 갑자기 질문을 받으니,
회신을 해야 되는지 고민하다가 일단 회신을 드리겠습니다.
 
AlexK님께서 생각하시는 장점을 먼저 분석해보기로 하겠습니다.
1.신기하다 ;;;
2.코딩을 줄여준다.
3.위의 이유로 인해서 소스 보기가 편하다.
 
1.신기하다는 주관적인 생각이니, 언급하지 않겠습니다.
2.코딩을 줄여준다.  아주 큰 의미를 가집니다. 생산성, 돈, 비즈니스와 연관시켜보세요.
3.위의 이유로 인해서 소스 보기가 편하다. 유지보수 비용이 절감됩니다.
 
그럼, 수고하세요.
 
2010/6/30 AlexK <uki...@gmail.com>

Sewon Ann

unread,
Jun 30, 2010, 3:34:33 AM6/30/10
to kg...@googlegroups.com
2번에서 코딩은 줄여주지만 유지보수 차원에서 이해가 어려워지면 오히려 비즈니스 차원에서 더 나쁘지 않을까요.

3번의 경우도, 물론 짧은 코드가 장황한 코드보다 한눈에 들어오기 쉽지만 암호화 되어 버리면 문제가 있을 것 같아요.

"잘 쓰면" 말씀하신 장점들의 덕을 크게 볼 수 있으나, "잘 못 쓰면" 오히려 이해에 짐이 되고 오류의 주범이 되지 않을까 조심스레 생각해 봅니다.

2010/6/30 ENOCH KIM <ken...@gmail.com>

Sungchul Park

unread,
Jun 30, 2010, 4:07:41 AM6/30/10
to kg...@googlegroups.com

> 1. 제가 생각하는 메타 프로그래밍은 개발 당시에 이미 정해 놓지 않는 것들에
> 대해서 실행중에도 수정,추가,삭제등이 가능 한 것입니다.
> - 이 정의가 맞는지 궁금하구요.
>
저도 메타 프로그래밍에 대해 깊이 있게 알지는 못하고 그냥 하도 말을 많이
들어서 위키 백과에서 찾아 본 수준 입니다.
http://en.wikipedia.org/wiki/Metaprogramming
지금 다시 읽어보니 밑에 See Also 부분이 메타 프로그래밍으로 부르는 기법
들 같네요. 다양하군요.

> 2. 1번이 맞다고 하면, 아래와 같은 방식으로 사용하는 것을 생각해 봤는데
>
> void main(){
> //뒤에 클로져 안에는 상황에 따라 다른 코드가 들어갈 수 있다고 하면,
> //회원에 따라 처리해야할 메쏘드를 외부로 빼서 관리 할 수도 있을 것
> 같구요.
> member.metaClass.action = { -> println 'member method executed'; }
>
> //결과 : 'member method executed'
> meber.action();
> }
>
> - 위의 경우 java 에서는 interface + anonymous class 로 조합할 수 있을것
> 같은데, 위의 경우는 java 잘 쓰는 사람이면 'java로도 되!'라고 할 것 같구요.

동적으로 메서드를 추가하는 거라면 동적 프록시 기법을 쓰더라도 최소한 인
터페이스는 미리 만들어놔야겠죠. 어짜피 자바는 정적 타입 언어이니 너무나
당연한 조건이겠지만...


> - 다른 예로 없는 메쏘드를 추가하는 경우(ruby의 ActiveRecord같이)는, 신기하긴 한데, 그런 것의 사용 예가 어떤게 있을까요?
> -> 위의 경우 없는 메쏘드인 action을 추가했는데, 이런것들이 실전에서 획기적인 편의성을 제공하는 예가 있을까요?

저는 너무 자바적인 생각을 해서 그런지 클래스에 동적으로 메서드를 추가해
서 전역적인 영향을 주는 행위는 조금 조심스럽습니다. 특정 영역에서만 추가
된 메서드가 효과를 발휘하도록 하는 장치가 있으면 좋겠지만 제가 아직 그루
비를 깊이 공부하지 않아서 그런지 못 찾았네요.
그리고 메서드 추가야 그렇다고치고 동적 메서드 오버라이딩은 LSP 원칙을 위
배할 가능성이 너무 높아 보입니다. 그 객체 다른 곳에서는 절대 예상 못한
용도로 사용되지 않는다는 보장이 있을 때만 이런 메타프로그래밍 기법을 제
한적으로 써야하지 않나 싶습니다.
잘못하다가는 마치 goto문이 편하니 다시 도입하자고 말하는 것과 비슷한 상
황이 생기지 않을지 걱정되네요.
역시 전 비관적인가 봅니다.

drypot

unread,
Jul 4, 2010, 12:44:09 PM7/4/10
to 한국 Groovy & Grails 사용자 그룹
첨엔 좋아보이는데요,
다이나믹 언어들의 이런 타입을 엉클어트리는 기능은 써보니 재앙에 가깝습니다.

회로 구성하기 귀찮다고 전선 가져다가 이리 저리 합선시키는 것과 같아서,
자신이 만든 코드도 일주일 지나면 관리하기가 어려워집니다.

컴파일러가 문법 오류를 찾아주지 못하고,
IDE 에서 코드 어시스트도 해주지 못합니다.

루비스트들은 이런 문제를 테스트케이스로 해결하면 된다고 하는데,
이런 것은 기계가 검사하는 것이 (컴파일시에) 적절하다고 생각합니다.

위와 같이 덜 복잡하게 코딩하는 다이나믹 언어들이 각광을 받기 시작한 것은
Java 가 장황하고 쓰기 불편했기 때문이지
스터틱 언어 방식 자체에 문제가 있었던 것이 아닙니다.

Scala 쓰시면 타입 체킹 모두 하면서
Java 보다 훨신 간출하게 코딩하실 수 있습니다.

*
http://twitter.com/drypot

sungchul park

unread,
Jul 4, 2010, 10:48:26 PM7/4/10
to kg...@googlegroups.com
적절한 평가를 하셨다고 생각합니다.
동적 타입이 유용한 영역이 있겠지만 일반적으로는 스칼라의 타입추론이 가장 균형잡힌 대안이라고 생각합니다.
다만 아직 IDE 지원이 부족해서 정적타입의 장점을 충분히 살리지 못하고 있지만 곧 나아지리라 생각합니다.


나의 iPhone에서 보내고 싶음

2010. 7. 5. 오전 1:44 drypot <dry...@gmail.com> 작성:

Alex Kim

unread,
Jul 6, 2010, 10:07:28 PM7/6/10
to kg...@googlegroups.com
다행입니다.
저도 비슷한 생각을 가지고 있었거든요. 잠깐 편하다고 썼다가 뒷날의 재앙의 씨앗을 심는...

좀 참신한 개념인데, 쓰기에 애매하다고 생각해서 여쭤본건데, 말씀하신대로 활용하기에는 어려움이 좀 있을것 같아요.

답변 감사드립니다.


2010년 7월 5일 오전 11:48, sungchul park <gyu...@gmail.com>님의 말:

snaegl choi

unread,
Jul 2, 2012, 8:40:48 PM7/2/12
to KG...@googlegroups.com
메타프로그래밍이기 보다는 람다식이나 functor를 사용한 anonymous function을 사용하는 것이죠.

이러한 anonymous function 기능을 사용하게 되면
임의적으로 코드를 추가할 수 있어서
코딩 당시에는 생산성이 일시적으로 향상되지만
결국 디버깅이 어려워지고 중복코드가 많아져서 생산성/성능 하락의 원인이 되죠.
그래서 프로토타이핑이나 긴급 코딩 시에 추가할 때 주로 쓰고
추후에 리팩토링을 통해 모듈화, 클래스화, 인터페이스화를 거치는 과정이 필요합니다.

참고로 C++에서도 anonymous function의 경우 fuctor나 C++0x의 lambda를 통해 지원하고 있고
메타 프로그래밍은 C++에서 template을 통해 지원하고 있습니다.
또한 Java에서는 진작에 anonymous class를 통해 지원하고 있었고 추후 lambda 식을 지원할 예정이죠.

2010년 6월 30일 수요일 오후 12시 47분 36초 UTC+9, 김석민 님의 말:

Sungchul Park

unread,
Jul 2, 2012, 10:07:48 PM7/2/12
to kg...@googlegroups.com
아마 그루비에서 메타프로그래밍이라고 하면 고차함수와 람다식 보다 메타 클래스를 사용한 기법을 의미할 것 같네요.
그런데 메타프로그래밍을 사용하면 소스가 보기 편해지나요?
개인적으로 어디서 추가된 메소드인지 몰라 당황했던 일이 많아서...
물론 전체 구조를 잘 알고 있다면 안 그렇겠지만 과다한 메타프로그래밍의 남발도 문제라고 생각합니다.

참고로 자바도 메타프로그래밍을 전혀 활용 안하는 건 아니죠.
스프링의 XML을 사용한 빈 설정도 일종의 메타프로그래밍이고...
동적 바이트코드 변환/생성으로 이런 저런 일을 할 수 있으니까요.

물론 Lisp 같은 언어에서 활용하는 수준에 비하면 명함을 내 밀기 힘들겠죠.
그래서 자바에선 프레임워크가 발달한 것 같습니다.


12. 7. 3. 오전 9:40, snaegl choi 쓴 글:
--
Reply all
Reply to author
Forward
0 new messages