본문 바로가기
Programming/Java

[JAVA] 정적 제한자 Static

by 공부합시다홍아 2023. 11. 30.
 

[JAVA] 다형성

[JAVA] 접근 제한자 [JAVA] 패키지와 상속 [JAVA] 객체와 클래스 [JAVA] 스택(Stack)과 큐(Queue) [JAVA] 매서드 [JAVA] 2차원 배열 [JAVA] 배열을 이용한 문제풀이 [JAVA] 정렬과 복사 [JAVA] 배열 연습 [JAVA] 소수(Prime

hong-study.tistory.com


사용 제한자 ( Usage Level Modifier ) - static
  • static 제한자는 변수, 메서드에 적용되는 자바의 키워드이다.
  • static method 나 변수(Varicable)는 해당 클래스의 객체 없이도 참조가 가능하다.
  • static block 안에는 static 변수만 사용해야하고, static 메서드만 호출이 가능하다.
    • 즉, static block에서 non-static 멤버를 객체 생성 없이 직접 참조가 불가하다.
  • 지정된 변수와 메서드를 객체와 무관하게 만들어주기 때문에 this 를 가질 수 없다.
  • non-static 메서드로 재정의(Overriding) 될 수 없다.
  • 대표적인 static 메서드는 애플리케이션의 main() 메서드이다.
  • 단순 block { } 을 사용한 경우 : 정적 초기화라고 한다.
  • static 변수를 초기화하는 역할을 가지고 클래스가 로딩될 때 main() 메서드가 있더라도 그보다 앞서 딱 한 번 실행

- Calculator.class

public class Calculator {

	/*
	 * 객체에서 서로 다른값을 가져야 하는 경우는 일반 멤버변수가 됩니다.
	 */
	private int result;
	private String color;
	/*
	 * 객체마다 동일한 값을 가져야하는 경우는 static변수가 됩니다.
	 */
	public static double pi = 3.14;
	/*
	 * 일반 변수를 참조하는 메서드는 일반메서드 됩니다. (static x) 
	 */
	public int add(int a) {
		result += a;
		return result;
	}
	
	public int getResult() {
		return result;
	}
	public void setResult(int result) {
		this.result = result;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	/*
	 * 메서드 안에서 일반 멤버변수를 쓰지 않고, 범용성있게 사용할 메서드는 static을 붙이면 됩니다.
	 */
	//원의 넓이
	public static double circle(int radius) {
		return radius * radius * pi;
	}
}

- Computer.Class

public class Computer {

	public static String company;
	public int price;
	
	//정적 초기화자 - 단 1번만 실행됩니다.
	static {
		//this.company = "LG"; //this키워드 사용불가
		company = "LG";
		
		System.out.println("정적초기화자 1번 실행됨");
	}
	
	public Computer(int price) {
		this.price = price; //일반변수 초기화
		//this.company = "LG";
	}
	
}

- Main.Class

public class MainClass {

	public static void main(String[] args) {
		
		/*
		 * 1. 녹색 계산기 1개, 빨강색 계산기 1개 생성
		 * 2. 계산기 색상 확인
		 * 3. add(int a)메서드를 추가(result누적)
		 * 4. pi변수를 사용해서 원의 넓이
		 * 5. circle() 사용해서 원의 넓이
		 */
		
		Calculator cal1 = new Calculator();
		cal1.setColor("green");
		
		Calculator cal2 = new Calculator();
		cal2.setColor("red");
		
		System.out.println("1번계산기:" + cal1.getColor()  );
		System.out.println("2번계산기:" + cal2.getColor()  );
		
		
		//static변수, static메서드
		System.out.println("원의넓이:" + 3 * 3 * Calculator.pi );
		System.out.println("원의넓이:" + Calculator.circle(3)  );
		
		
		System.out.println("--------------------------------------");
		
		//정적초기화자는 클래스가 불려나올때 단 1번만 실행.
		
		//Computer com1 = new Computer(1000);
		//Computer com2 = new Computer(2000);
		//Computer com3 = new Computer(3000);
		
		System.out.println( Computer.company );
			
	}
}

정적 변수 ( static field )
  • static 변수는 모든 객체들이 공유하는 공유변수가 된다.
  • 객체 생성 없이 클래스 이름만으로 참조가 가능하다.

- Count.class

public class Count {

	public int a; //일반변수
	public static int b; //정적변수(객체들마다 공유하는 값)
}

- Main.Class

public class MainClass {

	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);
		
		//현재 c1.b 는 몇일까요? 
		//현재 c2.b 는 몇일까요? 
		System.out.println("현재c1.b:" + c1.b);
		System.out.println("현재c2.b:" + c2.b);
		
		//1. static변수 객체들 사이에서 동일한 값을 갖게 한다.
		//2. static변수는 객체 바깥에 생성되므로, 객체 생성 없이 접근이 가능합니다.
		//	 클래스명.변수명
		
		
		c3.b = 100;
		Count.b++;
		c1.b = 3;
		
		System.out.println( Count.b  ); //3
		
	}
}

정적 메서드 ( Static Method )
  • static 메서드는 static 변수와 마찬가지로 해당 클래스의 객체 생성 없이도 참조가 가능하다. 
  • static 메서드에서 멤버 참조시 주의 사항은 "static메서드안에서는 non-static멤버를 객체 생성없이 참조 불가하다" 다.
  • static 메서드안에서는 static 변수를 선언할 수 없다.

- Count.class

public class Count {

	
	public int a; //일반변수
	public static int b; //정적변수
	
	//일반메서드 - 일반변수, 정적변수 모두 사용이 됩니다.
	public int method() {
		a = 10;
		b++;
		return b;
	}
	
	//정적메서드 - static멤버반 사용이 됩니다.
	public static int method2() {
		//a = 10; //- 단, 방법이 있죠
		//객체를 생성해서는 접근이 됩니다.
		Count c = new Count();
		c.a = 10;
		
		b++;
		return b;
	}
	
}

- Main.Class

import java.util.Arrays;

public class MainClass {

	public static void main(String[] args) {
		
		//main은 static입니다
		//a변수를 사용하고 싶으면 객체생성을 해서 사용함.
		Count c = new Count();
		c.method();
		
		
		//static멤버를 호출할 때
		Count.b++;
		Count.method2();
		
		//현재 b는 몇일까요? 3
		Math.random();
		String.join("-", "010", "1234", "5678");
		Integer.parseInt("3");	
		
	}
	
}

정적 초기화자 ( static Initializer )
  • 정적 초기화자는 static 변수들의 초기화에 사용합니다. 일반 멤버변수는 생성자에서 초기화하지만
    static 변수는 객체 생성 없이도 사용해야하므로 생성자를 통해 초기화가 불가하다. 
  • static 변수는 정적 초기화자를 통해 초기화 한다. 
  • 정적 초기화자는 클래스가 로딩될 때 생성자와 main() 메서드에 앞서 오직 단 한번만 실행
    ▶ 애플리케이션 실행 중 반드시 한 번만 실행될 로직이 있다면 이곳에서 기술하여 실행한다.

 

728x90

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

[JAVA] Final 과 Abstract(추상화)  (0) 2023.11.30
[JAVA] SingleTon Design Pattern  (0) 2023.11.30
[JAVA] 다형성  (1) 2023.11.14
[JAVA] 접근 제한자  (0) 2023.11.13
[JAVA] 패키지와 상속  (0) 2023.11.10