JAVA

221013 static 메서드

주영재 2022. 10. 13. 12:07

static 메서드-정적 메서드
공유한다라는 개념은 없고, 1개 만들어진다
1. ★변수와 마찬가지로 객체생성없이 '클래스이름.메서드이름'으로 바로 참조가 가능
2. ★★ static메서드에서 static멤버를 바로 사용할 수 있다. 끼리끼리.
★★단, static메서드 안에서 non-static메서드와 멤버변수를 객체생성없이 바로 쓸 수 없다!
왜? static메서드 호출했을 때 객체생성이 된 건 아니니까.

static 제한자는 지정된 변수와 메서드를 객체와 무관하게 만듦
->this 사용 불가!

static 메서드는 static 메서드로만 오버라이딩 할 수 있다.
->근데 오버라이딩보단 따로따로. 별개라고 생각해야 한다

package day08.static_.method;

public class Count {
	
	public int a;
	public static int b;
	
	//일반메서드 - 일반변수, 정적변수 둘 다 사용가능
	public int some1() {
		a=10;		//ok
		return ++b; //ok
	}
	
	
	//정적메서드-정적변수만 사용가능(단, 객체생성을 통해서는 사용가능)
	public static int some2() {
		//a = 10;   //no. 정적메서드에서는 정적변수만. 사용하려면 객체를 생성해야 한다.
		Count c = new Count();
		c.a =10;	//ok
		 
		return ++b; //ok
	}
	
}

끼리끼리라는걸 파악해야 한다.

 

main

package day08.static_.method;

import java.util.Arrays;

public class MainClass {
	public static void main(String[] args) {
		
		Count c = new Count();
		c.some1();//일반메서드
		c.some2();//정적메서드
		
		//정적메서드 - 객체생성 없이 사용
		Count.some2();
		
		//현재 b는? 3

		//main은 static이기 때문에 
		a();
		
		//static 사용방법
		Math.random();
		Integer.parseInt("3");
		Arrays.toString(new int[3]);
		
		
		
	}

	public static void a() {
		
	}
	
}

b가 3인 이유는? 일반메서드, 정적메서드, static특성으로 클래스자체로 정적메서드 호출을 했을 때 총 3번 더해졌으니까. 

a메서드가 호출가능한것도 main이 static이고, a메서드도 static이기 때문

 

Math.random(), Integer.parseInt(), Arrays.toString()도 전부 static 메서드.

 

 

 

정적 초기화자 static initializer
->거의 안 씀

static{

}

package day08.static_.singleton;

public class Computer {
	
	public static int a =10;
	
	//정적초기화자 - 1회만 실행됨
	static {
		System.out.println("단 1번 실행-클래스가 호출될 때");
	}
	
}
package day08.static_.singleton;

public class MainClass {
	public static void main(String[] args) {
		
		System.out.println(Computer.a);
		System.out.println(Computer.a);
		System.out.println(Computer.a);
		System.out.println(Computer.a);
		
		
	}

}
단 1번 실행-클래스가 호출될 때
10
10
10
10

정적초기화자는 클래스가 호출될 때 딱 한번만 실행된다.

 

 

 

Calculator

static 멤버변수와 메서드 사용하기

package day08.static_.basic;

public class Calculator {//사용자 클래스
	
	
	//계산기마다 다른값을 지닌다면 일반변수
	//계산기마다 똑같은 값이라면 정적변수
	private String model;
	private int result;
	public static double pi=3.14;
	
	//일반멤버변수를 사용하는 메서드는 static이면 안됩니다.
	public String getModel() {
		return model;
	}
	public void setModel(String model) {
		this.model = model;
	}
	public int getResult() {
		return result;
	}
	public void setResult(int result) {
		this.result = result;
	}
	
	/*
	 * 일반변수를 사용하지 않고, 범용성 있게 사용할 메서드는 static을 붙이면 좋습니다.
	 */
	public static double circle(int r) {
		return Math.PI*r*r;
	}
	
}

파이값은 고정. 따라서 static으로. 

일반멤버변수를 사용하는 메서드는 static이면 안됨.

일반변수를 사용하지 않고 범용성 있게 사용할 메서드는 static을 붙이는 것이 좋음