정적 멤버 선언
- 정적 멤버: 메소드 영역의 클래스에 고정적으로 위치하는 멤버
출처, 이것이 자바다
- static 키워드를 추가해 정적 필드와 정적 메소드로 선언
출처, 이것이 자바다
정적 멤버 사용
- 클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있음
- 클래스 이름과 함께 도트(.) 연산자로 접근
출처, 이것이 자바다
출처, 이것이 자바다
- 정적 필드와 정적 메소드는 객체 참조 변수로도 접근(오해의 소지가 있어서 권장안함)
package ch06.sec10.exam01;
/*
정적(static)멤버 : 필드와 메소드
*/
public class Calculator {
//정적필드
static double pi = 3.14159;
//정적메소드
static int plus(int x, int y) {
return x + y;
}
static int minus(int x, int y) {
return x - y;
}
}
package ch06.sec10.exam01;
public class CalculatorExample {
public static void main(String[] args) {
//main메소드에 의하여 실행시, JVM 이 Calculator클래스의 static멤버를 찾는다.
//그리고, method area(static area)에 static멤버들에 대한 메모리를 생성한다.
//인스턴스 멤버가 존재하지 않으므로, 객체생성을 할수가 없다.
//정적멤버 접근
double result1 = 10 * 10 + Calculator.pi;
int result2 = Calculator.plus(10, 5);
int result3 = Calculator.minus(10, 5);
System.out.println("result1: " + result1);
System.out.println("result2: " + result2);
System.out.println("result3: " + result3);
//객체를 생성하여, 정적멤버도 접근은 가능하도록 되어있지만, 오해 소지가 있어 권장은 안한다.
//힙영역의 메모리에는 static멤버의 기억장소는 존재하지 않는다.
Calculator cal = new Calculator();
double result4 = 10 * 10 + cal.pi;
int result5 = cal.plus(10, 5);
int result6 = cal.minus(10, 5);
System.out.println();
System.out.println("result4: " + result4);
System.out.println("result5: " + result5);
System.out.println("result6: " + result6);
}
}
정적 블록
- 정적 필드를 선언할 때 복잡한 초기화 작업이 필요하다면 정적 블록을 이용
출처, 이것이 자바다
- 정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행
- 정적 블록이 클래스 내부에 여러 개가 선언되어 있을 경우에는 선언된 순서대로 실행
- 정적 필드는 객체 생성 없이도 사용할 수 있기 때문에 생성자에서 초기화 작업을 하지 않음
package ch06.sec10.exam02;
/*
static 블록 또는 메소드에서는 인스턴스 멤버들을 호출이 불가능.
이유는? static메소드 또는 블록이 먼저 생성되어 실행되는 시점에는
인스턴스 기억장소는 존재하지 않기때문이다.
*/
public class Television {
//1)static 멤버필드는 method area에 기억장소 생성
static String company = "MyCompany";
static String model = "LCD";
static String info;
int a; //인스턴스 멤버는 new 작업대상
//정적블록 : static 멤버필드를 초기화작업, 2)자동호출
static {
//중단점
info = company + "-" + model;
//문법에러발생 이유는? new생성자작업구문보다 static작업이 먼저실행되어
//int a에 대한 힙영역의 기억장소가 존재안하는 상태에서 호출하여 실행하기 때문에 컴파일 에러 발생
//int = 10;
}
}
package ch06.sec10.exam02;
public class TelevisionExample {
public static void main(String[] args) {
//디버깅 진행시 실행이 누가 먼저되는지 확인하면 도움이 된다.
//중단점
Television tv = new Television();
System.out.println(Television.info);
}
}
인스턴스 멤버 사용 불가
- 정적 메소드와 정적 블록은 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없으며 this도 사용할 수 없음
- 정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근
출처, 이것이 자바다
package ch06.sec10.exam03;
/*
* 설계도에 해당하는 라이브러리 Car클래스 + 실행 클래스(main)
*/
public class Car {
//인스턴스 필드선언
int speed;
//인스턴스 메소드 선언
void run() {
System.out.println(speed + "으로 달립니다.");
}
static void simulate() {
//객체생성 myCar객채이름은 이 메소드안에서만 인식되므로 28라인의 이름과는 충돌되지 않는다.
Car myCar = new Car();
myCar.speed = 200;
myCar.run();
//인스턴스 멤버는 아직 메모리 생성되기전 상태이무로 직접호출할 수가 없다.
// speed = 100;
// run();
}
//main 메소드는 Car클래스안에 작성은 되어있지만, 독립적인 요소로 바라본다.
public static void main(String[] args) {
//Car.simulate();
simulate(); //클래스명 생략가능하다.
Car myCar = new Car();
myCar.speed = 60;
myCar.run();
}
}
'객체 지향 프로그래밍 - 클래스' 카테고리의 다른 글
패키지 (0) | 2023.01.17 |
---|---|
final 필드와 상수 (0) | 2023.01.16 |
인스턴스 멤버 (0) | 2023.01.16 |
메소드 선언과 호출 (0) | 2023.01.16 |
생성자 선언과 호출 (0) | 2023.01.16 |