static
클래스 변수
- static 변수 = 공유 변수 = class 변수 = 정적 변수
- 함수와 변수에만 사용된다.
- static = 먼저(new 객체 생성보다 먼저) method area에 한번만 올려 공유
- Class 변수의 접근 방법
- class 내부에서 이름을 통한 접근
- 외부에서 instance 객체의 이름을 통한 접근
- 외부에서 class 이름을 통한 접근
class InstCnt {
static int instNum = 0;
// class 변수의 접근 방법
InstCnt(){
instNum++; // class 내부에서 이름을 통한 접근
System.out.println("create an instance: " + instNum);
}
}
public class CircleMain {
public static void main(String[] args) {
InstCnt cnt1 = new InstCnt(); // Class 선언할 때 class 내부의 변수와 함수를 읽어들일 때 static이 있는지 확인한다.
InstCnt cnt2 = new InstCnt();
InstCnt cnt3 = new InstCnt();
cnt1.instNum++; // 외부에서 instance 객체의 이름을 통한 접근 -> 비추천 방법
InstCnt.instNum++; // 외부에서 클래스의 이름을 통한 접근
}
}
클래스 변수의 초기화 시점과 초기화 방법
- 클래스 변수 활용의 예
- 인스턴스 별로 가지고 있을 필요가 없는 변수
- 값의 참조가 목적인 변수
- 값의 공유가 목적인 변수
- 활용 예시) main method, System.out.println(), Math.PI
- 그리고 값이 외부에서도 참조하는 값이라면
public
으로 선언한다. 메모리 절감 효과
Instance 변수 또는 함수가 static 함수에 못들어가는 이유
- 메모리에 올라가는 순서가 다르기 때문에 없는 값을 참조할 수가 없다.
class NumberPrinter {
private int myNum = 0;
static void showInt(int n) {
myNum = 10; // static이 먼저 method area에 올라가 있기 때문에 myNum을 인식할 수 가 없다. myNum은 객체 생성을 해야지만 메모리에 할당 되기 때문
System.out.println(n);
}
static void showDouble(double n) {
System.out.println(n);
}
void setMyNumber(int n) {
myNum = n;
}
void showMyNumber() {
showInt(myNum);
}
}
클래스 메소드
- 단순 기능 제공이 목적인 메소드들, 인스턴스 변수와 관련 지을 이유가 없는 메소드들은 static으로 선언하는 것이 옳다. => 인스턴스 변수를 사용할 필요가 없을 때
Main method
public static void main(String[] arg){
//Main method
}
- 주체가
JVM
- 다른 패키지에서도 호출할 수 있도록 public 선언
- 다른 메소드를 호출해서 실행시켜야 하기 때문에 static으로 선언
Method Overloading
- 호출된 메소드를 찾을 때 참조하게 되는 두 가지 정보
- 메소드의 이름
- 메소드의 매개변수 정보
따라서 이 둘 중 하나의 형태가 다른 메소드를 정의하는 것이 가능하다.
- 같은 이름의 함수를 사용하는 것
- 대표적인 함수는 System.out.println();
//Method overloading = 같은 함수 이름을 사용할 수 있다. (매개 변수의 데이터 타입 또는 갯수 다르다면)
class A{
public void a() {
System.out.println("method a");
}
public void a(int a) {
System.out.println("method a "+a);
}
public void a(double a) {
System.out.println("method a double "+a);
}
public void a(int a, int b) {
System.out.println("method a "+(a+b));
}
}