Static
static - 프로그램 실행 이전에 - 작성된 코드 컴파일 시 결정
dinamic - 프로그램 실행 이후에 - 메모리에 올라간 후 동작 후에 결정(로딩)
실시간 데이터 영역 - JVM이 프로그램을 수행하기 위해 OS로 부터 할당 받는 메모리 영역
여기서 우리가 작성한 코드의 데이터들은 jvm, heap, method area에 들어가게 된다.
stack에는 지역 변수
heap에는 동적 할당으로 만들어진 인스턴스
method area에는
바이트 코드로 전환된 텍스트 코드 (프로그램을 실행하기 위해선 전체 코드에 대한 바이트 코드가 메모리 공간 안에 존재해야 한다)
필드, static 변수 등이 들어간다.
프로그램이 시작되는 순간 메모리에 다 올라감 - 객체가 만들어지지 않아도 존재하는
정적으로(static) 생성된 변수는 method area에, 동적으로(new) 생성된 변수는 heap에 저장된다.
non-static member
- 객체 마다 별도로 존재하는 멤버, 메소드
- 동일 클래스로 생성한 다른 객체들에 공유되지 않음
static member
- 클래스가 로딩될 때 공간 할당
- 동일한 클래스로 생성한 다른 모든 객체에 의해 공유됨
- 객체를 생성하지 않고 사용 가능
ex) Main method - class 안에 존재하지만 해당 클래스로 생성한 객체가 따로 존재하지 않아도 JVM이 호출
class Number{
static int num = 0; //클래스 필드
int num2 = 0; //인스턴스 필드
}
public class Static_ex {
public static void main(String[] args) {
Number number1 = new Number(); //첫번째 number
Number number2 = new Number(); //두번쨰 number
number1.num++; //클래스 필드 num을 1증가시킴
number1.num2++; //인스턴스 필드 num을 1증가시킴
System.out.println(number2.num); //두번째 number의 클래스 필드 출력
System.out.println(number2.num2); //두번째 number의 인스턴스 필드 출력
}
output은
1
0
static 활용
전역 변수와 전역 함수는 static으로 클래스에 작성
java.lang.Math 라는 클래스는 자바 파일 실행시 자동으로 import되고,
클래스 안에 존재하는 스태틱 메소드들은 Math.methodName()으로 사용할 수 있다.
public class Math {
public static int abs(int a);
public static double cos(double a);
public static int max(int a, int b);
public static double random();
...
}
// 잘못된 사용법
Math m = new Math(); // Math() 생성자는 private
int n = m.abs(-5);
// 바른 사용법
int n = Math.abs(-5);
static method의 제약 조건
static method는 non-static 멤버에 접근할 수 없다.
- 객체가 생성되지 않은 상황에서도 static method는 실해될 수 있기 때문에 non-static 메소드와 필드는 사용이 불가하다. 물론 this도 생성된 객체 자기 자신을 가르키는 지시자이기 때문에 사용 불가능
class StaticMethod {
int n;
void f1(int x) {n = x;} // 정상
void f2(int x) {m = x;} // 정상
static m;
static void s1(int x) {n = x;} // 컴파일 오류
static void s1(int x) {m = x;} // 정상
static void s3(int x) {f1(3);} // 컴파일 오류
static void s4(int x) {s3(3);} // 정상
static void f3(int x) {this.n = x;} // 컴파일 오류
}
final
클래스, 메소드, 변수 앞에 붙어서 한번 선언한 내용을 변경 불가능하게 함 - 최종본이다.
final 클래스 - 클래스 상속 불가
final class FinalClass {
.....
}
class SubClass extends FinalClass { // 컴파일 오류. FinalClass 상속 불가
.....
}
fanal 메소드 - 오버라이딩 불가
public class SuperClass {
protected final int finalMethod() { ... }
}
class SubClass extends SuperClass { // SubClass가 SuperClass 상속
protected int finalMethod() { ... } // 컴파일 오류, 오버라이딩 할 수 없음
}
final 필드, 상수 선언 - 상수를 선언할 때 사용
- 선언시에 초기 값을 지정해야 한다.
- 실행 중에 값을 변경할 수 없다
public class FinalFieldClass {
final int ROWS = 10; // 상수 정의, 이때 초기 값(10)을 반드시 설정
void f() {
int [] intArray = new int [ROWS]; // 상수 활용
ROWS = 30; // 컴파일 오류 발생, final 필드 값을 변경할 수 없다.
}
}
생성자에서도 초기화가 가능하여 객체 마다 final 변수 값을 다르게 할 수 있다.
그럴 경우엔 선언시 초기화를 하면 안됨
static과 사용 함께 사용하여 동일한 클래스에 유일하게 존재하고, 변하지 않는 값을 선언 가능
class SharedClass {
public static final double PI = 3.14;
}
'CS > JAVA' 카테고리의 다른 글
자바 - 업캐스팅 & 다운캐스팅 (0) | 2022.04.13 |
---|---|
자바 - 상속 (0) | 2022.04.10 |
자바 - 접근 지정자 (0) | 2022.04.07 |
자바 - this와 생성자 오버로딩 (0) | 2022.04.06 |
자바 - 배열 & 객체 레퍼런스, Garbege Collection (0) | 2022.04.06 |