'static' 키워드는 클래스에서 무엇을 합니까?
구체적으로 말하면, 저는 이 코드를 시도하고 있었습니다.
package hello;
public class Hello {
Clock clock = new Clock();
public static void main(String args[]) {
clock.sayTime();
}
}
하지만 그것은 오류를 주었다.
static 메서드 main에서 non-static 필드에 액세스할 수 없습니다.
요.clock
뭇매를 맞다
static Clock clock = new Clock();
그리고 그것은 성공하였다.선언 앞에 그 키워드를 넣는다는 것은 무슨 뜻입니까?그 오브젝트에 대해 무엇을 할 수 있는지, 무엇을 할 수 있는지, 또는 무엇을 제한할 수 있는지.
static
멤버는 특정 인스턴스가 아닌 클래스에 속합니다.
즉, 클래스의 인스턴스를 백만 개 만들거나 만들지 않아도 필드의[1] 인스턴스는 하나만 존재합니다.모든 인스턴스에서 공유됩니다.
★★static
메서드도 특정 인스턴스에 속하지 않으므로 인스턴스 멤버를 참조할 수 없습니다.에서는, 「」를 참조해 주세요.main
은 어떤 알 수.Hello
어떤 인지)Clock
classclass)를 합니다. static
할 수 은 「」입니다.static
는 물론 액세스 할 수 .static
★★★★★★★★★★★★★★★★★★.
사이드 노트:물론이야.static
멤버는 오브젝트 참조를 통해 인스턴스 멤버에 액세스할 수 있습니다.
예:
public class Example {
private static boolean staticField;
private boolean instanceField;
public static void main(String[] args) {
// a static method can access static fields
staticField = true;
// a static method can access instance fields through an object reference
Example instance = new Example();
instance.instanceField = true;
}
[1]: 실행 시 특성에 따라 ClassLoader, AppDomain 또는 스레드당 1개라도 상관없습니다.
즉, "Hello" 클래스의 개별 인스턴스별로 1개씩이 아니라 Hello에 "clock" 인스턴스가 1개만 존재함을 의미합니다.즉, "Hello" 클래스의 모든 인스턴스 간에 공통적으로 공유되는 "clock" 참조가 1개씩 존재함을 의미합니다.
따라서 코드의 임의의 장소에서 "new hello"를 실행하면 첫 번째 시나리오에서는 A-(변경 전, "static"을 사용하지 않고) "new hello"가 호출될 때마다 새로운 클럭이 생성되지만 두 번째 시나리오에서는 B-(변경 후 "static"을 사용하여) 모든 "new hello" 인스턴스는 여전히 초기 및 "clock 참조"를 공유하여 사용합니다.rst가 작성되었습니다.
메인 이외의 장소에 「클럭」이 필요 없는 한, 다음과 같이 동작합니다.
package hello;
public class Hello
{
public static void main(String args[])
{
Clock clock=new Clock();
clock.sayTime();
}
}
static
키워드는 어떤 유형(필드, 메서드 또는 네스트클래스)이 특정 유형의 인스턴스가 아닌 유형과 관련되어 있음을 의미합니다.예를 들어, 어떤 사람이Math.sin(...)
의 없이Math
class, 그리고 실제로 class의 인스턴스를 생성할 수 없습니다.Math
를 누릅니다
자세한 내용은 Oracle Java 튜토리얼의 관련 비트를 참조하십시오.
사이드노트
Java에서는 예를 들어 정적 멤버가 인스턴스 멤버인 것처럼 액세스할 수 있습니다.
// Bad code!
Thread.currentThread().sleep(5000);
someOtherThread.sleep(5000);
그렇게 되면 마치sleep
인스턴스 메서드이지만 실제로는 정적 메서드이며 항상 현재 스레드를 sleep 상태로 만듭니다.발신자 코드로 이것을 명확하게 하는 것이 좋습니다.
// Clearer
Thread.sleep(5000);
static
Java 키워드란 변수 또는 함수가 실제 객체가 아닌 유형에 속하기 때문에 해당 클래스의 모든 인스턴스 간에 공유되는 것을 의미합니다.
private static int i = 0;
i++
의 경우 이 모든 의 경우 변경 내용이 모든 인스턴스에 반영됩니다. i
1로 하다
정적 메서드는 개체를 인스턴스화하지 않고 사용할 수 있습니다.
정적 멤버의 기본 사용...
public class Hello
{
// value / method
public static String staticValue;
public String nonStaticValue;
}
class A
{
Hello hello = new Hello();
hello.staticValue = "abc";
hello.nonStaticValue = "xyz";
}
class B
{
Hello hello2 = new Hello(); // here staticValue = "abc"
hello2.staticValue; // will have value of "abc"
hello2.nonStaticValue; // will have value of null
}
이렇게 하면 클래스 인스턴스 Hello를 다른 클래스에 전송하지 않고도 모든 클래스 멤버에서 값을 공유할 수 있습니다.화이트 스태틱에서는 클래스 인스턴스를 생성할 필요가 없습니다.
Hello hello = new Hello();
hello.staticValue = "abc";
static 값 또는 메서드는 클래스 이름으로 호출할 수 있습니다.
Hello.staticValue = "abc";
Static은 클래스와 관련된 메서드 또는 변수를 사용하기 위해 클래스의 인스턴스를 만들 필요가 없음을 의미합니다.이 예에서는, 다음의 콜을 실시할 수 있습니다.
Hello.main(new String[]()) //main(...) is declared as a static function in the Hello class
다음과 같은 경우 대신 직접
Hello h = new Hello();
h.main(new String[]()); //main(...) is a non-static function linked with the "h" variable
스태틱 메서드(클래스에 속하는) 내부에서는 스태틱하지 않은 멤버에 액세스할 수 없습니다.이 멤버의 값은 클래스의 인스턴스화에 따라 달라지기 때문입니다.인스턴스 멤버인 비스타틱클럭 객체는 Hello 클래스의 인스턴스별로 다른 값/참조를 가지므로 클래스의 스태틱 부분에서는 액세스할 수 없습니다.
Java의 정적:
Static은 Non Access Modifier입니다.static 키워드는 클래스의 인스턴스가 아닌 클래스에 속합니다.를 사용하여 변수 또는 메서드를 클래스에 연결할 수 있습니다.
static 키워드는 다음과 같이 사용할 수 있습니다.
방법
변수
다른 클래스 내에 중첩된 클래스
초기화 블록
사용할 수 없음:
클래스(네스트 없음)
컨스트럭터
인터페이스
메서드 로컬 내부 클래스(내부 클래스와의 차이)
Inner Class 메서드
인스턴스 변수
로컬 변수
예:
다음 예에서는 count라는 이름의 인스턴스 변수가 컨스트럭터에 증분되어 있다고 가정합니다.
package pkg;
class StaticExample {
int count = 0;// will get memory when instance is created
StaticExample() {
count++;
System.out.println(count);
}
public static void main(String args[]) {
StaticExample c1 = new StaticExample();
StaticExample c2 = new StaticExample();
StaticExample c3 = new StaticExample();
}
}
출력:
1 1 1
인스턴스 변수는 객체 생성 시 메모리를 가져오기 때문에 각 객체에는 인스턴스 변수의 복사본이 있습니다. 인스턴스 변수가 증가하면 다른 객체에 반영되지 않습니다.
인스턴스 변수 카운트를 정적 값으로 변경하면 프로그램에서 다음과 같은 다른 출력이 생성됩니다.
package pkg;
class StaticExample {
static int count = 0;// will get memory when instance is created
StaticExample() {
count++;
System.out.println(count);
}
public static void main(String args[]) {
StaticExample c1 = new StaticExample();
StaticExample c2 = new StaticExample();
StaticExample c3 = new StaticExample();
}
}
출력:
1 2 3
이 경우 static 변수는 메모리를 한 번만 가져옵니다. 객체가 static 변수의 값을 변경해도 해당 값은 유지됩니다.
정적(최종):
final로 선언되고 static으로 선언된 글로벌 변수는 실행 전체에서 변경되지 않습니다.정적 멤버는 클래스 메모리에 저장되며 전체 실행에서 한 번만 로드되기 때문입니다.클래스의 모든 오브젝트에 공통입니다.정적 변수를 최종 변수라고 선언하면 개체 중 하나가 최종 변수이므로 값을 변경할 수 없습니다.따라서 최종 변수와 정적 변수를 상수라고 부르기도 합니다.인터페이스의 모든 필드는 기본적으로는 최종이며 정적이기 때문에 상수라고 불립니다.
이미지 리소스: 최종 정적
기존 답변에 추가하려면 다음 그림을 사용해 보겠습니다.
모든 저축 계좌에는 2%의 금리가 적용됩니다.그래서 정적입니다.
균형은 개별적이어야 하므로 고정적이지 않습니다.
이 논의는 지금까지 클래스로더에 대한 고려사항을 무시해 왔습니다.엄밀히 말하면 Java 스태틱필드는 특정 클래스 로더의 모든 클래스인스턴스 간에 공유됩니다.
필드는 클래스 또는 클래스의 인스턴스에 할당할 수 있습니다.이치노「」를 사용해 .static
되기 .clock
한 곳에서 변경을 하면 어디에서나 볼 수 있습니다.인스턴스 변수는 서로 독립적으로 변경됩니다.
" " "static
는 필드 또는 메서드가 특정 인스턴스가 아닌 클래스 자체에 속함을 나타내기 위해 사용됩니다.를 사용하여 " " " " "」의 Clock
" "의 가 static입니다.Hello
을 공유합니다.Clock
데이터 멤버(필드)를 공유합니다. 의 각 Hello
한 을 가지다Clock
.
클래스에 기본 메서드를 추가했습니다.Hello
암호를 작동시킬 수 있도록요문제는 메인 방식이 스태틱하기 때문에 그 내부의 비 스태틱필드나 메서드를 참조할 수 없다는 것입니다.이 문제는 다음 두 가지 방법으로 해결할 수 있습니다.
- 을 만들어 .
Hello
클래스 스태틱을 사용하여 메인 메서드 내에서 참조할 수 있습니다.이것은 바람직하지 않다(또는 필드나 메서드를 스태틱하게 하는 잘못된 이유). - 보세요.
Hello
모든 필드 및 메서드에 대한 접근 및 사용방법으로 접근합니다.
이것은, 코드의 다음의 변경을 의미합니다.
package hello;
public class Hello {
private Clock clock = new Clock();
public Clock getClock() {
return clock;
}
public static void main(String args[]) {
Hello hello = new Hello();
hello.getClock().sayTime();
}
}
'''가static
키워드는 단순히 다음을 나타내는 것으로 간주할 수 있습니다.
"특정 사례에 대한 배려 또는 관계 없이"
★★★★★★★★★★★★★★★★를 생각하면,static
이와 같이 하면, 그것이 발생하는 다양한 컨텍스트에서의 사용법을 이해하기 쉬워집니다.
A
static
는 특정 입니다.A
static
는 method의 입니다.this
; 이 한 해당 알 수A
static
클래스의 에 대한 되지 않는 ).member class는 엔클로징 클래스의 인스턴스입니다.
static은 클럭멤버를 인스턴스 멤버가 아닌 클래스 멤버로 만듭니다.static 키워드를 지정하지 않으면 Hello 클래스의 인스턴스(클럭멤버 변수 포함)를 작성해야 합니다.
Hello hello = new Hello();
hello.clock.sayTime();
static 메서드는 정의된 클래스의 인스턴스 변수를 사용하지 않습니다.이 페이지에서 차이에 대한 좋은 설명을 찾을 수 있습니다.
「헬퍼」클래스에서 정적 메서드(가능한 경우만)를 좋아하게 되었습니다.
호출 클래스는 도우미 클래스의 다른 멤버(인스턴스) 변수를 만들 필요가 없습니다.도우미 클래스의 메서드를 호출하기만 하면 됩니다.또한 컨스트럭터가 필요 없고 멤버(인스턴스) 변수가 필요 없기 때문에 도우미 클래스가 개선되었습니다.
아마 다른 장점이 있을 거예요.
//Here is an example
public class StaticClass
{
static int version;
public void printVersion() {
System.out.println(version);
}
}
public class MainClass
{
public static void main(String args[]) {
StaticClass staticVar1 = new StaticClass();
staticVar1.version = 10;
staticVar1.printVersion() // Output 10
StaticClass staticVar2 = new StaticClass();
staticVar2.printVersion() // Output 10
staticVar2.version = 20;
staticVar2.printVersion() // Output 20
staticVar1.printVersion() // Output 20
}
}
스태틱 멤버에게 "이" 포인터가 없다고 생각할 수도 있습니다.모든 인스턴스에서 공유됩니다.
스태틱 개념에 대해서
public class StaticPractise1 {
public static void main(String[] args) {
StaticPractise2 staticPractise2 = new StaticPractise2();
staticPractise2.printUddhav(); //true
StaticPractise2.printUddhav(); /* false, because printUddhav() is although inside StaticPractise2, but it is where exactly depends on PC program counter on runtime. */
StaticPractise2.printUddhavsStatic1(); //true
staticPractise2.printUddhavsStatic1(); /*false, because, when staticPractise2 is blueprinted, it tracks everything other than static things and it organizes in its own heap. So, class static methods, object can't reference */
}
}
세컨드 클래스
public class StaticPractise2 {
public static void printUddhavsStatic1() {
System.out.println("Uddhav");
}
public void printUddhav() {
System.out.println("Uddhav");
}
}
main()
는 기본적으로 두 입니다.
- 스태틱 메서드는 스태틱하지 않은 데이터 멤버를 사용하거나 직접 스태틱하지 않은 메서드를 호출할 수 없습니다.
this()
★★★★★★★★★★★★★★★★★」super()
정적 컨텍스트에서는 사용할 수 없습니다.class A { int a = 40; //non static public static void main(String args[]) { System.out.println(a); } }
출력: 컴파일 시간 오류
이 개념에 대해 'static'이라는 단어의 선택에 대한 질문이 여기에 있었다.이 질문에는 속았지만, 어원이 명확하게 언급되지 않은 것 같습니다.그래서...
C부터 시작하는 키워드 재사용 때문입니다.
C(함수 본문 내부)의 데이터 선언을 검토합니다.
void f() {
int foo = 1;
static int bar = 2;
:
}
변수 foo는 함수가 입력되면 스택에 생성됩니다(함수가 종료되면 파기됩니다).반면 바는 항상 존재하기 때문에 일반적인 영어의 의미에서는 정적입니다. 아무데도 가지 않습니다.
Java 및 유사한 언어는 데이터에 대해 동일한 개념을 가지고 있습니다.데이터는 클래스의 인스턴스별로(개체별로) 할당할 수도 있고 클래스 전체에 대해 한 번 할당할 수도 있습니다.Java는 C/C++ 프로그래머에게 익숙한 구문을 사용하는 것을 목표로 하기 때문에 여기서는 static 키워드가 적합합니다.
class C {
int foo = 1;
static int bar = 2;
:
}
마지막으로 방법론입니다.
class C {
int foo() { ... }
static int bar() { ... }
:
}
개념적으로 말하면 클래스 C의 모든 인스턴스에는 foo() 인스턴스가 있습니다.클래스 C 전체에 대해 bar() 인스턴스는 1개뿐입니다.이는 데이터에 대해 설명한 경우와 유사하기 때문에 특히 언어에 예약된 키워드를 추가하고 싶지 않은 경우 'static'을 사용하는 것이 좋습니다.
정적 변수 정적 메서드에서만 액세스할 수 있으므로 정적 변수를 선언할 때 getter 및 setter 메서드는 정적 메서드가 됩니다.
static 메서드는 클래스 이름을 사용하여 액세스할 수 있는 클래스 수준입니다.
다음은 정적 변수 Getters 및 Setters의 예를 나타냅니다.
public class Static
{
private static String owner;
private static int rent;
private String car;
public String getCar() {
return car;
}
public void setCar(String car) {
this.car = car;
}
public static int getRent() {
return rent;
}
public static void setRent(int rent) {
Static.rent = rent;
}
public static String getOwner() {
return owner;
}
public static void setOwner(String owner) {
Static.owner = owner;
}
}
Java 프로그램의 멤버는 선언/정의 앞에 "static" 키워드를 사용하여 static으로 선언할 수 있습니다.멤버가 스태틱하다고 선언되면 기본적으로 인스턴스당 복사본을 만들지 않고 해당 멤버가 클래스의 모든 인스턴스에서 공유됨을 의미합니다.
따라서 static은 Java에서 사용되는 비클래스 수식어로 다음 멤버에게 적용할 수 있습니다.
- 변수
- 방법들
- 블록
- 클래스(구체적으로는 네스트된 클래스)
멤버가 스태틱하다고 선언되면 오브젝트를 사용하지 않고 멤버에 액세스할 수 있습니다.즉, 클래스가 인스턴스화되기 전에 스태틱멤버가 활성화되어 접근 가능함을 의미합니다.클래스의 오브젝트가 범위를 벗어나면 존재하지 않게 되는 다른 비스타틱클래스 멤버와는 달리 스태틱멤버는 분명히 활성화 되어 있습니다
Java의 정적 변수
스태틱으로 선언된 클래스의 멤버 변수를 스태틱 변수라고 합니다.클래스 변수라고도 합니다.변수가 스태틱으로 선언되면 클래스가 인스턴스화될 때마다 메모리가 할당되지 않고 한 번만 할당됩니다.따라서 객체를 참조하지 않고도 정적 변수에 액세스할 수 있습니다.
다음 Java 프로그램은 정적 변수의 사용을 보여 줍니다.
class Main
{
// static variables a and b
static int a = 10;
static int b;
static void printStatic()
{
a = a /2;
b = a;
System.out.println("printStatic::Value of a : "+a + " Value of b :
"+b);
}
public static void main(String[] args)
{
printStatic();
b = a*5;
a++;
System.out.println("main::Value of a : "+a + " Value of b : "+b);
}
}
출력:
printStatic::Value of a : Value of b : 5
main::Value of a : 6 Value of b : 25
위 프로그램에서는 두 개의 정적 변수, 즉 a와 b가 있습니다.이러한 변수는 "printStatic" 함수뿐만 아니라 "main" 함수에서도 수정합니다.이러한 정적 변수의 값은 함수의 범위가 종료된 경우에도 함수에 걸쳐 유지됩니다.출력에는 두 함수의 변수 값이 표시됩니다.
정적 방법
Java의 메서드는 키워드 "static" 앞에 있으면 static입니다.
정적 방법에 대해 기억해야 할 몇 가지 사항은 다음과 같습니다.
- 스태틱 메서드는 클래스의 인스턴스를 사용하여 호출되는 다른 비 스태틱 메서드와 달리 클래스에 속합니다.
- 정적 메서드를 호출하려면 클래스 개체가 필요하지 않습니다.
- 클래스의 스태틱 데이터 멤버는 스태틱메서드에 액세스 할 수 있습니다.스태틱 방식은 스태틱 데이터 멤버의 값도 변경할 수 있습니다.
- 정적 메서드는 'this' 또는 'super' 멤버에 대한 참조를 가질 수 없습니다.정적 메서드로 참조하려고 해도 컴파일러 오류가 발생합니다.
- 스태틱 데이터와 마찬가지로 스태틱메서드는 다른 스태틱메서드를 호출할 수도 있습니다.스태틱 메서드는 스태틱하지 않은 데이터 멤버 또는 변수를 참조할 수 없으며, 스태틱하지 않은 메서드를 호출할 수도 없습니다.
다음 프로그램은 Java에서의 정적 메서드의 구현을 보여 줍니다.
class Main
{
// static method
static void static_method()
{
System.out.println("Static method in Java...called without any
object");
}
public static void main(String[] args)
{
static_method();
}
}
출력:
Static method in Java...called without any object
Java에서의 스태틱블록
Java의 C++, C# 등의 프로그래밍 언어에도 함수 블록이 있는 것처럼 정적 데이터와 관련된 코드 블록을 포함하는 "static" 블록이라는 특별한 블록이 있습니다.
이 스태틱 블록은 클래스의 첫 번째 오브젝트가 생성되는 순간(정확히 클래스 로드 시) 또는 블록 내의 스태틱멤버가 사용되는 시점에서 실행됩니다.
다음 프로그램은 정적 블록의 사용법을 보여줍니다.
class Main
{
static int sum = 0;
static int val1 = 5;
static int val2;
// static block
static {
sum = val1 + val2;
System.out.println("In static block, val1: " + val1 + " val2: "+
val2 + " sum:" + sum);
val2 = val1 * 3;
sum = val1 + val2;
}
public static void main(String[] args)
{
System.out.println("In main function, val1: " + val1 + " val2: "+ val2 + " sum:" + sum);
}
}
출력:
In static block, val1: 5 val2: 0 sum:5
In main function, val1: val2: 15 sum:20
스태틱 클래스
Java에서는 정적 블록, 정적 메서드 및 정적 변수까지 사용할 수 있습니다.따라서 정적 클래스도 사용할 수 있습니다.Java에서는 다른 클래스 내에 클래스를 포함할 수 있으며 이를 Nested 클래스라고 합니다.중첩된 클래스를 둘러싼 클래스를 Outer 클래스라고 합니다.
Java에서는 네스트된 클래스를 Static으로 선언할 수 있지만 외부 클래스를 Static으로 선언할 수 없습니다.
이제 Java의 정적 중첩 클래스에 대해 살펴보겠습니다.
스태틱 네스트 클래스
이미 설명한 바와 같이 Java에서 네스트된 클래스를 static으로 선언할 수 있습니다.스태틱 네스트클래스는 다음과 같이 특정 측면에서 비 스태틱 네스트클래스(내부 클래스)와 다릅니다.
non-static nested 클래스와 달리 nested static 클래스에는 외부 클래스 참조가 필요하지 않습니다.
스태틱 네스트클래스는 외부 클래스의 스태틱멤버와 비 스태틱멤버에 접근할 수 있는 비 스태틱클래스에 대해서 외부 클래스의 스태틱멤버에만 접근할 수 있습니다
스태틱 네스트클래스의 예를 다음에 나타냅니다.
class Main{
private static String str = "SoftwareTestingHelp";
//Static nested class
static class NestedClass{
//non-static method
public void display() {
System.out.println("Static string in OuterClass: " + str);
}
}
public static void main(String args[])
{
Main.NestedClassobj = new Main.NestedClass();
obj.display();
}
}
산출량
Static string in OuterClass: SoftwareTestingHelp
자바에서는 static 키워드가 이렇게 동작하는 것 같아요.
언급URL : https://stackoverflow.com/questions/413898/what-does-the-static-keyword-do-in-a-class
'programing' 카테고리의 다른 글
주석을 사용하여 구성된 스프링 빈에 속성 값을 삽입하려면 어떻게 해야 합니까? (0) | 2022.08.28 |
---|---|
프리프로세서 디렉티브를 사용하여 OS를 확인하려면 어떻게 해야 합니까? (0) | 2022.08.28 |
Vuex Store에서 여러 URL(axios)을 설정하는 가장 좋은 방법은 무엇입니까? (0) | 2022.08.28 |
Vue Js: 범위 지정 슬롯 및 IE11 문제 (0) | 2022.08.28 |
Axios 및 VueX에서 nuxtJ를 간단하게 사용 (0) | 2022.08.28 |