[완료]자바에서 포인트로 사용할수 있는게 있을까요?

anaud2의 이미지

안녕하세요 KLDP에서 많은 도움을 받는 초보자입니다.

제가 c로짠 소스를 자바로 포팅을 하려고 하는데요.
구조가 대충

int auth(char *ID ,char *PC, int Timeout,char *OUTMG)
{
}

이렇게 있는데요
자바에서는 포인트가 없다고 알고 있습니다.
문제가 되는 부분이 PC같은 경우 할당이 되었다가 변경이 되고 OUTMG같은경우는 메세지가 들어가게 됩니다.
int로 결과 코드값도 들어가야 하는데

java에 포인트가 없는데 이런 함수를 구현하면 어케 되야할까요?
하나가 아웃이 된다면야...return 으로 하겠는데..3개가 리턴이 되니까 어케 해야할까요?

전설의레전드의 이미지

정석적인 방법은 3개의 결과값을 Collection에 담아서 Collection을 리턴하는 방법입니다. (자바에서 컬렉션의 종류는 매우 다양합니다. APIs를 참고하시고 필요하신 컬렉션을 사용하시면 되겠습니다.)

예를 들면,
Collection auth(String ID, String PC, int Timeout, String OUTMG) {
Collection col = new ArrayList();
col.add(PC);
col.add(OUTMG);
col.add(new Integer(returnValue));
return col;
}

이와 같은 형태가 되겠네요.

위와 같은 방법이 정석이겠습니다만, 특정 상황으로 인해 call by reference를 해야만 하는 상황이라면 인자로 인스턴스의 레퍼런스값을 넘김으로써 call by reference 효과를 볼 수도 있습니다. (제 경험상 call by reference를 해야할 경우는 거의 없다고 생각되네요. call by reference를 하면 오히려 소스 가독성만 떨어트리고 유지보수를 어렵게 하는데 일조한다고 생각합니다.)

자바는 기본적으로 모든 인자를 call by value로 전달합니다. 그런데, 자바는 OOP 언어로 당연히 객체를 인자로 넘기는게 가능하죠.
객체를 인자로 넘긴다는 말은 객체자체가 전달되는 것이 아니라 레퍼런스값을 인자로 전달한다는 의미입니다.

예를 들면,
int auth(Collection param, int Timeout) {
Timeout = 1000;
param.add(PC);
param.add(OUTMG);
param = new ArrayList();
return 1;
}
이와 같은 경우, "Timeout = 1000"은 call by value의 특성상 무시 되죠.
"param.add(PC);"와 "param.add(OUTMG);"는 대입 연산이 아닌 도트 연산자라는 걸 유념해야 합니다.
auth 메소드에서의 param은 auth 메소드를 호출한 곳에서의 Collection 객체의 레퍼런스값입니다. (C의 표현되로라면 Stack의 주소와 유사합니다.)
즉, "param.add(PC);"는 auth의 내부에 존재하는 Stack이 아니라 auth를 호출한 곳에서의 Stack에 있는 Collection의 add 메소드를 호출하게 되는 것입니다.
그리고 "param = new ArrayList();"는 대입 연산자기 때문에 당연히 auth 내부 Stack에 존재하는 param에 new ArrayList()를 대입한 것이죠.
auth 메소드가 종료하는 시점에서 auth 내부 Stack은 사라지기 때문에 call by value의 특성상 auth 호출지에서 이는 무시됩니다.

일단, 제가 드리고 싶은 말은 이왕 자바를 시작하셨다면 자바에서 요구하는 정석으로 코딩하는 것을 권장해드리고 싶네요.
자바가 모든 인자를 call by value 처리하는 이유가 C에서의 포인트가 소스를 너무 복잡하게 만들기 때문인데 자바를 굳이 C 처럼 코딩할 필요는 없겠지요.

wishforyou의 이미지

꼭 3개의 값을 리턴해야 한다면 C의 구조체를 쓰듯이 별도의 데이터클래스를 만들어 쓰시면 될 듯합니다.
C에서도 종종 이런 방법을 썼던것 같습니다. C에서 구조체 포인터를 리턴할때와 비슷합니다.

또 다른 방법으로는 역시 데이터클래스를 사용하는데 그 데이터클래스의 객체(참조)를 auth메소드에 넘겨서 auth메소드가 이 객체에 값을 설정하는 것입니다. 제 생각에 C 포인터 스타일을 흉내내는데에는 이 방법이 비슷할 것 같습니다.

retti의 이미지

자신이 부지런한 사람이라고 생각된다면 데이터 클래스를..
게으르다고 생각된다면 컬렉션..
모험을 좋아하신다면 (-.-) System.arraycopy 를 ^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.