자바와 C#에서의 동일한 작동을 코드로 알아 볼께요.~~~

우선 C#
using System;
using System.Reflection;
class App
{
    static void Main(string[] args)
    {
        App pr = new App();
        Type type = pr.GetType();
        MethodInfo method = type.GetMethod("Sum");
        if (method != null)
        {
            Console.WriteLine(method.ToString());
            Console.WriteLine(method.Invoke(null, new object[] { 1, 2 }));
        }
    }
    public static int Sum(int i,int j)
    {
        return i+j;
    }
}



 

결과
Int32 Sum(Int32, Int32)
3


 

JAVA
import java.lang.reflect.Method;
public class methodInvoke
{
 public static void main(String[] args)
 {
  Method methods[] = methodInvoke.class.getDeclaredMethods();
  for (int i = 0; i < methods.length; i++)
  {
   if (methods[i].toString().equals("public static int methodInvoke.Sum(int,int)"))
   {
    Integer x = new Integer(1);
    Integer y = new Integer(2);
    try
    {
     System.out.println(methods[i].toString());
     System.out.println("1 + 2의 값--");
     System.out.println(methods[i].invoke(null, new Object[] {x,y}));
    }
    catch(Exception e)
    {
        System.out.println(e.getMessage());
    }
   }
  }
 }
 public static int Sum(int x, int y)
 {
  return x + y;
 }
}



 

결과
public static int methodInvoke.Sum(int,int)
1 + 2의 값--
3


일단 중요했던 점은 자바 코드 작성시 예외처리를 아예 빼고 invoke를 사용하게 된다면 실행이 되지 않았다. ㅡ.ㅡ; 뭐 이건 이클립스로 실행한게 아니라 J#으로 했기에 정확하지 않을 수도 있지 않을까?? ^^;; 그리고 나머지 메소드들도 나오지 않아 딱맞는 메서드를 메서드 명으로 찾았다.

일단 대충 같은 결과에서 본 시점은 C#코드가 더 간단하다는 점이다. 특정 만든 클래스에서 Type을 받고 거기에서 특정 함수를 찾기도 쉽고, 실행도 보다 편리 하다는점. 아무래도 자바가 나온 뒤에 C#이 나왔으니 어쩔수 없나? 아님 내가 자바를 많이 모르니 더 쉬운 방법을 못찾을수도 있었을 것이다.

내가 이 invoke를 이번에 다루는 이유는 내가 지금 보는 소스에서 본 내용이기에 써보았다. ^^ 특정 조건에 따라 함수를 실행 하게 되는데 기존에는 실행 함수중에서 조건 값을 가지고 if else if else ~~ 로 분기를 하였으나, xml문서로 조건 값들에 대한 메서드를 설정하고 if else if 를 사용하지 않고 조건에 맞는 문자열을 찾아 method에 값을 받고 invoke한다. 음..  이 방식이 그렇게 빠른가? 솔직히 잘 모르겠다. 그냥 대충 if else if else 로 구별 해도 상관 없지 않을까? 하는 생각이 들기도 했지만.

앞으로 좌절금지 열심히 아자아자다!!

Trackback url :: http://hahakbs.dothost.co.kr/trackback/75

댓글을 달아 주세요

  1. 이 글을 읽고 구글에서 java invoke로 검색을 해 보았습니다.
    http://home.tiscali.nl/~bmc88/java/sbook/056.html 저 글대로 하고 hello로
    명령줄 인수를 넘겨 주니 hello메소드가 호출 되더군요.
    (J#으로 해서 Sun자바에서도 공통인지 모르겠네요 ;;)
    C#과 소스 복잡도가 같다고 봐도 될것 같습니다.
    (파라메터가 있는 경우는 말이 달라지네요. Class[] 변수를 하나 더 만들어야 되니까요.)
    (더욱 간략한 MSDN에서도요. Integer.class로 간단하게 되긴 하지만요.)

    저 예제에서 특별하게 if문으로 검사하지 않고 바로바로 메소드 쓰는 이유가
    함수에 thows로 지정하지 않은 Exception은 반드시 try..catch를 써야하니
    if문으로 예외를 검사하지 않은것 같네요.
    (C#도 마찬가지겠네요 ^^;)

    눈팅만 하다가 재미있는 글을 보고 댓글을 남깁니다~

    덧1. 이클립스에서 하니 Integer로 하지 않고 C#처럼 int로 해도 잘 되네요 ;;
    덧2. J#과 Sun Java와는 다르긴 다른가봅니다 ;;

    • 오~~~~~~ 반가워요 ^^;
      아무리 제블로그지만 저랑 제 친구 둘이만 놀기 심심했거든요~~
      앞으로 자주 댓글좀 남겨주세요 ~~~~ ㅎㅎ

      일단 제가 J#으로 했을때 컴파일 자체를 비주얼스튜디오 자체에서 하는 것이 자체 컴파일러를 쓴다고 생각해서 아무리 J#이라도 JAVA 규격을 정확히 구현을 안해 놨을거라 생각하고 있었어요 ^^
      예전에도 자바문법 그대로 J#해봤는데 안되던게 있었구요.

      그리고 비교를 하기 위해서 invoke를 테스트 해봤는데 솔직히 C#에서는 그렇게 따로 뺄 필요는 구지 없는것 같아요.
      delegate 이놈을 이용하면 Method의 invoke를 사용하는것보다는 괜찮을것 같습니다.

    • 그러고 보니 delegate는 C에서 처럼 함수를 포인터 같이 넘기는 것 같은데요 ㅎ;;

      invoke는 어떻게 다른지 모르겠네요..;
      비동기 함수 호출이라고 들은것 같은데 정확히 모르겠네요 ㅎ;
      그리고 J#프로젝트를 컴파일 하니 exe파일로 나온 다는 것에 경악하였습니다 -0-;;
      닷넷은 결국 닷넷일 뿐 본레의 언어는 뭔가 이상하게 변한것 같습니다 ;;

      덧.
      오늘 아침 다시 시도 해 본 결과... 타협점을 찾은 듯 합니다. ;;;
      new Class[] { int.class, int.class }는 그대로 쓰고 함수는 public void hello(int a, int b)로 쓰되..
      invoke(_invoke_test, new Object[] { new Integer(1), new Integer(2) }) 저렇게 하는 것 입니다... OTL
      invoke에서도 상위 클레스가 하위 클레스로 변환 되네요 ㅎ.... OTL

    • 더이상 파고 들면 제실력 금방 뽀록 나여 ~~ @.@
      어차피 들통 난건지도 모르지만...

      어째던 결론은 반갑고요~~
      앞으로 자주 댓글좀 남겨 주세요 ^^

  2. 오 병수~~
    스페셜 손님 방문~~ ㅎㅎ

  3. 스페셜 ;;;

    http://iiasuraii.byus.net/file/link/Invoke.java J#에선 안되지만 Sun Java에선 되는 것 입니다 ;;;

    • 퇴근 하고 와서 코멘트가 늦습니다. ^^
      자바 내공을 쌓아야 하는데 .....;;
      바이블 하나 사야겠어요. ㅋㅋㅋ

      그렇다고 C# 잘한다는말은 아니에요~~

    • C#하고 Java를 보니 거의 비슷해서 동시에 파고 들 수 있을것 같네요 ㅎㅎ;
      삽질이 내공 쌓기의 최고의 지름길 같아요 ;;;


div>