class static 함수란?

compactor의 이미지

class static 함수의 의미를 메모리 관점에서 알고 싶습니다.

c에서의 static 함수는 함수의 범위를 파일내로 제한하는것을 의미하며
class static 함수는 정확히 무엇을 의미하는지요?

저는 class 내 stiatc 함수를 public으로 선언한후, 타 클래스에서 레퍼런스 없이 class내 public variable/function을 접근하는데 사용하였는데

타 소스를 확인해보니, private static 함수도 보입니다.

짧게나마 ?최적화를 위해서 사용했다는데, 정확한 이유를 알고 싶습니다.

dormael의 이미지

private static은 아마 메모리를 절약하거나 서로 다른 인스턴스에서 공통 접근 가능이 필요할때 쓰는게 아닐까 싶습니다.

그런데 자바에 대해서 물어보신건가요? 전 그걸 기준으로 답변 드리겠습니다.

클래스 인스턴스는 각각 다른 메모리를 가지고 있는 상황에서 static한 필드나 메서드는 공용으로 쉽게 말하면 공유메모리와 같은 역할을 하게 되니까요.

물론 그에 따른 위험성도 존재 하겠지만 그렇게 쓰는 이유가 있겠죠. 설계의 관점에서.

속도의 측면에선 테스트를 안해봐서 잘 모르지만 큰 차이는 없을것 같네요. 오히려 final로 정의된게 속도에선 낫다는 이야기가 있으니까요.

만일 다른 객체지향 언어를 말씀하시는 거라면 거기에도 적용이 되는건지는 잘 모르겠네요. ㅡㅡㅋ

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

pynoos의 이미지

class 내의 static 함수는 그것이 private, public, protected 상관없이 숨어서 넘어가는 this pointer를 전달하지 말도록하는 것입니다.

그렇기 때문에 static member function 은 static 아닌 멤버 변수나 함수를 호출 할 수가 없습니다. 대신, 일반적인 c 의 callback 함수로 넘길때 유용하게 사용됩니다.

theuhm의 이미지

C++을 기준으로 설명을 해 드리자면, (Java도 동일합니다)
클래스의 static member function은 개념적으로는 클래스의 static data member에만 접근 가능한 멤버함수임을 나타냅니다.
즉, 객체별로 설정되는 non-static data member에는 접근이 불가능합니다. non-static data member에 접근할 수 있으면 안되므로 당연히 this포인터(자바의 경우는 this 리퍼런스)를 static member function에서는 사용할 수 업습니다. 즉, 멤버함수의 인자로 this포인터가 넘어오질 않습니다.
따라서 일반적인 멤버함수보다는 인자 한개가 줄어드는 효과가 발생하여 빈번하게 호출되는 함수라면 약간의 성능향상이 있을 수 있습니다. 클래스 스코프에 들어가야 하는 순수함수(pure function) 즉, 내부상태를 가지지 않는, 입력값에 의해서만 출력이 결정되는 함수라면 static 멤버함수로 설계하는 것이 좋죠.

또한 static member function은 오버라이딩 불가합니다. this포인터가 넘어오질 않으므로 객체에 따라 다르게 설정되는 가상함수 테이블 역시 사용불가능하며, 결국 static member function은 컴파일타임에 정적으로 바인딩되게 됩니다. (결국 static member function은 virtual 함수가 될 수 없는 결과를 가져오지요)

..

dormael의 이미지

theuhm wrote:
따라서 일반적인 멤버함수보다는 인자 한개가 줄어드는 효과가 발생하여 빈번하게 호출되는 함수라면 약간의 성능향상이 있을 수 있습니다. 클래스 스코프에 들어가야 하는 순수함수(pure function) 즉, 내부상태를 가지지 않는, 입력값에 의해서만 출력이 결정되는 함수라면 static 멤버함수로 설계하는 것이 좋죠.

앗 생각 못해봤는데 그런 경우엔 정말 퍼포먼스에 영향을 미치겠네요. ^^
자바 위주로 개발해서 함수 호출까지는 생각을 못했었습니다.

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

akbar의 이미지

theuhm wrote:
C++을 기준으로 설명을 해 드리자면, (Java도 동일합니다)따라서 일반적인 멤버함수보다는 인자 한개가 줄어드는 효과가 발생하여 빈번하게 호출되는 함수라면 약간의 성능향상이 있을 수 있습니다.

꼭 정적멤버함수만이 아니고 객체지향적으로 잘 설계된 클래스라면 C 언어에서처럼 함수의 인수로 데이타를 전달받는 것이 아니고 클래스의 멤버에 직접 접근하여 데이타를 가져올 수 있으므로 성능향상이 있게됩니다.

theuhm wrote:

또한 static member function은 오버라이딩 불가합니다. this포인터가 넘어오질 않으므로 객체에 따라 다르게 설정되는 가상함수 테이블 역시 사용불가능하며, 결국 static member function은 컴파일타임에 정적으로 바인딩되게 됩니다. (결국 static member function은 virtual 함수가 될 수 없는 결과를 가져오지요)

정적 멤버 함수에 가상함수 적용은 안되지만 오버라이딩 및 오버로딩 모두 자유롭게 할 수 있습니다. (C++ 기준)

kleinstein의 이미지

한가지 더 궁금한게 있습니다.

non static class 안에 있는 어떤 static member function 이 있다고 할때..

class A
{
  static void funcB()
  {
     int k = 0;
  };
}

이런 static member function 안에 있는 non-static 지역변수 k 는 heap 에 저장되는 건가요? 아니면 stack 에 저장되는 건가요?

또 그렇다면 k 는 Thread Safe 일까요, 아닐까요?

Scarecrow의 이미지

static member function은 class method
non-static member function은 instance method
라고 생각하면 될 것 같습니다.

시지프스의 이미지

스태틱 함수는 객체(?) 없이 호출할 수 있습니다.
용어의 혼돈이 오네요. 객체라고 하면 맞는지... 인스턴스인가...

아무튼,
class A
{
public:
static f() {}
};

int main()
{
A::f();
}
가 가능했던것 같습니다. 스태틱 멤버와 같죠(?).
객체가 없으니 당연히 static member variable이 아닌 member variable에 접근이 불가능하고요.
객체가 없으니 this pointer를 넘기려 해도 넘길 것도 없겠네요.
혹시 A x; x.f();를 쓴다하더라도 x는 무시되고 그냥 A::f()와 같을 거에요.

Private static function이라면 멤버 함수 내에서만 호출 가능하고, 위에서 설명한 내용은 똑같이 적용될 거 같네요.

그리고 static function내의 일반 변수는 호출시마다 stack에 저장될 것 같습니다.

혹시 틀린 부분이 있으면 저에게도 가르침을 주세요.

열심히 댓글을 달고 날짜를 보니 옛날 글이네요.
죄송합니다. 저도 낚...아니 착각했습니다.

begin{signature}
THIS IS SPARTA!!!!!n.
end{signature}

Scarecrow의 이미지

ㅜ.ㅠ

Quote:
열심히 댓글을 달고 날짜를 보니 옛날 글이네요.
죄송합니다. 저도 낚...아니 착각했습니다.

mumbi의 이미지

어디에서의 변수든 지역 변수는 스택에 저장됩니다 ~

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.