JAVA
JAVA static이란?
signal시노
2024. 7. 11. 14:44
대부분 알 것이다.
전역 변수(메소드)이고, 메모리를 아낄 수 있으며 인스턴스 없이 접근할 수 있다.
알고는 있지만 왜 써야하며 어떻게 써야 하는가?
원의 반지름의 정보가 있는 클래스가 있고 원의 넓이와 둘레를 구할 수 있어야 한다.
public class Circle {
private double radius;
public static final double PI = 3.14;
public Circle() {
}
public Circle(Double radius) {
this.radius = radius;
}
public Circle(int radius) {
this.radius = (double)radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public void setRadius(int radius) {
this.radius = (double)radius;
}
public double getArea() {
return PI * radius * radius;
}
public double getCircum() {
return PI * 2 * radius;
}
public static void main(String[] args) throws Exception {
Circle c = new Circle();
Circle c2 = new Circle(3);
c2.getArea();
c2.getCircum();
c.setRadius(2.1);
c.getArea();
c.getCircum();
}
}
3.14라는 pi값을 public static final로 지정하였다.
pi는 3.14라는 변하지 않는 상수이기 때문에 값을 쓰지(write) 못하게 하기 위해 final이고,
전역 어디서든 쓸 수 있게 static이며,
getter 메소드를 통해 호출할 수도 있지만 상수이기 때문에 public으로 하여 직접 호출로 호출자 입장에서 더 편리함을 준다.
그렇다면 어떻게 객체 없이 직접 호출할 수 있을까?
맨 위는 Global 영역, 가운데는 Heap, 맨 밑은 Stack 영역이다.
main 메소드에서 Circle 타입의 객체를 생성한다.(c1, c2)
c1, c2에는 Heap에 생성된 메모리의 위치를 찾아가기 위한 참조값을 갖고 있다.
main 메소드를 실행하면 참조값이 생성되어 변수에 저장되고 Heap 메모리에 객체의 정보가 올라간다.
그런데 그 이전에 JVM(자바가상머신)이 어플리케이션이 실행되면 static형 변수, 메소드들을 Global 영역에 클래스 이름을 갖고 올려놓는다.
그러기 때문에 클래스명.변수(메소드)를 통해 전역에서 사용할 수 있는 것이다.
다음에 조금 더 자세히 알아보자