C #의 "정적 방법"은 무엇입니까?


177

정적 키워드를 메소드에 추가 할 때의 의미는 무엇입니까?

public static void doSomething(){
   //Well, do something!
}

static수업에 키워드를 추가 할 수 있습니까 ? 그러면 무슨 의미입니까?


9
class_name.static_method_name ();만으로 해당 클래스의 인스턴스를 작성하지 않고 정적 메소드를 사용할 수 있습니다.
Javed Akram

프로그래밍 수준에서 클래스 / 타입의 인스턴스를 만들지 않고 정적 메서드를 호출 할 수 있다는 느낌이 듭니다. 내부적으로는 그렇지 않습니다 . CLR은 내부적 으로 정적 메서드에 대한 호출을 관리하기 위해 type instance 라는 특수 인스턴스 를 관리합니다. 답변을 참조하십시오 . 너무 흥미 롭습니다.
RBT

답변:


313

static일반 (달리 기능, 예를 ) 함수 클래스의 인스턴스와 관련된 것은 아니다.

static클래스는 포함 할 수있는 클래스입니다static 인스턴스화 할 수 없습니다, 따라서 회원을합니다.

예를 들면 다음과 같습니다.

class SomeClass {
    public int InstanceMethod() { return 1; }
    public static int StaticMethod() { return 42; }
}

를 호출 InstanceMethod하려면 클래스의 인스턴스가 필요합니다.

SomeClass instance = new SomeClass();
instance.InstanceMethod();   //Fine
instance.StaticMethod();     //Won't compile

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine

28
따라서 인스턴스 메소드 대신 클래스 메소드와 비슷합니까?
Moshe

4
@Moshe : 맞습니다. 정적 메소드를 사용하면 메소드를 호출하기 위해 클래스의 인스턴스가 필요하지 않으며 클래스 만 필요합니다.
이진 걱정

3
그러나 실제로 인스턴스에서 정적 메서드를 호출하지 못하게하는 일종의 기술적 제한이 있습니까? 컴파일러가 허용한다면 액세스가 가능한 위험은 무엇입니까?
kroonwijk

2
@kroon : 이해가되지 않습니다. 인스턴스 메소드는 실제로 인스턴스를 숨겨진 첫 번째 매개 변수로 사용합니다. 정적 메소드는 그렇지 않습니다. 내 블로그 게시물을 참조하십시오 : blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks

여기서 "StaticMethod"는 클래스 메소드이고 "InstanceMethod"는 클래스 SomeClass의 인스턴스 메소드입니다
Usman Younas

26

다른 관점에서 : 단일 문자열을 일부 변경하려고합니다. 예를 들어 글자를 대문자 등으로 만들려고합니다. 이러한 작업을 위해 "도구"라는 다른 클래스를 만듭니다. 해당 클래스 내에 사용 가능한 엔티티 유형이 없기 때문에 "도구"클래스의 인스턴스를 작성한다는 의미는 없습니다 ( "개인"또는 "교사"클래스와 비교). 따라서 인스턴스를 만들지 않고 "도구"클래스를 사용하기 위해 정적 키워드를 사용하며 클래스 이름 다음에 점 ( "도구")을 누르면 원하는 메소드에 액세스 할 수 있습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Tools.ToUpperCase("Behnoud Sherafati"));
        Console.ReadKey();
    }
}

public static class Tools
{
    public static string ToUpperCase(string str)
    {
        return str.ToUpper();

    }
}
}

1
"문자열 변경"을 사용하는 것은 좋지 않은 예입니다. 문자열은 변경할 수 없으며 변경할 수 없습니다. 그러나 그렇지 않으면 설명이 의미가 있습니다 (불변의 문자열을 문자열로 대체)
Flydog57

13

클래스의 인스턴스가 생성되지 않은 경우에도 클래스에서 정적 메서드, 필드, 속성 또는 이벤트를 호출 할 수 있습니다. 클래스의 인스턴스가 작성되면 정적 멤버에 액세스하는 데 사용할 수 없습니다. 정적 필드 및 이벤트의 사본은 하나만 존재하며 정적 메소드 및 특성은 정적 필드 및 정적 이벤트에만 액세스 할 수 있습니다. 정적 멤버는 종종 객체 상태에 따라 변하지 않는 데이터 또는 계산을 나타내는 데 사용됩니다. 예를 들어, 수학 라이브러리에는 사인 및 코사인을 계산하기위한 정적 메서드가 포함될 수 있습니다. 정적 클래스 멤버는 membe의 리턴 유형 전에 static 키워드를 사용하여 선언됩니다.


5

정적 함수는 클래스 (클래스의 특정 인스턴스가 아니라 클래스 자체)와 연관되어 있으며 클래스 인스턴스가없는 경우에도 호출 할 수 있음을 의미합니다.

정적 클래스는 클래스에 정적 멤버 만 포함됨을 의미합니다.


5

곧 정적 클래스를 인스턴스화 할 수 없습니다 : 예 :

static class myStaticClass
{
    public static void someFunction()
    { /* */ }
}

다음과 같이 만들 수 없습니다 :

myStaticClass msc = new myStaticClass();  // it will cause an error

당신은 만들 수 있습니다 :

myStaticClass.someFunction();

0

"정적"키워드를 메소드에 추가하면 기본 구현이 클래스의 모든 인스턴스에 대해 동일한 결과를 제공한다는 것을 의미합니다. 말할 필요도없이, 결과는 매개 변수 값의 변화에 ​​따라 달라집니다


-1

정적 변수는 클래스의 객체와 연결되지 않습니다. 클래스 이름을 사용하여 액세스 할 수 있습니다. 클래스의 모든 객체는 정적 변수를 공유합니다.

기능을 정적으로 만들면 해당 파일 내에서 해당 기능의 액세스가 제한됩니다.


-1

모든 호출에 대해 공유 되는이 RAM (메소드 / 변수 / 클래스) 에서 하나의 사본 만 가질 정적 키워드의 핵심


-8

정적 키워드는 클래스에 적용될 때 컴파일러에게 해당 클래스의 단일 인스턴스를 작성하도록 지시합니다. 그런 다음 클래스의 하나 이상의 인스턴스를 '새로'만들 수 없습니다. 정적 클래스의 모든 메소드 자체는 정적으로 선언되어야합니다.

정적이 아닌 클래스의 정적 메소드를 갖는 것이 가능하며 종종 바람직합니다. 예를 들어 다른 클래스의 인스턴스를 만들 때 팩토리 메소드는 종종 static으로 선언됩니다. 이는 factor 메소드를 포함하는 클래스의 특정 인스턴스가 필요하지 않음을 의미합니다.

언제 어디서 언제 MSDN을 볼 수 있는지에 대한 자세한 설명


8
아니요, 정적 클래스는 인스턴스화 되지 않습니다 . 그 안에 모든 것이 정적 인 이유가 있다면 왜 그것을 인스턴스화하고 싶습니까?
Jon Skeet

1
static클래스는 전혀 인스턴스가 없습니다.
SLaks

4
죄송합니다, 이해가 안됩니다 ... 단일 인스턴스가 생성되어 새 인스턴스를 만들 수 없다고 말했습니다. 확실히 하나의 정적 인스턴스가 생성되면 코드를 호출 할 수 없습니까?
Dave Arkley

2
정적 클래스에는 인스턴스가 있으며 실제로 두 개는 theType의 인스턴스가 아닙니다. 정적 클래스는 힙에 [Foo] Type 개체 (JIT의 메서드 조회 테이블 등) 및 초기화에 사용되는 특수 System.Type 개체로 존재합니다.
mccainz

클래스는 정적 멤버로만 포함되어 있음을 나타내는 static으로 선언 될 수 있습니다. new 키워드를 사용하여 정적 클래스의 인스턴스를 작성할 수 없습니다. 정적 클래스는 클래스가 포함 된 프로그램 또는 네임 스페이스가로드 될 때 .NET Framework CLR (공용 언어 런타임)에 의해 자동으로로드됩니다.
Satheesh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.