사용 제한자 ( Usage Level Modifier ) - static
- static 제한자는 변수, 메서드에 적용되는 자바의 키워드이다.
- static method 나 변수(Varicable)는 해당 클래스의 객체 없이도 참조가 가능하다.
- static block 안에는 static 변수만 사용해야하고, static 메서드만 호출이 가능하다.
- 즉, static block에서 non-static 멤버를 객체 생성 없이 직접 참조가 불가하다.
- 지정된 변수와 메서드를 객체와 무관하게 만들어주기 때문에 this 를 가질 수 없다.
- non-static 메서드로 재정의(Overriding) 될 수 없다.
- 대표적인 static 메서드는 애플리케이션의 main() 메서드이다.
- 단순 block { } 을 사용한 경우 : 정적 초기화라고 한다.
- static 변수를 초기화하는 역할을 가지고 클래스가 로딩될 때 main() 메서드가 있더라도 그보다 앞서 딱 한 번 실행
- Calculator.class
public class Calculator {
/*
* 객체에서 서로 다른값을 가져야 하는 경우는 일반 멤버변수가 됩니다.
*/
private int result;
private String color;
/*
* 객체마다 동일한 값을 가져야하는 경우는 static변수가 됩니다.
*/
public static double pi = 3.14;
/*
* 일반 변수를 참조하는 메서드는 일반메서드 됩니다. (static x)
*/
public int add(int a) {
result += a;
return result;
}
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
/*
* 메서드 안에서 일반 멤버변수를 쓰지 않고, 범용성있게 사용할 메서드는 static을 붙이면 됩니다.
*/
//원의 넓이
public static double circle(int radius) {
return radius * radius * pi;
}
}
- Computer.Class
public class Computer {
public static String company;
public int price;
//정적 초기화자 - 단 1번만 실행됩니다.
static {
//this.company = "LG"; //this키워드 사용불가
company = "LG";
System.out.println("정적초기화자 1번 실행됨");
}
public Computer(int price) {
this.price = price; //일반변수 초기화
//this.company = "LG";
}
}
- Main.Class
public class MainClass {
public static void main(String[] args) {
/*
* 1. 녹색 계산기 1개, 빨강색 계산기 1개 생성
* 2. 계산기 색상 확인
* 3. add(int a)메서드를 추가(result누적)
* 4. pi변수를 사용해서 원의 넓이
* 5. circle() 사용해서 원의 넓이
*/
Calculator cal1 = new Calculator();
cal1.setColor("green");
Calculator cal2 = new Calculator();
cal2.setColor("red");
System.out.println("1번계산기:" + cal1.getColor() );
System.out.println("2번계산기:" + cal2.getColor() );
//static변수, static메서드
System.out.println("원의넓이:" + 3 * 3 * Calculator.pi );
System.out.println("원의넓이:" + Calculator.circle(3) );
System.out.println("--------------------------------------");
//정적초기화자는 클래스가 불려나올때 단 1번만 실행.
//Computer com1 = new Computer(1000);
//Computer com2 = new Computer(2000);
//Computer com3 = new Computer(3000);
System.out.println( Computer.company );
}
}
정적 변수 ( static field )
- static 변수는 모든 객체들이 공유하는 공유변수가 된다.
- 객체 생성 없이 클래스 이름만으로 참조가 가능하다.
- Count.class
public class Count {
public int a; //일반변수
public static int b; //정적변수(객체들마다 공유하는 값)
}
- Main.Class
public class MainClass {
public static void main(String[] args) {
Count c1 = new Count();
c1.a++;
c1.b++;
System.out.println("일반변수:" + c1.a);
System.out.println("정적변수:" + c1.b);
Count c2 = new Count();
c2.a++;
c2.b++;
System.out.println("일반변수:" + c2.a);
System.out.println("정적변수:" + c2.b);
Count c3 = new Count();
c3.a++;
c3.b++;
System.out.println("일반변수:" + c3.a);
System.out.println("정적변수:" + c3.b);
//현재 c1.b 는 몇일까요?
//현재 c2.b 는 몇일까요?
System.out.println("현재c1.b:" + c1.b);
System.out.println("현재c2.b:" + c2.b);
//1. static변수 객체들 사이에서 동일한 값을 갖게 한다.
//2. static변수는 객체 바깥에 생성되므로, 객체 생성 없이 접근이 가능합니다.
// 클래스명.변수명
c3.b = 100;
Count.b++;
c1.b = 3;
System.out.println( Count.b ); //3
}
}
정적 메서드 ( Static Method )
- static 메서드는 static 변수와 마찬가지로 해당 클래스의 객체 생성 없이도 참조가 가능하다.
- static 메서드에서 멤버 참조시 주의 사항은 "static메서드안에서는 non-static멤버를 객체 생성없이 참조 불가하다" 다.
- static 메서드안에서는 static 변수를 선언할 수 없다.
- Count.class
public class Count {
public int a; //일반변수
public static int b; //정적변수
//일반메서드 - 일반변수, 정적변수 모두 사용이 됩니다.
public int method() {
a = 10;
b++;
return b;
}
//정적메서드 - static멤버반 사용이 됩니다.
public static int method2() {
//a = 10; //- 단, 방법이 있죠
//객체를 생성해서는 접근이 됩니다.
Count c = new Count();
c.a = 10;
b++;
return b;
}
}
- Main.Class
import java.util.Arrays;
public class MainClass {
public static void main(String[] args) {
//main은 static입니다
//a변수를 사용하고 싶으면 객체생성을 해서 사용함.
Count c = new Count();
c.method();
//static멤버를 호출할 때
Count.b++;
Count.method2();
//현재 b는 몇일까요? 3
Math.random();
String.join("-", "010", "1234", "5678");
Integer.parseInt("3");
}
}
정적 초기화자 ( static Initializer )
- 정적 초기화자는 static 변수들의 초기화에 사용합니다. 일반 멤버변수는 생성자에서 초기화하지만
static 변수는 객체 생성 없이도 사용해야하므로 생성자를 통해 초기화가 불가하다. - static 변수는 정적 초기화자를 통해 초기화 한다.
- 정적 초기화자는 클래스가 로딩될 때 생성자와 main() 메서드에 앞서 오직 단 한번만 실행
▶ 애플리케이션 실행 중 반드시 한 번만 실행될 로직이 있다면 이곳에서 기술하여 실행한다.
728x90
'Programming > Java' 카테고리의 다른 글
[JAVA] Final 과 Abstract(추상화) (0) | 2023.11.30 |
---|---|
[JAVA] SingleTon Design Pattern (0) | 2023.11.30 |
[JAVA] 다형성 (1) | 2023.11.14 |
[JAVA] 접근 제한자 (0) | 2023.11.13 |
[JAVA] 패키지와 상속 (0) | 2023.11.10 |