본문 바로가기
Java

Java_static변수와 static메소드 (oop)

by 유서담 2023. 11. 8.

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));
  }