본문 바로가기

언어/Java

static - 정적 변수, 정적 메소드

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이상에만 있다

 

Java Downloads | Oracle

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