본문 바로가기
국비지원/JAVA

[JAVA] 16-1. 정적제한자 static

by cosmog 2022. 10. 13.
반응형
정적제한자 static

 

정말정말 중요한 static

  • 1개로 고정 (정적이다)
  • static method는 클래스의 객체 없이도 참조 가능하다.
  • static을 사용한다면 메모리에 바로 1개 만들어준다(고정으로)
    • 따라서 클래스 객체를 생성하지 않아도 사용 가능하다.

💡 다른 class에 있는 static키워드가 붙은 것들은 new로 class 객체 생성 없이도 사용가능하다.

static 변수 특징
1. 모든 객체들이 값을 공유하는 변수가 된다.
2. 객체 생성 없이, 클래스 이름만으로 참조가 가능하다.

  • 위의 그림과 같이 a변수는 일반변수로 객체가 생성될때 마다 객체 안에 생성된다. 따라서 c1/c2/c3의 a가 전부 다른것.
  • b변수는 static 변수로 객체 밖의 메모리에 생성되어 객체들이 모두 하나의 변수에 접근하게 된다.

 

🔆아래와 같이 Count calss를 만들어 a는 일반변수, b는 static 변수로 선언해주었다.

package day16.static_.var;

public class Count {
	public int a;
	public static int b;
}

🔆Main class에서

  • a변수는 Count 객체를 선언해준 후에야 사용가능하고 여러개 객체를 생성할 경우 a는 각 객체마다 다 다른 a이다.
  • b는 static 변수이기 때문에 Count 객체를 사용하지 않아도 " [클래스이름.변수이름] => Count.b " 이렇게 사용가능하고, 객체를 여러개 생성함과 상관없이 b는 값이 계속 누적된다.
package day16.static_.var;

public class Main {
	
	public static void main(String[] args) {
		
		Count c1 = new Count ();
		c1.a++;
		c1.b++;
		
		System.out.println("일반변수:" + c1.a);
		System.out.println("정적변수:" + c1.b);
		
		Count c2 = new Count();
		c2.a++;
		c2.b++;
		
		System.out.println("일반변수:" + c2.a);
		System.out.println("정적변수:" + c2.b);
		
		Count c3 = new Count();
		c3.a++;
		c3.b++;
		
		System.out.println("일반변수:" + c3.a);
		System.out.println("정적변수:" + c3.b);
		
		/*
		 * 일반변수는 객체마다 새로운 변수로 인식.
		 * static 변수는 객체마다 호출하면 하나의 객체로 값이 누적된다.
		 * c1 / c2 / c3의 일반변수는 다른 변수로 인식하여 a의 값은 1이지만
		 * b는 static변수로 누적되어 3이된다.
		 */
		
		//static변수 특징 2번째
		//객체 생성없이 바로 접근 가능하다. class이름을 활용하여
		Count.b++;
		Count.b++;
		Count.b++;
		
		System.out.println(Count.b);
		
	}
}


static method 특징
1. 객체 생성 없이, 사용가능하다.
2. static method에서는 static 멤버를 사용가능(static 끼리는 바로 호출하며 사용가능하다)
일반 method, 일반 변수들은 객체 생성없이 바로 사용 불가능하다.

 

🔆Count class에 some1은 일반 method로 some2는 static method로 만들어주었다.

package day16.static_.method;

public class Count {
	
	public int a;
	public static int b;
	
	//일반method - 일반변수, 정적변수 둘다 사용가능
	public int some1() {
		a = 10;
		return ++b; 
	}
	
	//정적method - 정적변수만 사용가능(단, 객체생성을 통해서 사용가능하다)
	public static int some2() {
		//a = 10;// 일반변수를 그냥 사용은 불가능. (클래스 객체 생성 필요함)
		Count c = new Count();
		c.a = 10;
		
		return ++b; // b는 static 변수라서 사용 가능
	}
}

🔆Main 클래스

  • static 변수와 같이 일반 method는 객체를 선언해야 사용가능하고, static method는 "class이름.method이름" 으로 사용가능하다.
  • main method도 static method기 때문에 static method인 a를 그냥 사용가능하다.
package day16.static_.method;

public class Main {
	
	public static void main(String[] args) {
		
		Count c = new Count();
		c.some1(); //일반
		c.some2(); //static
		
		Count.some2();
		
		//main은 static이기 때문에
		a(); // 그냥 사용 가능.
	}
	
	public static void a() {
		
	}

}


<자바에서 static에 대해 알아둬야 할 것>

1. static 멤버는 객체 생성 없이 "클래스명.이름"으로 참조가능하다.
2. static변수는 객체간 값의 공유를 의미힌다.
3. static method는 같은 static멤버만 참조가능하다.

반응형