221013 static 메서드
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을 붙이는 것이 좋음