what is static keyword java
이 튜토리얼은 자바의 정적 키워드와 변수, 메소드, 블록 및 클래스에서의 사용법에 대해 설명합니다. 또한 정적 멤버와 비 정적 멤버의 차이점을 설명합니다.
Java는 변수, 메서드, 클래스 등의 범위와 동작을 나타내는 다양한 유형의 선언을 지원합니다. 예를 들어, 키워드 final, seal, static 등. 이러한 모든 선언은 Java 프로그램에서 사용될 때 특정 의미를 갖습니다.
이 자습서를 진행하면서 이러한 모든 키워드를 살펴 보겠습니다. 여기서는 Java에서 가장 중요한 키워드 중 하나 인 '정적'에 대해 자세히 설명합니다.
학습 내용 :
자바의 정적 키워드
Java 프로그램의 멤버는 선언 / 정의 앞에 '정적'키워드를 사용하여 정적으로 선언 할 수 있습니다. 멤버가 정적으로 선언되면 이는 본질적으로 인스턴스별로 복사본을 만들지 않고 클래스의 모든 인스턴스에서 멤버를 공유한다는 것을 의미합니다.
따라서 static은 Java에서 사용되는 비 클래스 수정 자이며 다음 멤버에 적용 할 수 있습니다.
- 변수
- 행동 양식
- 블록
- 클래스 (구체적으로는 중첩 클래스)
멤버가 정적으로 선언되면 개체를 사용하지 않고도 액세스 할 수 있습니다. 즉, 클래스가 인스턴스화되기 전에 정적 멤버가 활성화되고 액세스 할 수 있습니다. 클래스의 개체가 범위를 벗어나면 존재하지 않는 다른 비 정적 클래스 멤버와 달리 정적 멤버는 여전히 분명히 활성 상태입니다.
자바의 정적 변수
static으로 선언 된 클래스의 멤버 변수를 Static Variable이라고합니다. '클래스 변수'라고도합니다. 변수가 static으로 선언되면 메모리는 클래스가 인스턴스화 될 때마다 할당되지 않고 한 번만 할당됩니다. 따라서 개체에 대한 참조없이 정적 변수에 액세스 할 수 있습니다.
다음 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); } }
산출:
위의 프로그램에는 두 개의 정적 변수, 즉 a와 b가 있습니다. 이 변수는 'printStatic'함수와 'main'에서 수정합니다. 이러한 정적 변수의 값은 함수 범위가 끝나더라도 함수 전체에서 유지됩니다. 출력에는 두 함수의 변수 값이 표시됩니다.
정적 변수가 필요한 이유는 무엇이며 어디에 유용합니까?
정적 변수는 카운터가 필요한 애플리케이션에서 가장 유용합니다. 아시다시피 카운터는 일반 변수로 선언되면 잘못된 값을 제공합니다.
예를 들어, 클래스가있는 애플리케이션에서 카운터로 설정된 일반 변수가있는 경우 car. 그런 다음 자동차 객체를 만들 때마다 일반 카운터 변수가 모든 인스턴스로 초기화됩니다. 그러나 카운터 변수가 정적 또는 클래스 변수 인 경우 클래스가 생성 될 때 한 번만 초기화됩니다.
나중에 클래스의 모든 인스턴스에서이 카운터는 1 씩 증가합니다. 이는 각 인스턴스마다 카운터가 증가하지만 카운터 값은 항상 1이되는 일반 변수와는 다릅니다.
따라서 클래스 car의 개체를 100 개 생성하더라도 일반 변수 인 카운터는 항상 값이 1 인 반면 정적 변수의 경우 올바른 개수 인 100을 표시합니다.
다음은 Java에서 정적 카운터의 또 다른 예입니다.
class Counter { static int count=0;//will get memory only once and retain its value Counter() { count++;//incrementing the value of static variable System.out.println(count); } } class Main { public static void main(String args()) { System.out.println('Values of static counter:'); Counter c1=new Counter(); Counter c2=new Counter(); Counter c3=new Counter(); } }
산출:
정적 변수의 작동은 위의 프로그램에서 분명합니다. 초기 값 = 0으로 정적 변수 개수를 선언했습니다. 그런 다음 클래스 생성자에서 정적 변수를 증가시킵니다.
주 함수에서 클래스 카운터의 세 가지 개체를 만듭니다. 카운터 개체가 생성 될 때마다 출력에 정적 변수의 값이 표시됩니다. 모든 개체가 생성 될 때 기존 정적 변수 값이 증가하고 다시 초기화되지 않음을 알 수 있습니다.
자바 정적 방법
Java의 메소드는 'static'키워드가 앞에 오면 정적입니다.
정적 메서드에 대해 기억해야 할 몇 가지 사항은 다음과 같습니다.
연결된 목록 포인터 C ++
- 정적 메서드는 클래스의 인스턴스를 사용하여 호출되는 다른 비 정적 메서드에 대해 클래스에 속합니다.
- 정적 메서드를 호출하려면 클래스 개체가 필요하지 않습니다.
- 클래스의 정적 데이터 멤버는 정적 메서드에 액세스 할 수 있습니다. 정적 메서드는 정적 데이터 멤버의 값을 변경할 수도 있습니다.
- 정적 메서드는 '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(); } }
산출:
이것은 간단한 그림입니다. 우리는 단순히 메시지를 인쇄하는 정적 메서드를 정의합니다. 그런 다음 주 함수에서 개체 또는 클래스의 인스턴스없이 정적 메서드가 호출됩니다.
Java에서 정적 키워드 구현의 또 다른 예.
class Main { // static variable static int count_static = 5; // instance variable int b = 10; // static method static void printStatic() { count_static = 20; System.out.println('static method printStatic'); // b = 20; // compilation error 'error: non-static variable b cannot be referenced from a static context' //inst_print(); // compilation error 'non-static method inst_print() cannot be referenced from a static //context' //System.out.println(super.count_static); // compiler error 'non-static variable super cannot be //referenced from a static context' } // instance method void inst_print() { System.out.println('instance method inst_print'); } public static void main(String() args) { printStatic(); } }
위의 프로그램에서 보시다시피 두 가지 방법이 있습니다. printStatic은 정적 메소드이고 inst_print는 인스턴스 메소드입니다. 또한 두 개의 변수가 있습니다. static_count는 정적 변수이고 b는 인스턴스 변수입니다.
정적 메서드 인 printStatic에서 먼저 메시지를 표시 한 다음 인스턴스 변수 b의 값을 변경하고 비 정적 메서드도 호출합니다.
다음으로 'super'키워드를 사용합니다.
b = 20;
inst_print ();
System.out.println (super.count_static);
위의 줄로 프로그램을 실행하면 인스턴스 변수 사용, 비 정적 메서드 호출 및 정적 컨텍스트에서 super 참조에 대한 컴파일 오류가 발생합니다. 이것이 정적 메서드의 한계입니다.
위의 세 줄에 대해 설명 할 때만 위의 프로그램이 제대로 작동하고 다음 출력을 생성합니다.
산출:
SQL Server 인터뷰 질문 및 예제 경험이있는 답변
정적 메서드 오버로딩 및 재정의
아시다시피 Overloading과 Overriding은 모두 OOPS의 기능이며 다형성을 지원합니다. 오버로딩은 이름은 같지만 매개 변수 목록이 다른 메서드를 가질 수있는 컴파일 타임 다형성으로 분류 될 수 있습니다.
재정의는 런타임 다형성의 기능이며 여기에서 기본 클래스 메서드는 파생 클래스에서 재정의되므로 메서드 서명 또는 프로토 타입은 동일하지만 정의는 다릅니다.
오버로딩과 오버 라이딩이 자바의 정적 클래스에 어떤 영향을 미치는지 논의하겠습니다.
과부하
매개 변수 목록은 다르지만 이름은 동일한 Java에서 정적 메소드를 오버로드 할 수 있습니다.
다음 프로그램은 오버로딩을 보여줍니다.
public class Main { public static void static_method() { System.out.println('static_method called '); } public static void static_method(String msg) { System.out.println('static_method(string) called with ' + msg); } public static void main(String args()) { static_method(); static_method('Hello, World!!'); } }
산출:
이 프로그램에는 이름이‘static_method’가 같지만 인수 목록이 다른 두 개의 정적 메서드가 있습니다. 첫 번째 메서드는 인수를받지 않고 두 번째 메서드는 문자열 인수를받습니다.
한 가지 주목할 점은 '정적'키워드에만 의존하여 메서드를 오버로드 할 수 없다는 것입니다. 예를 들어, 인스턴스 메소드 'sum'이 있고 다른 메소드 'sum'을 정의하고이를 정적으로 선언하면 작동하지 않습니다. '정적'키워드를 기반으로 한 오버로드를 시도하면 컴파일 실패가 발생합니다.
재정의
정적 메서드는 클래스의 개체없이 호출되므로 파생 클래스에 동일한 서명이있는 정적 메서드가 있어도 재정의되지 않습니다. 인스턴스 없이는 런타임 다형성이 없기 때문입니다.
따라서 정적 메서드를 재정의 할 수 없습니다. 그러나 파생 클래스에 동일한 서명을 가진 정적 메서드가있는 경우 호출 할 메서드는 런타임에 개체에 종속되지 않고 컴파일러에 따라 다릅니다.
정적 메서드를 재정의 할 수는 없지만 기본 클래스 메서드와 동일한 서명을 가진 파생 클래스에 메서드가있는 경우 Java 언어는 컴파일러 오류를 제공하지 않습니다.
다음 구현은이 점을 증명합니다.
classBase_Class { // Static method in base class which will be hidden in substatic_displayclass public static void static_display() { System.out.println('Base_Class::static_display'); } } classDerived_Class extends Base_Class { public static void static_display() { System.out.println('Derived_Class::static_display'); } } public class Main { public static void main(String args( )) { Base_Class obj1 = new Base_Class(); Base_Class obj2 = new Derived_Class(); Derived_Class obj3 = new Derived_Class(); obj1.static_display(); obj2.static_display(); obj3.static_display(); } }
산출:
위의 프로그램에서 호출되는 정적 메서드는 포인터가 가리키는 개체에 의존하지 않음을 알 수 있습니다. 이는 객체가 정적 메서드와 함께 전혀 사용되지 않기 때문입니다.
자바의 정적 블록
Java에서 C ++, C # 등과 같은 프로그래밍 언어의 함수 블록이있는 것처럼 일반적으로 정적 데이터와 관련된 코드 블록을 포함하는 '정적'블록이라는 특수 블록이 있습니다.
이 정적 블록은 클래스의 첫 번째 객체가 생성되는 순간 (정확히 클래스 로딩시) 또는 블록 내부의 정적 멤버가 사용될 때 실행됩니다.
다음 프로그램은 정적 블록의 사용법을 보여줍니다.
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); } }
산출:
위 프로그램에서 명령문의 실행 순서에 유의하십시오. 정적 블록의 내용이 먼저 실행 된 다음 주 프로그램이 실행됩니다. 정적 변수 sum 및 val1에는 초기 값이 있지만 val2는 초기화되지 않습니다 (기본값은 0). 그런 다음 정적 블록에서 val2는 여전히 값이 할당되지 않았으므로 해당 값이 0으로 표시됩니다.
변수 val2는 정적 블록에 인쇄 한 후 값이 할당되고 합계가 다시 계산됩니다. 따라서 주 함수에서 sum과 val2의 다른 값을 얻습니다.
생성자를 지정하면 생성자 이전에도 정적 블록의 내용이 실행됩니다. 정적 블록은 주로 클래스의 정적 멤버 및 정적 멤버와 관련된 기타 초기화를 초기화하는 데 사용됩니다.
자바 정적 클래스
Java에는 정적 블록, 정적 메소드 및 정적 변수가 있습니다. 따라서 정적 클래스도 가질 수 있습니다. Java에서는 다른 클래스 내부에 클래스를 가질 수 있으며이를 Nested 클래스라고합니다. 중첩 된 클래스를 포함하는 클래스를 Outer 클래스라고합니다.
Java에서는 중첩 된 클래스를 Static으로 선언 할 수 있지만 외부 클래스를 Static으로 지정할 수는 없습니다.
이제 Java의 정적 중첩 클래스를 살펴 보겠습니다.
자바의 정적 중첩 클래스
이미 언급했듯이 Java에서 정적 클래스로 선언 된 중첩 클래스를 가질 수 있습니다. 정적 중첩 클래스는 아래 나열된 특정 측면에서 비 정적 중첩 클래스 (내부 클래스)와 다릅니다.
비 정적 중첩 클래스와 달리 중첩 정적 클래스에는 외부 클래스 참조가 필요하지 않습니다.
정적 중첩 클래스는 외부 클래스의 정적 멤버와 비 정적 멤버에 액세스 할 수있는 비 정적 클래스에 대해 외부 클래스의 정적 멤버에만 액세스 할 수 있습니다.
정적 중첩 클래스의 예는 다음과 같습니다.
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(); } }
산출:
위의 프로그램에서 정적 중첩 클래스가 외부 클래스에서 정적 변수 (문자열)에 액세스 할 수 있음을 알 수 있습니다.
자바에서 정적 가져 오기
아시다시피, 일반적으로 'import'지시문을 사용하여 Java 프로그램에 다양한 패키지와 사전 정의 된 기능을 포함합니다. import 지시문과 함께 static이라는 단어를 사용하면 클래스 이름을 사용하지 않고도 클래스 기능을 사용할 수 있습니다.
예:
import static java.lang.System.*; class Main { public static void main(String() args) { //here we import System class using static, hence we can directly use functionality out.println('demonstrating static import'); } }
산출:
이 프로그램에서는 java.lang.System 클래스에 대한 정적 가져 오기를 사용합니다.
노트 : 주 함수에서 방금 out.println을 사용하여 메시지를 표시했습니다.
정적 가져 오기 기능은 코드를 더 간결하고 읽기 쉽게 만들지 만, 특히 일부 패키지에 동일한 기능이있는 경우 모호함을 만드는 경우가 있습니다. 따라서 정적 가져 오기는 매우 필요한 경우에만 사용해야합니다.
정적 vs 비 정적
Java의 Static 멤버와 Non-Static 멤버 간의 주요 차이점에 대해 설명하겠습니다.
아래에 나열된 것은 정적 및 비 정적 변수 .
정적 변수 | 비 정적 변수 |
---|---|
클래스 이름으로 만 액세스 할 수 있습니다. | 액세스하려면 클래스의 개체가 필요합니다. |
정적 및 비 정적 메서드 모두에 액세스 할 수 있습니다. | 비 정적 메서드에만 액세스 할 수 있습니다. |
정적 변수에 대한 메모리는 클래스 당 한 번만 할당됩니다. | 비 정적 변수에 대한 메모리는 객체별로 할당됩니다. |
클래스의 모든 객체가 공유합니다. | 개체 당 변수 복사본이 만들어집니다. |
전역 범위가 있으며 모든 메서드와 블록에서 사용할 수 있습니다. | 로컬 범위가 있으며 클래스의 개체에 표시됩니다. |
다음은 정적 및 비 정적 방법의 차이점입니다. .
정적 방법 | 비 정적 방법 |
---|---|
정적 키워드가 선행되고 클래스 수준에서 사용 가능한 메서드입니다. | 정적 키워드가 앞에 나오지 않고 클래스의 각 인스턴스에 사용할 수있는 메서드입니다. |
컴파일 타임 또는 초기 바인딩을 지원합니다. | 런타임 또는 동적 바인딩을 지원합니다. |
해당 클래스 및 다른 모든 클래스의 정적 데이터 멤버에만 액세스 할 수 있습니다. | 클래스 및 기타 클래스의 정적 및 비 정적 멤버에 액세스 할 수 있습니다. |
정적 메서드는 재정의 할 수 없습니다. | 재정의 할 수 있습니다. |
메모리는 한 번만 할당됩니다. 따라서 사용되는 메모리가 적습니다. | 메서드가 호출 될 때마다 메모리가 할당되기 때문에 메모리 사용량이 더 많습니다. |
정적 vs 최종
Static과 Final은 함께 사용되는 엔티티에 특별한 의미를 부여 할 수있는 Java의 두 키워드입니다. 예를 들어, 변수가 static으로 선언되면 객체에 대한 참조없이 액세스 할 수있는 클래스 변수가됩니다.
마찬가지로 변수가 final로 선언되면 불변, 즉 상수가됩니다.
기능 테스트 및 비 기능 테스트
자바에서 정적 키워드와 최종 키워드의 주요 차이점을 표로 정리해 보겠습니다.
공전 | 결정적인 |
---|---|
정적 데이터 멤버 (중첩 된 클래스, 변수 또는 메서드)는 정적 키워드가 앞에 오는 데이터 멤버이며 개체없이 액세스 할 수 있습니다. | final 키워드는 변수, 메소드, 클래스 등에 적용 할 수 있습니다. 엔티티에 제한을 부과합니다. |
선언 중에 값으로 정적 변수를 초기화하는 데 필수가 아닙니다. | 최종 변수는 선언시 값으로 초기화해야합니다. |
정적 변수를 다시 초기화 할 수 있습니다. | 최종 변수를 다시 초기화 할 수 없습니다. |
정적 메서드는 정적 멤버에만 액세스 할 수있는 메서드입니다. | 최종 메서드는 상속 / 무시할 수없는 메서드입니다. |
정적 클래스는 개체를 만들 수없는 클래스입니다. | 최종 클래스는 상속 될 수없는 클래스입니다. |
자주 묻는 질문
Q # 1) Java 클래스가 정적 일 수 있습니까?
대답: 예, Java의 클래스는 외부 클래스가 아닌 경우 정적 일 수 있습니다. 이는 Java의 중첩 클래스 만 정적 일 수 있음을 의미합니다.
Q # 2) Java에서 언제 Static을 사용해야합니까?
대답: 프로그램에서 개체에 걸쳐 값을 유지해야하는 데이터 멤버를 원할 때마다 정적을 사용해야합니다. 예를 들어, 카운터. 객체를 사용하여 호출하지 않으려는 경우 메서드를 정적으로 선언 할 수 있습니다.
Q # 3) 정적 클래스는 생성자를 가질 수 있습니까?
대답: 예, 정적 클래스는 생성자를 가질 수 있으며 그 목적은 오직 정적 데이터 멤버를 초기화하는 것입니다. 데이터 멤버에 처음 액세스 할 때만 호출됩니다. 후속 액세스를 위해 호출되지 않습니다.
Q # 4) Static Constructor의 용도는 무엇입니까?
대답: 일반적으로 생성자는 정적 데이터 멤버를 초기화하는 데 사용됩니다. 또한 한 번만 수행해야하는 작업 / 작업을 수행하는데도 사용됩니다.
Q # 5) 정적 메서드는 Java에서 상속됩니까?
대답: 예, Java의 정적 메서드는 상속되지만 재정의되지는 않습니다.
결론
이 튜토리얼에서는 데이터 멤버, 메소드, 블록 및 클래스에서의 사용법과 함께 Java의 static 키워드에 대해 자세히 설명했습니다. static 키워드는 클래스 수준 또는 전역 범위를 나타내는 데 사용되는 키워드입니다.
클래스의 인스턴스를 사용하여 정적 멤버에 액세스 할 필요가 없습니다. 클래스 이름을 사용하여 정적 데이터 멤버에 직접 액세스 할 수 있습니다. 또한 static 및 non-static 멤버와 static 및 final 키워드의 주요 차이점에 대해서도 논의했습니다.
이후 주제에서는 Java 언어에서 더 많은 키워드와 그 의미를 살펴볼 것입니다.