static변수와 static 메소드
- static은 고정된 것이란 의미를 가지고 있다
- static 키워드를 이용해서 static 변수와 static메소드를 만들 수 있다
- static변수와 static메소드는 클래스변수와 클래스메소드라고 부른다
- 클래스변수와 클래스메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버다.
클래스 로더가 클래스를 로딩해서 메모리 영역에 적재할 때 클래스 별로 관리하는데, 클래스의 로딩이 끝나는 즉시 클래스변수와 클래스메소드는 사용할 수 있게 된다
static 영역 | stack 영역 | heap 영역 |
클래스가 할당된다 | 지역변수가 할당된다 | 객체가 할당된다 |
가비지 컬렉터가 메모리를 관리하지 않음 | 매개변수가 할당된다 | 가비지 컬렉터가 메모리를 관리한다 |
프로그램 종료될 때까지 메모리에 유지된다 | 닫는 괄호를 만나면 사라진다 | 아무도 참조하지 않으면 가비지가 된다 |
클래스로더 : 클래스파일을 메모리에 로딩하는 프로그램
수행문에 클래스 이름이 등장할 때 클래스 로더가 클래스 파일을 메모리에 로딩한다.
클래스의 로딩이 완료되면 클래스변수와 클래스메소드는 즉시 사용가능하다 (객체 생성 하지 않아도 생성가능)
클래스변수 선언과 사용
구분 | 문법 |
클래스변수 선언 | static 데이터타입 변수명; |
클래스변수 선언 | static 데이터타입 변수명 = 값; |
클래스변수 사용 | 클래스이름.변수명 |
public class Sample {
// 정적변수 선언하기
// static 데이터타입 변수명
// 클래스 변수
static int x;
static int y = 10;
// 인스턴스 변수
int z;
}
public static void main(String[] args) {
// 클래스변수 사용하기
Sample.x = 100;
// 클래스변수 사용하기
// 객체 생성할 필요가 없다
System.out.println(Sample.x);
System.out.println(Sample.y);
// 인스턴스 변수 사용하기
// 객체 생성을 하고 사용해야 한다
Sample s = new Sample();
s.z = 200;
System.out.println(s.z);
}
클래스메소드 선언과 사용 및 인스턴스 메소드와의 차이점
구분 | 문법 |
클래스메소드 선언 | static 반환타입 메소드명(타입 변수, 타입변수, ...) { ... } |
클래스메소드 사용 | 클래스이름.메소드명(매개변수, 매개변수, ...); |
클래스메소드와 인스턴스 메소드의 차이
구분 | 클래스메소드 | 인스턴스메소드 |
사용시점 | 클래스 로딩 즉시 | 객체 생성 후 |
클래스변수 | 사용가능 | 사용가능 |
클래스메소드 | 사용가능 | 사용가능 |
인스턴스변수 | 사용불가능 | 사용가능 |
인스턴스메소드 | 사용불가능 | 사용가능 |
package static1;
public class StaticSample {
int x;
static int y;
public void m1() {
// 인스턴스 메소드에서는 인스턴스 변수, 클래스 변수를 사용할 수 있다.
x = 10;
StaticSample.y = 20;
}
public void m2() {
// 인스턴스 메소드에서 인스턴스 메소드, 클래스 메소드를 사용할 수 있다.
m1();
StaticSample.m3();
}
public static void m3() {
// 클래스 메소드에서는 인스턴스 변수를 사용할 수 없다.
// x = 10; 오류
// 클래스 메소드에서는 클래스 변수를 사용할 수 있다
StaticSample.y= 20;
}
public static void m4() {
// 클래스 메소드에서는 인스턴스 메소드를 사용할 수 없다
// m1(); 오류
// 클래스 메소드에서는 클래스 메소드를 사용할 수 있다
StaticSample.m3();
}
}
클래스변수와 클래스 메소드의 활용
클래스변수
- 클래스변수는 상수를 선언할 때 사용한다
- 상수는 한 번 정해진 값을 변경할 수 없는 저장소
// 상수 선언하는 예제코드
public class FileUploader {
// 상수 정의하기
static final long MAX_FILE_UPLOAD_SIZE = 1024*1024*10;
static final String FILE_UPLOAD_PATH = "/appliation/resources/images"
}
클래스메소드
- 클래스메소드는 유틸리티 클래스에서 주로 사용된다.
- 유틸리티 클래스의 메소드들은 인스턴스 변수와 상호작용이 없고, 여러 객체에서 자주 사용하는 기능들의 모음
- 대표적인 유틸리티 클래스는 java.lang.Math, java.util.Arrays, java.util.Collections, java.util.Objects 등의 클래스
// 유틸리티 클래스의 클래스메소드 예제코드
public static void main(String[] args) {
double result1 = Math.random();
double result2 = Math.ceil(2.3);
double result3 = Math.floor(2.3);
int[] numbers = {4, 1, 7, 4, 8, 2, 9, 5};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));
}
'Java' 카테고리의 다른 글
Java_오버라이딩, 추상화, 다형성(oop) (0) | 2023.11.09 |
---|---|
Java_상속, Object, 클래스 형변환(oop) (0) | 2023.11.08 |
Java_생성자, 메소드 예시(oop) (0) | 2023.11.02 |
Java_클래스와 메소드, 오버로딩(oop) (0) | 2023.11.01 |
Java_객체지향프로그래밍 (oop) (0) | 2023.11.01 |