programing

평신도 용어로 "static"은 Java에서 무엇을 의미합니까?

javaba 2023. 1. 19. 21:11
반응형

평신도 용어로 "static"은 Java에서 무엇을 의미합니까?

Wikipedia에서 몇 가지 정의를 듣고 찾아봤지만, Java를 처음 접하는 사람으로서 어떤 의미인지 아직 잘 모르겠습니다.자바에 능통한 사람?

static은 그렇게 표시된 변수 또는 메서드를 클래스 수준에서 사용할 수 있음을 의미합니다.즉, 클래스에 액세스하기 위해 클래스의 인스턴스를 만들 필요가 없습니다.

public class Foo {
    public static void doStuff(){
        // does stuff
    }
}

하여 Foo를 호출하는 Foo를 호출합니다.doStuff음음음같 뭇매하다

Foo f = new Foo();
f.doStuff();

메소드를 클래스에 직접 호출하면 다음과 같이 됩니다.

Foo.doStuff();

매우 평신도적인 표현으로 클래스는 금형이고 오브젝트는 그 금형으로 만든 복사본입니다.스태틱은 Mold에 속하며 복사본을 만들지 않고 직접 액세스할 수 있습니다. 위의 예에서는

static 키워드는 Java에서 여러 가지 방법으로 사용할 수 있으며, 거의 모든 경우 수정 인 것이 둘러싸인 객체인스턴스 없이도 사용할 수 있음을 의미합니다.

Java는 객체 지향 언어이며 기본적으로 사용자가 작성하는 대부분의 코드에는 객체 인스턴스를 사용해야 합니다.

public class SomeObject {
    public int someField;
    public void someMethod() { };
    public Class SomeInnerClass { };
}

someField, someMethod 또는 SomeInnerClass를 사용하려면 먼저 SomeObject 인스턴스를 생성해야 합니다.

public class SomeOtherObject {
    public void doSomeStuff() {
        SomeObject anInstance = new SomeObject();
        anInstance.someField = 7;
        anInstance.someMethod();
        //Non-static inner classes are usually not created outside of the
        //class instance so you don't normally see this syntax
        SomeInnerClass blah = anInstance.new SomeInnerClass();
    }
}

만약 내가 그것들을 정적이라고 선언한다면, 그것들은 동봉된 인스턴스를 필요로 하지 않는다.

public class SomeObjectWithStaticStuff {
    public static int someField;
    public static void someMethod() { };
    public static Class SomeInnerClass { };
}

public class SomeOtherObject {
    public void doSomeStuff() {
        SomeObjectWithStaticStuff.someField = 7;
        SomeObjectWithStaticStuff.someMethod();
        SomeObjectWithStaticStuff.SomeInnerClass blah = new SomeObjectWithStaticStuff.SomeInnerClass();
        //Or you can also do this if your imports are correct
        SomeInnerClass blah2 = new SomeInnerClass();
    }
}

정적인 것을 선언하는 것은 몇 가지 의미를 가집니다.

첫째, 애플리케이션 전체에서 정적 필드의 값은 1개만 존재할 수 있습니다.

public class SomeOtherObject {
    public void doSomeStuff() {
        //Two objects, two different values
        SomeObject instanceOne = new SomeObject();
        SomeObject instanceTwo = new SomeObject();
        instanceOne.someField = 7;
        instanceTwo.someField = 10;
        //Static object, only ever one value
        SomeObjectWithStaticStuff.someField = 7;
        SomeObjectWithStaticStuff.someField = 10; //Redefines the above set
    }
}

두 번째 문제는 정적 메서드와 내부 클래스가 (존재하지 않기 때문에) 둘러싸인 오브젝트의 필드에 액세스할없다는 것입니다.

public class SomeObjectWithStaticStuff {
    private int nonStaticField;
    private void nonStaticMethod() { };

    public static void someStaticMethod() {
        nonStaticField = 7; //Not allowed
        this.nonStaticField = 7; //Not allowed, can never use *this* in static
        nonStaticMethod(); //Not allowed
        super.someSuperMethod(); //Not allowed, can never use *super* in static
    }

    public static class SomeStaticInnerClass {

        public void doStuff() {
            someStaticField = 7; //Not allowed
            nonStaticMethod(); //Not allowed
            someStaticMethod(); //This is ok
        }

    }
}

static 키워드는 내부 인터페이스, 주석 및 enum에도 적용할 수 있습니다.

public class SomeObject {
    public static interface SomeInterface { };
    public static @interface SomeAnnotation { };
    public static enum SomeEnum { };
}

이러한 경우 모두 키워드는 용장성이기 때문에 효과가 없습니다.인터페이스, 주석 및 enum은 내부 클래스와의 관계가 없기 때문에 기본적으로는 정적입니다.

이것은, 키워드의 기능만을 나타내고 있습니다.키워드를 사용하는 것이 나쁜 생각인지 아닌지는 설명되지 않습니다.는 정적 방법을 많이 사용하는 것이 나쁜 것인가와 같은 다른 질문에서 더 자세히 다룰 수 있습니다.

또한 static 키워드의 사용 빈도가 낮은 것도 몇 가지 있습니다.스태틱 Import에서는 스태틱타입(스태틱으로 중복 마킹되지 않은 인터페이스, 주석 및 enum 포함)을 부적격으로 사용할 수 있습니다.

//SomeStaticThing.java
public class SomeStaticThing {
    public static int StaticCounterOne = 0;
}

//SomeOtherStaticThing.java
public class SomeOtherStaticThing {
    public static int StaticCounterTwo = 0;
}

//SomeOtherClass.java
import static some.package.SomeStaticThing.*;
import some.package.SomeOtherStaticThing.*;

public class SomeOtherClass {
    public void doStuff() {
        StaticCounterOne++; //Ok
        StaticCounterTwo++; //Not ok
        SomeOtherStaticThing.StaticCounterTwo++; //Ok
    }
}

마지막으로 스태틱 이니셜라이저는 클래스가 처음 로드될 때(일반적으로 응용 프로그램에서 클래스가 처음 인스턴스화되기 직전) 실행되는 코드 블록이며 스태틱하지 않은 필드 또는 메서드에 액세스할 수 없습니다.

public class SomeObject {

    private static int x;

    static {
        x = 7;
    }
}

싱글턴 설계 패턴을 적용할 때 정적 속성과 연산이 사용되는 또 다른 좋은 예입니다.한마디로 Singleton 설계 패턴은 시스템 수명 동안 특정 클래스의 개체를 하나만 구성할 수 있도록 합니다.하나의 오브젝트만 확실하게 구성되도록 하기 위해 싱글톤 패턴의 일반적인 구현은 단일 허용된 오브젝트인스턴스에 대한 내부 스태틱 참조를 유지하고 해당 인스턴스에 대한 액세스는 다음 명령어를 사용하여 제어됩니다.static작동

@inkedmn이 지적한 것 외에 스태틱멤버는 클래스레벨입니다따라서 해당 멤버는 JVM에 의해 해당 클래스에 대해1회(클래스가 로드되었을 때) 메모리에 로드됩니다.즉, 스태틱멤버가 속한 클래스의 n개의 인스턴스에 대해 로드된 n개의 스태틱멤버 인스턴스가 없습니다

위의 점은 맞으며 Static 키워드에 대해 더 중요한 점을 추가하고 싶습니다.

static 키워드를 사용하면 내부적으로는 permanent memory(히프 메모리)에 저장됩니다.스택 메모리(일시 메모리)와 히프 메모리(영구 메모리)의 2종류의 메모리가 있는 것을 알고 있기 때문에, 스태틱키워드를 사용하지 않는 경우는 스택메모리의 permanent memory(또는 c)에 격납할 수 있습니다.모두 휘발성 메모리로 간주됩니다.

그러면 이 권리가 무슨 소용인지 의심하게 될 것이다.

: static int a=10;(1 프로그램)

방금 static 키워드를 변수나 메서드에 사용할 경우 영구 메모리에 바로 저장할 수 있다고 말씀드렸습니다.

그래서 값이 다른 다른 프로그램에서 키워드 static을 사용하여 같은 변수를 선언했습니다.

: static int a=20;(2 프로그램)

변수 'a'는 프로그램1에 의해 힙메모리에 저장됩니다. 때 동일한 정적 변수 'a'가 힙메모리에 다시 생성되지 않고 10에서 20까지의 값만 대체됩니다.

일반적으로 static 변수로 a를 선언하지 않으면 스택메모리(일시 메모리)에 변수 a를 다시 만듭니다.

키워드를 하면 static을 사용할 수
할 수 있다. 1. 기억하다
중복을 수 . 중을피피피피수수
3.정적 개체를 대로 만들 .3 . 클래스 이름을 사용하여 정적 변수에 액세스하기 위해 개체를 순서대로 만들 필요가 없습니다.

언급URL : https://stackoverflow.com/questions/2649213/in-laymans-terms-what-does-static-mean-in-java

반응형