본문 바로가기

웹 프로그래밍/Spring Framework

[JAVA] 정적 메소드와 인스턴스 메소드(Static Method and Instance Method)

정적 메소드(Static Method)와 인스턴스 메소드(Instance Method)
 정적 메소드와 인스턴스 메소드의 가장 큰 차이점이라면 저장되는 공간이 다르다. 이전의 정적변수(Static Variable)이 저장되는 공간이 Class Area라고 했다. 그래서 정적 변수의 경우 별다른 객체(인스턴스) 생성 없이 Class.정적변수명 으로 바로 접근이 가능했다. 이와 같이 정적 메소드도 별다른 인스턴스 생성 없이 바로 호출이 가능하다.

주의할점
 정적 메소드 내에서는 인스턴스 변수(Instance Variable)나 메소드(Method)를 사용할 수 없다. 물론 지역변수(Local Variable)은 사용이 가능하지만 인스턴스 변수나 메소드를 왜 사용할 수 없냐면 정적 메소드의 초기화 시점은 인스턴스 변수나 메소드보다 빠르기 떄문이다. 인스턴스 변수나 메소드를 참조하려면 객체(인스턴스)를 선언 한 후 객체를 통해서만 사용이 가능하다.

 

위 error()메소드는 전혀 문제가 없지만 tempUp()메소드는 내부에 인스턴스 변수를 사용했기 떄문에 문제가 컴파일 에러가 날 수 밖에 없다(옆 라인에 x표기 된 것을 볼 수 있다.) from Eclipse

예제

package test;
import java.util.Scanner;

class StaticMethod{
 int memVar;
 static int staticVar;
 void memMethod1(){
  int local = memVar;
  local = staticVar;
  staticMethod1();
  memMethod2();
  System.out.println("memMethod1");
 }
 
 void memMethod2(){
  System.out.println("memMethod2");
 }
 static void staticMethod1(){
  StaticMethod st = new StaticMethod();
  int local = st.memVar; 
  //정적 객체 내에서 인스턴스 변수나 함수를 사용하려면 내부에 해당 인스턴스 객체를 만들어 줘야함.
  staticMethod2();
  System.out.println("staticMethod1");
 }
 static void staticMethod2(){
  System.out.println("staticMethod2");
 }
}


public class test {
 public static void main(String[] args) throws Exception {
  StaticMethod.staticMethod1(); //정적 메소드라 클래스를 통해 호출이 가능함
  StaticMethod st = new StaticMethod();
  st.memMethod1(); //인스턴스 메소드라 객체를 통해서만 호출이 가능함
  StaticMethod.staticMethod2(); //정적 메소드라 클래스를 통해 호출이 가능함.
  int local = StaticMethod.staticVar; //정적 변수
  
 }
}

결과

staticMethod2
staticMethod1
staticMethod2
staticMethod1
memMethod2
memMethod1
staticMethod2

해설
 피료없음.