코딜기

[Java] static (static 필드, static 메서드) 본문

Language/Java

[Java] static (static 필드, static 메서드)

코딜기 2024. 8. 27. 16:38
반응형

static이란?

  • static이라는 키워드는 필드와 메서드에 붙일 수 있습니다.
  • 모든 객체가 공유해도 문제가 없는 필드나 메서드에 붙입니다.
  • 객체에 소속된 멤버가 아니라 static이 저장되는 공간이 따로 있다고 생각하면 이해가 쉬울 것입니다.


static 사용 (필드)

  • 간단한 예제 코드로 static을 사용해 보겠습니다.
  • Count라는 클래스를 하나 만들고 내부에 변수 두 개를 선언하는데, 하나에만 static을 추가하겠습니다.
public class Count {
    public int a; //인스턴스 필드
    public static int b; //정적 필드
}
  • 이후 main 메서드에서 Count 객체를 생성한 후에 값을 변경해 보겠습니다.
Count c1 = new Count();

c1.a += 5;
c1.b += 5;

System.out.println("c1.a: " + c1.a);
System.out.println("c1.b: " + c1.b);

  • 또 다른 새로운 객체를 생성한 후 값을 변경해 보겠습니다.
Count c2 = new Count();
		
c2.a += 7;
c2.b += 7;

System.out.println("c2.a: " + c2.a);
System.out.println("c2.b: " + c2.b);

  • 더 정확한 이해를 위해 위의 과정을 한번 더 반복해 보겠습니다.
Count c3 = new Count();
		
c3.a += 8;
c3.b += 8;

System.out.println("c3.a: " + c3.a);
System.out.println("c3.b: " + c3.b);

  • 'static'으로 선언되지 않은 인스턴스 변수 'a'는 각 객체가 생성될 때마다 객체 내에 새롭게 생성되어 해당 객체에서만 사용됩니다.
  • 반면, 'static'으로 선언된 클래스 변수 'b'는 객체가 생성될 때마다 새로운 공간에 생성되는 것이 아니라, 클래스가 처음 로딩될 때 메모리의 메서드 영역에 한 번만 생성됩니다.
  • 이 변수는 모든 객체가 공유하는 변수로서 동작하며, 특정 객체에 종속되지 않고 클래스 전체에서 공통으로 사용됩니다.

 

  • 따라서, 'static' 변수는 객체 생성과는 관련이 없으므로, 객체를 통해 호출하지 않고 클래스 이름을 통해 호출하는 것이 좋습니다.
  • 인스턴스 필드처럼 'static' 필드를 호출하면 코드의 가독성을 떨어뜨리고 혼란을 야기할 수 있습니다. 
public class Main {
    public static void main(String[] args) {
        Count c1 = new Count();

        c1.a += 5; // -> a는 static 변수가 아니므로 객체를 통해서 접근
        Count.b += 5; // -> b는 static 변수이기 때문에 클래스 이름을 통해서 접근
    }
}

static 사용 (메서드)

  • 인스턴스 메서드 내부에서는 정적(static) 변수와 인스턴스 변수를 모두 사용할 수 있습니다.
  • 반면, static 블록(정적 메서드나 정적 초기화자) 내부에서는 static 변수나 static 메서드만 사용할 수 있습니다.
  • 따라서 static 블록 내부에서는 'this' 키워드를 사용할 수 없습니다.
  • static 블록에서 non-static 멤버를 사용하려면, 반드시 객체를 생성한 후 그 객체를 통해 접근해야 합니다.
public class Count {
    public int a; // 인스턴스 필드
    public static int b; // static 필드
	
    // 일반 메서드
    public int method1() {
        return this.a + Count.b;
    }
	
    // static 메서드
    public static int method2() {
        //this.a = 10; (x)
    	Count ccc = new Count();
    	return ccc.a + Count.b;
    }
}
반응형

'Language > Java' 카테고리의 다른 글

[Java] 상수 (Constant)  (0) 2024.08.29
[Java] final (final 필드, final 메서드)  (0) 2024.08.27
[Java] 캡슐화 (Encapsulation)  (0) 2024.08.27
[Java] 정보은닉(Infomation Hiding)  (1) 2024.08.26
[Java] 생성자(Constructor)  (0) 2024.08.26
Comments