static 선언 클래스 변수
클래스 변수 : 인스턴스의 생성과 상관 없이 존재하는 변수
인스턴스 생성하지 않아도 호출 가능하다
static로 선언된 변수는 변수가 선언된 클래스의 모든 인스턴스를 공유하는 변수이다
int num = 0; - > 인스턴스 변수
static int num = 0; -> 클래스 변수
class InstCnt {
static int instNum = 0;
void InstCnt2() {
instNum++;
System.out.println(instNum);
}
}
public class callStatic {
public static void main(String[] arg) {
InstCnt AA= new InstCnt();
AA.InstCnt2(); //1
AA.InstCnt2(); //2
AA.InstCnt2(); //3
}
}
인스턴스를 생성할 때 마다 num이 1씩 올라간다
클래스 변수 초기화하는 방법 : 인스턴스 선언할 때 =0으로 생성한다
void InstCnt3() {
instNum = 0 ;
System.out.println(instNum);
}
static 선언 클래스 메소드
클래스 메소드 : 인스턴스 생성 이전부터 접근 가능, 모든 인스턴스 공유하는 메소드
객체 생성없이 클래스.메소드()로 호출가능
인스턴스 생성 이전부터 접근 가능함을 이용하여 인스턴스 생성없이 활용할 수 있다
class SC{
static int add(int num1, int num2) {
return num1 +num2;
}
static int min(int num1, int num2) {
return num1 -num2;
}
}
public class makeStaticMt {
public static void main(String[] arg) {
System.out.println(SC.add(1, 2));
System.out.println(SC.add(5, 2));
}
}
만약 static없이 SC.add로 접근할시 에러가 난다
주로 클래스 내 메소드가 외부 기능을 제공하거나, 변수의 값을 참조, 수정하지 않을때 사용한다
클래스 메소드에서 인스턴스 변수에 접근이 불가능하다
클래스 메소드는 이미 메모리가 할당되어 있는상태이고 인스턴스 변수는 메모리 할당이 되어있지 않은 상태이다
즉 클래스 메소드에서 인스턴스 변수를 사용하면 할당되지 않은 메모리 영역에 접근하게 된다
public static void main()
main 메소드가 public static void main()인 이유
public : main 메소드의 호출이 이뤄지는 곳이 클래스 외부이기 때문에
static : main 메소드는 인스턴스 생성 이전에 호출되기 때문
public static void main()이 있는 부분을 class 호출 해야한다
파일 이름 : makeStaticMt
package helloworld;
class SC{
...
public static void main(String[] arg) {
...
}
}
class makeStaticMt {
...
}
public static void main()을 찾을 수 없다는 에러가 나온다
컴파일 클래스를 makeStaticMt에서 SC로 바꿔주면 컴파일이 된다
정적 메소드, 인스턴스 메소드 차이)
[Java] 정적(Static) 변수와 메서드란? (개념 / 사용 장 단점 / 사용 시기 / 예제) (tistory.com)
[Java] 정적(Static) 변수와 메서드란? (개념 / 사용 장 단점 / 사용 시기 / 예제)
서론 객체언어에서 사용되는 static과 인스턴스의 변수 및 메서드의 내용을 정리해보려한다. 해당 내용은 기초적인 내용이지만 자세히 인지하지 못하고 넘어갈 수 있는 부분이기에 초기에 잘 잡
jeongkyun-it.tistory.com
그 외 static 선언
static 초기화 블록
클래스 변수 date선언 동시에 오늘 날짜 정보를 담고 있는 문자열로 초기화 할때 쓰임
static String date;
static {
LocalDate nDate = LocalDate.now();
date = nDate.toString();
}
data가 이미 클래스 변수라 생성자로 적절하지 않으므로 static 초기화 블록으로 감싼다
import java.time.LocalDate가 인식되지 않는다
import java.time.LocalDate인 경우 JDK버전 1.8이상에만 있다
JDK 1.8버전으로 재설치 후
속성에서 jdk18버전을 추가해준다
정상적으로 인식한다
static import 선언
import static java.lang.Math.*;
class staticImport{
public static void main(String[] args){
System.out.println(PI); //Math안에 있는 PI값을 가져옴
}
}
Math의 모든 클래스 변수와 메소드에 대한 import 선언
'언어 > Java' 카테고리의 다른 글
클래스 상속, 오버라이딩 (0) | 2022.06.26 |
---|---|
메소드 오버로딩, String 클래스 (0) | 2022.06.25 |
정보 은닉, 접근 수준 시지자, 캡슐화 (0) | 2022.06.19 |
클래스 패스, 패키지 (0) | 2022.06.19 |
클래스, 인스턴스, 생성자 (0) | 2022.06.19 |