[Java] 2. 자바 static이란?

강은서·2022년 1월 10일
0

Java

목록 보기
3/9
post-thumbnail

정적(static)이란?

  • 정적 멤버 (클래스 멤버)
    - 정적 필드(Static 변수)
    - 정적 메소드(Static 메소드)
  • 정적 멤버는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버이기에 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스 별로 관리된다.
    - 정적 멤버는 인스턴스(객체)의 생성 없이 호출할 수 있다.
    - 자바 프로그램을 실행시 정적 멤버를 찾아서 먼저 메모리에 할당시킨다.

정적 멤버 생성

  • 정적 멤버들은 Heap영역이 아닌 static영역에 할당된다.
    - static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있다.
    - Garbage Collector가 관여하지 않기에 프로그램 종료시까지 메모리가 할당된 채로 존재하기에 시스템 성능에 악영향을 줄 수 있다.

정적 필드 사용 예시

class Number{
	static int num1 = 0; //클래스 필드
    	int num2 = 0; //인스턴스 필드
}

public class Static_ex{
	
    public static void main(String[] args){
    	Number number1 = new Number();
        Number number2 = new Number();
    }
    
    number1.num1++; //클래스 필드 num을 1 증가시킨다.
    number1.num2++; //인스턴스 필드 num2을 1 증가시킨다.
    
    System.out.print(number2.num1);
    System.out.print(number2.num2);
  • Number라는 클래스 안에 클래스 변수 num과 인스턴스 num2를 생성하였다.
  • 두개의 Number 인스턴스 number1과 number2를 생성하였다.
    - number1에서 num1과 num2를 각각 씩 증가시켰다.
    - number2에서 num1과 num2를 각각 출력하였다.
  • 출력시켰을 때, num1은 1, num2는 0을 출력한다.
    - num1(정적변수)는 모든 인스턴스가 하나의 저장공간을 공유하기에 항상 같은 값을 가진다.
    - num2(인스턴스 변수)는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 가진다.

정적 메소드 사용 예시

class Name{
    //클래스 메소드
    static void print1(){
    	System.out.println("내 이름은 강서월 입니다.");
    }
    
    //인스턴스 메소드
    void print2(){
    	System.out.println("내 이름은 강은서 입니다.");
    }
}

public class Static_ex{
    public static void main(String[] args){
    	Name.print1(); //인스턴스를 생성하지 않아도 호출이 가능하다.
      
      	Name name = new Name(); //인스턴스 생성
        name.print2(); //인스턴스를 생성해야만 호출이 가능하다.
    }
}
  • 정적 메소드는 클래스가 메모리에 올라갈 때 정적 메소드가 자동적으로 생성되어 인스턴스를 생성하지 않아도 호출이 가능하다.
  • 인스턴스 메소드는 인스턴스를 생성해야만 호출이 가능하다.

0개의 댓글