English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Java에서의 클래스는 static(클래스), 인스턴스, 지역 변수 세 가지 변수를 가지게 됩니다.
지역 변수-이 변수들은 메서드에 속합니다/블록/생성자에서 선언/정의. 이 변수들의 범위는 메서드(또는 블록 또는 생성자) 내에 위치하며, 실행后被 소멸됩니다.
인스턴스 변수-이 변수들은 클래스의 인스턴스(객체)에 속합니다. 이들은 클래스 내에서 메서드 외에 선언되며, 클래스를 인스턴스화할 때 초기화됩니다. 이들은 특정 클래스의 모든 메서드, 생성자 또는 블록에서 접근할 수 있습니다.
인스턴스 변수에 접근하려면 객체를 사용해야 합니다. 즉, 인스턴스 변수에 접근하려면, 해당 클래스의 객체를 생성하고, 그 객체를 사용하여 이 변수에 접근해야 합니다.
클래스/靜적 변수-클래스/靜적 변수는 클래스에 속하며, 인스턴스 변수와 마찬가지로, 클래스 내에서 메서드 외에 선언됩니다. 그러나 static 키워드를 사용하여 선언됩니다.
그들은 컴파일 시에 접근할 수 있으며, 인스턴스화하기 전에/클래스를 인스턴스화하지 않고 접근할 때, 클래스 전체에 단 하나의静态 필드 복사본이 사용 가능하며, 즉,静态 필드의 값은 모든 객체에서 동일합니다. static 키워드를 사용하여静态 필드를 정의할 수 있습니다.
위와 같이, 클래스 이름을 사용하여(접근)靜적 변수를 사용합니다.
System.out.println(MyClass.data);
즉, 변수에 대한靜적 참조는 클래스 이름을 사용하는 것을 의미합니다.
또한, 인스턴스 변수에 접근하려면 객체를 생성해야 합니다. 이 객체는 인스턴스화되기 전까지 메모리에서 사용할 수 없습니다.
그래서, Java에서는靜적 필드(변수)를靜적 참조로 사용할 수 없습니다. 그렇지 않으면, 이렇게 시도해 보세요. 그렇게 하면 컴파일 시에 오류가 발생하며, '靜적 컨텍스트에서靜적 변수 수학을 참조할 수 없음'이라는 메시지가 표시됩니다.
Java 프로그램을 따라 사용자 마크를 받아들이고 그가 승진했는지 확인합니다.
여기서 우리는 static 메서드 wasPromroted()에서, 인스턴스 변수에 직접 접근합니다(이름만 지정하면 됩니다. 스태틱 변수처럼). 이를 허용하지 않기 때문에 컴파일 시에 오류가 발생합니다.
import java.util.Scanner; public class StudentMarks { Scanner scan1 = new Scanner(System.in); private double math; private double science; private double english; public StudentMarks(double math, double science, double english) { this.math = math; this.science = science; this.english = english; } public static boolean wasPromroted(StudentMarks marks) { if(math >=85 && science >=75 && english >=65) { return true; } return false; } public static void main(String args[]) { Scanner sc = new Scanner(System.in); System.out.println("당신의 수학 점수를 입력하세요: "); double math = sc.nextDouble(); System.out.println("당신의 과학 점수를 입력하세요: "); double science = sc.nextDouble(); System.out.println("당신의 영어 점수를 입력하세요: "); double english = sc.nextDouble(); StudentMarks marks = new StudentMarks(math, science, english); boolean bool = wasPromroted(marks); if(bool) { System.out.println("축하합니다. 승진을 축하합니다."); } else { System.out.println("죄송합니다. 다시 시도해 주세요."); } } }
출력 결과
StudentMarks.java:16: error: non-static variable math cannot be referenced from a static context if(math >=85 && science >=75 && english >=65) ^ StudentMarks.java:16: error: non-static variable science cannot be referenced from a static context if(math >=85 && science >=75 && english >=65) ^ StudentMarks.java:16: error: non-static variable english cannot be referenced from a static context if(math >=85 && science >=75 && english >=65) ^ 3 errors
이 프로그램이 정상적으로 작동하려면, 인스턴스 변수를 스태틱으로 선언하거나, 메서드 내에서 객체를 참조해야 합니다.
import java.util.Scanner; public class StudentMarks { Scanner scan1 = new Scanner(System.in); private double math; private double science; private double english; public StudentMarks(double math, double science, double english) { this.math = math; this.science = science; this.english = english; } public static boolean wasPromroted(StudentMarks marks) { if(marks.math >=85 && marks.science >=75 && marks.english >=65) return true; return false; } public static void main(String args[]) { Scanner sc = new Scanner(System.in); System.out.println("당신의 수학 점수를 입력하세요: "); double math = sc.nextDouble(); System.out.println("당신의 과학 점수를 입력하세요: "); double science = sc.nextDouble(); System.out.println("당신의 영어 점수를 입력하세요: "); double english = sc.nextDouble(); StudentMarks marks = new StudentMarks(math, science, english); boolean bool = wasPromroted(marks); if(bool) { System.out.println("축하합니다. 승진을 축하합니다."); } else { System.out.println("죄송합니다. 다시 시도해 주세요."); } } }
출력 결과
당신의 수학 점수를 입력하세요: 89 당신의 과학 점수를 입력하세요: 85 당신의 영어 점수를 입력하세요: 86 축하합니다. 승진을 축하합니다.