static 메서드
예제
문자열이 들어오면 앞 뒤에 *을 붙여서 반환한다.
public class DecoUtil1 {
public String deco(String str) {
String result = "*" + str + "*";
return result;
}
}
DecoMain.java
package static2;
public class DecoMain1 {
public static void main(String[] args) {
String s = "Hello Java";
DecoUtil1 utils = new DecoUtil1();
String deco = utils.deco(s);
System.out.println("before deco: " + s);
System.out.println("before deco: " + deco);
}
}
실행결과
deco 메서드를 보면 멤버 변수가 없고, 단순히 매개변수로 넘어온 문자열을 리턴하는 기능만 한다. 인스턴스가 필요한 이유는 멤버변수를 사용하는 목적이 큰데, 이 메서드는 단순히 기능만 제공한다. 객체 생성이 의미가 있을까?
static 메서드를 만들어보자.
메서드 앞에 static 을 붙이면 정적 메서드를 만들 수 있다. 정적 메서드는 정적 변수처럼 인스턴스 생성 없이 클래스명을 통해서 바로 호출할 수 있다.
DecoUtil2.java
package static2;
public class DecoUtil2 {
public static String deco(String str) {
String result = "*" + str + "*";
return result;
}
}
package static2;
public class DecoMain2 {
public static void main(String[] args) {
String s = "Hello Java";
String deco = DecoUtil2.deco(s);
System.out.println("before deco: " + s);
System.out.println("before deco: " + deco);
}
}
객체 생성 없이 클래스명.메서드 로 바로 메서드를 호출할 수 있다.
클래스 메서드와 인스턴스 메서드
클래스 메서드 : 메서드 앞에도 static을 붙일 수 있다. 이것을 정적 메서드 또는 클래스 메서드라 한다. 인스턴스 생성 없이 바로 클래스의 메서드를 호출하는 것처럼 보이기 때문에 클래스 메서드란 용어를 쓴다.
인스턴스 메서드: static이 붙이 않은 메서드는 인스턴스를 생성해야 호출할 수 있다. 이를 인스턴스 메서드라 한다.
static 메서드 사용법
정적 메서드는 객체 생성없이 클래스에 있는 메서드를 바로 호출할 수 있다. 하지만 정적 메서드를 언제나 사용할 수 있는 건 아니다.
static 메서드는 static만 사용할 수 있다.
- 클래스 내부의 기능을 사용할 때, 정적 메서드는 static이 붙은 정적메서드나 정적 변수만 사용할 수 있다.
- 클래스 내부의 기능을 사용할 때, 정적 메서드는 인스턴스 변수나, 인스턴스 메서드를 사용할 수 없다.
반대로 모든 곳에서 static을 호출할 수 있다.
- 정적 메서드는 공용 기능이다. 따라서 접근 제어자만 허락한다면 클래스를 통해 모든 곳에서 static을 호출할 수 있다.
예제
public class DecoData {
private int instanceValue;
private static int staticValue;
public static void statcCall() {
staticValue++; // 정적 변수 접근
staticMethod(); // 정적 메서드 접근
instaceValue++;// 인스턴스 변수 접근
instanceMethod();
}
private void instanceMethod() {
System.out.println("instasValue= " + instanceValue);
}
private static void staticMethod() {
System.out.println("staticValue= " + staticValue);
}
}
=> 정적 메서드에서는 정적 메서드, 정적 변수에만 접근 가능하다.
=> 인스턴스 메서드는 정적, 인스턴스 모두 접근 가능하다.
DecoDataMain.java
package static2;
public class DecoDataMain {
public static void main(String[] args) {
System.out.println("1. 정적 호출");
DecoData.statcCall();
System.out.println("2. 인스턴스 호출 1");
DecoData data1 = new DecoData();
data1.instanceCall();
System.out.println("3. 인스턴스 호출 2");
DecoData data2 = new DecoData();
data2.instanceCall();
}
}
실행결과
정적 메서드가 인스턴스의 기능을 사용할 수 없는 이유
정적 메서드는 클래스의 이름을 통해 바로 호출할 수 있다. 그래서 인스턴스처럼 참조값의 개념이 없다.
특정 인스턴스의 기능을 사용하려면 참조값을 알아야 하는데, 정적 메서드는 참조값 없이 호출한다. 따라서 정적 메서드 내부에서 인스턴스 변수나 인스턴스 메서드를 사용할 수 없다.
정적 메서드 활용
정적 메서드는 객체 생성 필요 없이 메서드의 호출만으로 필요한 기능을 수행할 때 주로 사용한다. 간단한 메서드 하나로 끝나는 유틸리티성 메서드에 자주 사용한다.
main() 메서드
인스턴스 생성 없이 실행하는 가장 대표적인 메서드가 바로 main() 메서드이다.
main() 메서드는 프로그램을 시작하는 시작점이 되는데, 객체를 생성하지 않아도 작동한다. 이는 main() 메서드가 static이기 때문이다.
정적 메서드는 정적 메서드만 호출할 수 있다. 따라서 같은 클래스 내부에서 메서드를 만들때 static으로 만든 것이다.
* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.
'프로그래밍언어 > Java' 카테고리의 다른 글
[Java 기본] 상속 (0) | 2024.07.15 |
---|---|
[Java 기본] final 변수와 상수 (0) | 2024.07.12 |
[Java 기본] static 변수 (0) | 2024.07.10 |
[Java 기본] 스택 영역과 힙 영역 (0) | 2024.07.10 |
[Java 기본] 스택 영역 (0) | 2024.07.10 |