static (O)
- 클래스변수, 클래스메소드가 된다
- class 소속 (붕어빵틀 소속)
static (X)
- instance 이다.
- Object 소속이다. (붕어빵 소속) : object 마다 다름
- instance 변수 : 특정 instance(object)에 속해있다.
- instance 메서드 : class의 instance(object)를 통해 실행된다.
인스턴스의 생성과 상관없이 사용할 수 있다.
클래스 이름으로 참조된다. ex) 클래스이름.static변수명
class의 모든 instance들에 의해 공유된다.
heap에 메모리가 잡힌다(라고 설명들었지만 heap이 아닌 데이터 영역에 메모리가 생성된다)
static 변수의 함수도 static이다.
public class Student {
private static int serialNum =1000; // 기준점
private int studentID;
public String studentName;
public Student(String name) {
studentName = name;
serialNum++;
studentID=serialNum;
}
//private으로 선언한 studentID, serialNum을 읽기위한 get 메서드
public int getStudentID() {
return studentID;
}
public static int getSerialNum() {
return serialNum;
}
}
public class Main {
public static void main(String[] args) {
Student s1 = new Student("Lee");
System.out.println(Student.getSerialNum()); //1001
Student s2 = new Student("Son");
System.out.println(Student.getSerialNum()); //1002
System.out.println(s2.getStudentID()); //1002
System.out.println(s1.getStudentID()); //1001
}
}
클래스 이름으로 참조된다. ex) 클래스이름.메서드이름
인스턴스 생성여부에 상관없다.
static변수는 사용가능하다.
지역변수는 사용가능하다. (함수안에서만 사용하고 소멸되는 변수이기때문에)
멤버변수는 사용가능하지않다.
public static int getSerialNum() {
int i=0; // 지역변수
studentName = "Lee"; // 멤버변수
return serialNum;
}
main 메서드가 선언된 class 안에서 선언된 class method는 main method에서 호출시, 클래스명 없이 메서드 명으로만 호출 가능하다
ex) classMethod();
main method 안에서 선언된 변수들은 로컬 변수로 인식되어 main method 사용 할때만 stack 메모리에 생성된다
일반적으로 main method는 public class에 사용된다.
public class Main {
public static void classMethod() {
System.out.println("클래스 메소드 호출 ");
}
public void instanceMethod() {
System.out.println("인스턴스 메서드 호출 ");
}
public static void main(String[] args) {
classMethod();
Main.classMethod();
Main m = new Main();
m.instanceMethod();
}
}
main이 static 이라고 모든 메서드에 static을 붙여주면 안된다. 🤥
public class Circle {
double radius;
static int numberOfObjects=0;
static int getNumberOfObjects() {
return numberOfObjects;
}
double getArea(){
return radius*radius*Math.PI;
}
public static void main(String[] args){
Circle c1 = new Circle();
c1.radius = 9;
int m =getNumberOfObjects();
//1번
// getArea(); -> static 메서드가 아니기때문에 이건 오류
//2번
double a =c1.getArea();
System.out.println(m+","+a);
}
}