-
클래스 메서드, 인스턴스 메서드JAVA/개념 - 김영한 강의 2024. 9. 17. 08:39
1. 클래스 메서드 vs 인스턴스 메서드
1) 인스턴스 메서드
static이 붙지 않은 메서드. 인스턴스를 생성해야 호출할 수 있다.
다음 인스턴스 메서드인 deco() 메서드를 보자.
public class DecoUtil1 { public String deco(String str) { String result = "*" + str + "*"; return result; } }
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); // 실행결과: before: hello java System.out.println("after: " + deco); // 실행결과: after: *hello java* } }
deco() 메서드를 호출하려면 DecoUtill() 인스턴스를 먼저 생성해야 하며 단순히 기능만 제공한다.(멤버변수 등을 사용하지 않음)
2) 클래스 메서드(= static 메서드, 정적 메서드)
- static이 붙은 정적 메서드는 인스턴스 생성 없이 바로 호출할 수 있다. 따라서 메서드의 호출만으로 필요한 기능을 수행할 때 수로 사용한다.
- 클래스명 + .(dot) + 메서드 명
public class DecoUtil2 { public static String deco(String str) { String result = "*" + str + "*"; return result; } }
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); } }
Example1
public class DecoData { private int instanceValue; private static int staticValue; public static void staticCall() { staticValue++; staticMethod(); } public void instanceCall() { instanceValue++; instanceMethod(); staticValue++; staticMethod(); } private void instanceMethod() { System.out.println("instanceValue=" + instanceValue); } private static void staticMethod() System.out.println("staticValue=" + staticValue); } }
staticCall()
: static이 붙은 정적 메서드라, static이 없는 인스턴스 변수나 인스턴스 메서드가 접근하면 컴파일 오류가 생긴다.
instanceCall()
: 인스턴스 메서드다. 모든 곳에서 공용인 static을 호출할 수 있다. 정적 변수, 정적 메서드, 인스턴스 변수, 인스턴스 메서드 모두에 접근할 수 있다.
Q.왜 정적 메서드는 인스턴스의 기능을 사용할 수 없을까?
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(); } }
- 정적 메서드는 클래스의 이름을 통해 바로 호출할 수 있다. 그래서 인스턴스처럼 참조값의 개념이 없다. 특정 인스턴스의 기능을 사용하려면 참조값을 알아야 하는데, 정적 메서드는 참조값 없이 바로 호출할 수 있으니 인스턴스 변수와 인스턴스 메서드를 사용할 수 없다.
- but, 객체의 참조값을 직접 매개변수로 전달한 static 메서드는 인스턴스 변수 및 메서드 사용이 가능하다.
public static void staticCall(DecoData data) { data.instanceValue++; data.instanceMethod(); }
*변수가 공유되려면 그 변수를 다른 클래스나 별도의 객체에서 만들어서, 여러 객체가 그 변수를 참조하게 해야 한다.
a) 다른 클래스에서 변수를 선언하여 공유:
Counter 같은 별도의 클래스에서 변수를 선언하고, 그 객체를 여러 클래스에서 공유하도록 만들 수 있습니다.b) 클래스 변수(static 변수):
변수를 static으로 선언하면, 그 클래스의 모든 인스턴스가 해당 변수를 공유한다. 즉, 클래스 자체에 속한 변수이므로, 모든 객체가 동일한 변수를 참조하게 된다.static import
이걸 사용하면 클래스 명을 생략하고 메서드를 호출 할 수 있다.
public static void main(String[] args)
main() 메서드가 static이기 때문에 객체를 생성하지 않아도 작동됨.
'JAVA > 개념 - 김영한 강의' 카테고리의 다른 글
다형성, instanceof, 메서드 오버라이딩 (0) 2024.10.08 상속(Inheritance), @Override, super (0) 2024.09.27 멤버변수의 종류와 자바의 메모리 구조(메서드, 스택, 힙) (1) 2024.09.15 접근제어자 / 캡슐화 (0) 2024.08.30 생성자 -오버로딩(Overloading)과 this() + 오버라이딩(Overriding) (0) 2024.08.25