많은 프로그래머가 '정적 컨텍스트에서 비정적 메서드를 참조할 수 없음 오류 메시지에 직면합니다. ' 코딩할 때. 이 오류 메시지는 구체적이지 않으며 오류 조건이 참인 경우 모든 IDE에서 발생할 수 있습니다.
이것은 프로그래머가 클래스의 인스턴스를 만들지 않고 '정적으로' 클래스를 사용하려고 하는 초보자에게 매우 흔한 실수입니다. 정적 클래스를 사용할 때 충족되어야 하는 몇 가지 조건이 있습니다. 이 기사에서는 다양한 사례를 살펴보고 정적 클래스를 사용하는 방법을 안내합니다.
정적 방법이란 무엇입니까?
메소드에 'static' 키워드를 추가하면 메소드가 정적 메소드로 알려집니다. 정적 메서드는 객체(표준)에 속하지 않고 클래스에 속합니다. 정적 메서드는 클래스의 인스턴스를 생성하지 않고도 쉽게 호출할 수 있습니다.
Static 메서드에는 여러 가지 다른 용도가 있습니다. 예를 들어 이를 사용하면 정적 데이터 멤버와 해당 값을 변경할 수 있습니다. 그러나 Static 메서드를 사용할 때는 여전히 몇 가지 제한 사항이 있습니다. 예를 들어 클래스의 비정적 필드에 액세스하려면 비정적 메서드를 사용해야 합니다. 요약하자면 Static 메서드는 거의 사용되지 않지만 이점이 있습니다.
다음은 정적 메서드를 사용하여 모든 개체의 속성을 변경하는 방법에 대한 간단한 예입니다.
class Students{ int roll_no; String name; static String college = "InformationTech"; static void change(){ college = “Management"; } Students (int number, String name_self){ roll_no = number; name = name_self; } void display (){System.out.println(rollno+" "+name+" "+college);} public static void main(String args[]){ Students.change(); Students stu_1 = new Students (100,"Mexican"); Students stu_2 = new Students (202,"American"); Students stu_3 = new Students (309,"British"); stu_1.display(); stu_2.display(); stu_3.display(); } }
프로그램의 출력은 다음과 같습니다.
100 Mexican Management 202 American Management 309 British Management
클래스와 클래스 인스턴스의 차이점은 무엇입니까?
거리를 걷다가 차를 본 적이 있다고 생각하십시오. 이제 모델이나 유형을 모르더라도 이것이 자동차라는 것을 즉시 알 수 있습니다. 이것은 이미 여러분이 알고 있는 '자동차'의 부류에 속한다는 것을 알기 때문입니다. 여기에서 수업을 템플릿이나 아이디어로 생각하십시오.
이제 가까이 다가가면 자동차의 모델과 제조사가 보입니다. 여기서 당신은 'car' 클래스를 'instance'로 인식하고 있습니다. 여기에 모든 속성이 자세히 표시됩니다. 바퀴, 마력, 림 등.
속성의 예는 'car' 클래스가 모든 자동차에 바퀴가 있어야 한다고 명시하는 것일 수 있습니다. 보고 있는 자동차(자동차 클래스의 예)에는 합금 림이 있습니다.
객체 지향 프로그래밍에서는 클래스를 직접 정의하고 클래스 내부에서 '색상' 유형의 필드를 정의합니다. 클래스가 인스턴스화될 때마다 백엔드에서 색상에 대한 메모리가 자동으로 예약되고 나중에 특정 값(예:빨간색)을 지정할 수 있습니다. 이러한 속성은 특정하므로 고정적이지 않습니다.
대조적으로, 정적 메소드와 필드는 모든 인스턴스와 공유됩니다. 이것들은 인스턴스 자체가 아니라 클래스에 특정한 값이나 항목을 위해 만들어집니다. 메소드의 경우 전역 메소드(예:stringtoInt 변환기)가 있을 수 있고 필드의 경우 일반적으로 코드에 따라 상수입니다(예:일반 자동차만 제조하는 경우 자동차 유형은 정적일 수 있음).
이제 코딩이 잘못될 수 있는 모든 다양한 경우를 살펴보고 이를 수정하기 위한 해결 방법을 살펴보겠습니다.
문제 1:존재하지 않는 것을 호출하고 있습니다.
사용자가 정적 및 비정적 방법을 모두 사용하는 경우가 있었습니다. 이 작업을 수행할 때 어떤 메서드가 무엇을 호출하는지(정적이든 아니든) 주의해야 합니다. 다음 코드를 살펴보세요.
private java.util.List<String> someMethod(){ /* Some Code */ return someList; } public static void main(String[] strArgs){ // The following statement causes the error. You know why.. java.util.List<String> someList = someMethod(); }
여기서 정적 메서드는 someMethod를 호출합니다. 객체 지향 프로그래밍에서 우리는 우리가 작업하고자 하는 데이터와 함께 데이터를 캡슐화합니다. 여기서 객체가 없으면 인스턴스 데이터도 없고 인스턴스 메서드가 클래스 정의의 일부로 존재하지만 데이터를 제공할 객체 인스턴스가 항상 있어야 합니다.
요약하자면 존재하지 않는 것을 부를 수는 없습니다. 객체를 생성하지 않았을 수 있으므로 비정적 메서드는 아직 존재하지 않습니다. 그러나 반면에 정적 메서드는 항상 존재합니다(정의 때문에).
문제 2:메서드가 정적으로 설정되지 않음
메서드의 인스턴스를 생성하지 않고 정적 기본 메서드에서 메서드를 호출하는 경우 오류 메시지가 표시됩니다. 여기에서도 동일한 원칙이 적용됩니다. 존재하지 않는 것에 접근할 수 없습니다.
public class BookStoreApp2 { //constants for options Scanner input = new Scanner (System.in); public static void main(String[] args) { BookStoreItem[] item;//declaring array item = new BookStoreItem[10];//initializing array int itemType = -1; printMenu(); getUserChoice(); for (int i = 0; i < item.length; i++){ }//end of switch statement }//end of for loop for (int i = 0; i < item.length; i++) { }//end of for }//end of main method
여기 이 코드에서 printMenu() 두 메서드를 모두 변환해야 합니다. 및 getUserChoice() 정적 메서드로.
따라서 이와 같은 상황을 피하려면 생성자를 사용할 수 있습니다. 대신에. 예를 들어, main() 메서드의 내용을 가져와서 생성자 안에 넣을 수 있습니다.
public BookStoreApp2() { // Put contents of main method here} After doing this, do the following inside your main() method: public void main( String[] args ) { new BookStoreApp2(); }
이 팁이 작동하지 않거나 코드가 다른 경우 Static 클래스 및 메서드의 기본 원칙을 염두에 두고 코드를 다시 검사하여 기본 원칙을 위반하지 않았는지 확인해야 합니다.