static 메서드
- static 메서드가 필요한 이유 예를 보자🔽
package static2;
public class DecoUtil1 {
public String deco(String str) {
String result = "*" + str + "*";
return result;
}
}
→ DecoUtil1 이라는 클래스에 deco 메서드만 있다고 가정 하고 이 기능만 사용하는 클래서가 있다고 보면.
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: " + s );
System.out.println("after: " + deco );
String s2 = "hello world";
DecoUtil1 utils2 = new DecoUtil1(); // <- 또 동일한 기능을 하는 객체를 생성 해야 한다.
String deco2 = utils2.deco(s);
System.out.println("before: " + s2 );
System.out.println("after: " + deco2 );
}
}
→ 동일한 기능을 사용하기 위해 매번 객체를 새로 생성해주는 번거로움이 발생한다.
→ 이렇게 매번 단순한 동일 작업(메서드)을 생략하기 위해 static 을 메서드에 붙여준다.
- static 메서드를 사용한 예 🔽
package static2;
public class DecoUtil2 {
public static String deco(String str) { // <- 메서드에 static을 붙여준다.
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: " + s );
System.out.println("after: " + deco );
String b = "static Method";
String deco2 = DecoUtil2.deco(b);
// 2번째 객체 생성없이 바로 클래스 명에 메서드 호출이 가능해진다.
System.out.println("before: " + b);
System.out.println("after: " + deco2);
}
}
→ 이렇게 사용하면 불필요한 객체 생성 없이 편리하게 메서드 사용이 가능해진다.
메서드의 종류
- 클래스 메서드 : 메서드 앞에 staitc 이 붙은 형태로, 정적 메서드, 클래스 메서드라고 부른다. 인스턴스 생성 없이 마치 클래스에 있는 메서드를 바로 호출 하는 것 처럼 느껴진다.
- 인스턴스 메서드 : static이 붙지 않은 메서드로 항상 인스턴스(객체)를 생성해야 호출할 수 있다.
static 메서드 사용 시 주의 사항
- static 메서드는 static 이 선언된 것만 사용 가는하다
- staitc 메서드가 class 내부의 기능을 사용할때에 → static 메서드는 static 이붙은 메서드나, 변수 만 사용 가능하다.
- static 메서드는 인스턴스 변수, 인스턴스 메서드를 사용할 수 없다.
- 접근 제어자가 허용하는 범위 내에서 클래스를 통해 staic변수,메서드를 호출할 수 있다.
static 메서드 결론
- static 붙은 것만 staitc메서드에서 사용 가능 하고 stiatc 메서드 자신은 접근제한자 범위 내에서 마음껏 사용될 수 있다.
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 void instanceCall() { // <- 인스턴스 메서드
instanceValue++; // 인스턴스 변수 접근 가능
instanceMethod(); // 인스턴스 메서드 접근 가능
staticValue++; // 정적 변수 접근 가능
staticMethod(); // 정적 메서드 접근 가능
}
private void instanceMethod() { // <- private 인스턴스 메서드
System.out.println("instanceValue = " + instanceValue);
}
private static void staticMethod() { // private 정적 메서드
System.out.println("staticValue = " + staticValue);
}
}
→ 해당 코드를 작동 시켜 보면
package static2;
public class DecoDataMain {
public static void main(String[] args) {
System.out.println("1. 정적 호출");
DecoData.staticCall();
System.out.println("2. 인스턴스 호출1");
DecoData data1 = new DecoData();
data1.instanceCall();
System.out.println("3. 인스턴스 호출2");
DecoData data2 = new DecoData();
data2.instanceCall();
}
}
staticValue = 1 // <- static 변수는 메서드 영역에서 관리되므로 호출 하면 계속 증가 될것
2. 인스턴스 호출1
instanceValue = 1 // <- instance 변수는 힙 영역에 각각 생성 되므로 호출해도 계속 1 유지
staticValue = 2
3. 인스턴스 호출2
instanceValue = 1
staticValue = 3
// 다음과 같이 출력된다.
→ 그림으로 보면 다음과 같다 🔽
static 메서드의 용어 정리
- 클래스에 정의한 메서드 (맴버 메서드)의 종류
- 인스턴스 메서드 : static이 안 붙은 것 → 객체(인스턴스)를 생성해야 사용할 수 있다.
- class 메서드(static 메서드) : static이 붙은 것 → 객체생성하지 않고 바로 class 에 접근 해 사용 가능하다.
static 메서드의 main() 메서드
- main 메서드는 프로그램의 시작점이다.
- main 메서드는 static 메서드 이므로 객체 생성없이 바로 실행이 된다.
- 그래서 main 메서드에서 호출할 때는 static 메서드만 호출 했다.
'자바 공부 > [ 完 ] 자바 실전 - 기본편' 카테고리의 다른 글
9-1 상속 (0) | 2024.03.14 |
---|---|
8-1. final (0) | 2024.03.12 |
7-3 static 변수 (0) | 2024.03.09 |
7-2 스텍과 큐 자료구조 (0) | 2024.03.09 |
7-1 자바 메모리 구조 (0) | 2024.03.09 |