❗해당 포스팅은 인프런에서 제공해주는 강의 내용을 개인적으로 정리하였음을 알려드립니다.
클래스 메서드: 메서드 앞에 static이 붙는 것. 정적 메서드 또는 클래스 메서드 라고 한다.
클래스 메서드라는 용어는 인스턴스 생성 없이 클래스에 있는 메서드를 바로 호출하는 것 처럼 느껴지기 때문이다.
인스턴스 메서드 : static이 붙지 않는 메서드. 인스턴스를 생성해야 호출 가능하다.
static 메서드는 static이 붙은 정적 메서드나 정적 변수만 사용할 수 있고, 모든곳에서 static을 호출할 수 있다.
package static2;
public class DecoData {
private int instanceValue;
private static int staticValue;
public static void staticCall(){
//instanceValue++; // 인스턴스 변수 접근, compile error 무조건 참조값이 있어야 함
//instanceMethod(); // 인스턴스 메서드 접근, compile error
staticValue++;
staticMethod();
}
public static void staticCall(DecoData data){
data.instanceValue++;
data.instanceMethod();
}
public void instanceCall(){
instanceValue++;
instanceMethod();
staticValue++;
staticMethod();
}
private void instanceMethod(){
System.out.println("instanceValue=" + instanceValue);
}
private static void staticMethod() {
System.out.println("staticValue=" + staticValue);
}
}
package static2;
import static static2.DecoData.staticCall;
public class DecoDataMain {
public static void main(String[] args) {
System.out.println("1. 정적 호출");
staticCall();
// 정적 메서드는 클래스의 이름을 통해 바로 호출할 수 있다. 그러므로 인스턴스처럼 참조값의 개념이 없다.
// 특정 인스턴스의 기능을 사용하려면 참조값을 알아야 하는데, 정적 메서드는 참조값 없이 호출한다. 따라서 정적 메서드 내부에서 인스턴스 변수나 인스턴스 메서드를 사용할 수 없다.
System.out.println("2. 인스턴스 호출1");
DecoData data1 = new DecoData();
data1.instanceCall();
System.out.println("3. 인스턴스 호출2");
DecoData data2 = new DecoData();
data2.instanceCall();
//인스턴스를 통한 접근
DecoData data3 = new DecoData();
staticCall(data3);
//클래스를 통한 접근
staticCall();
}
}
정적 메서드는 클래스의 이름을 통해 바로 호출할 수 있다. 그러므로 인스턴스처럼 참조값의 개념이 없다.
특정 인스턴스의 기능을 사용하려면 참조값을 알아야 하는데, 정적 메서드는 참조값 없이 호출한다.
따라서 정적 메서드 내부에서 인스턴스 변수나 인스턴스 메서드를 사용할 수 없다.
(객체의 참조값을 직접 매개변수로 전달하면 정적 메서드도 인스턴스의 변수나 메서드 호출이 가능하다.)
main() 메서드는 정적 메서드이다.
객체를 생성하지 않아도 main() 메서드가 작동하는데, 이것은 main() 메서드가 static이기 때문이다.
정적 메서드는 정적 메서드만 호출 가능하므로 정적 메서드인 main()이 호출하는 메서드에는 정적 메서드를 사용했다.
public class ValueDataMain {
public static void main(String[] args) {
ValueData valueData = new ValueData();
add(valueData);
}
static void add(ValueData valueData) {
valueData.value++;
System.out.println("숫자 증가 value=" + valueData.value);
}
}
'Back-end > Java' 카테고리의 다른 글
[Java] final 변수와 상수 (3) | 2024.12.20 |
---|---|
[Java] static 변수 (0) | 2024.12.16 |
[Java] 자바 메모리 구조 (0) | 2024.12.14 |
[Java] 기본형과 참조형 (3) | 2024.12.03 |
[Java] 배열의 도입 (2) | 2024.11.27 |