Spring

static 메소드와 instance 메소드의 메모리 생성 시점이 다르다?

chandlerxx 2023. 11. 8. 16:37

※ 출처는 하단 참고 하시기 바랍니다.

 

 

우선 자바 프로그램 실행과정을 간단하게 살펴봅시다.

1. 자바 프로그램 실행과정


자바 애플리케이션을 개발하고 실행하기 위한 자바 플랫폼의 3대 구성 요소로는, 1) JDK 2) JVM 3) JRE 이 있습니다.

출처 : https://hsik0225.github.io/java/2020/12/17/Static-Override/

 

 

실행과정은 크게 컴파일 환경과 런타임 환경으로 나뉩니다.

  • 컴파일 타임 환경
    1) JDK Compiler를 통해 자바소스코드(.java)를 JVM이 읽을 수 있도록 자바 바이트 코드(.class)로 변환하는 역할
    2) 실행파일 생성되는 과정
     
  • 런타임 환경
    1) 자바 애플리케이션이 디바이스 또는 클라우드 환경에서 실행되는 데 필요한 리소스를 확보하도록 보장하는 역할
    2) 프로그램 실행 과정

2. static 메소드와 instance 메소드의 메모리 생성 시점이 다르다?


결론부터 말씀 드리면,

  • For class (or static) methods, the method according to the type of reference is called, which means method call is decided at compile time. => static 메서드는 컴파일 시점에 호출되며 정적 바인딩 형태

  • For instance (or nonstatic) methods, the method is called according to the type of object being referred, not according to the type of reference, which means method calls is decided at run time.=> 인스턴스 메소드는 런타임 시점에 호출되며 동적 바인딩 형태

*바인딩 : 메소드 호출 시 메모리 주소에 값을 할당하는 것

 

구분  정적 바인딩
(Static Binding)
동적바인딩
(Dynamic Binding)
메모리 생성 시점 컴파일 타임 런타임
수행속도 비교적 빠름 비교적 느림
메모리 공간 활용 효율 비교적 좋음 비교적 낮음
특징 - 다형성 활용 프로그래밍 가능 (오버라이딩)

 

 

 

3. 예시 코드 (with 오버라이딩)


  • static 메소드는 컴파일 시점에 선언된 타입의 메소드를 호출합니다. 그래서 각 클래스 자신들의 static 메소드를 호출하여 출력했습니다.
  • Instance 메소드는 런타임 시점에 해당 메소드를 보유하고 있는 실체 객체를 찾아 호출하여 출력합니다. Boy()라는 인스턴스를 생성했기 때문에 해당 클래스의 instancewalk() 메소드를 호출하여 출력했습니다.
public class Human {
    public static void staticWalk() {
        System.out.println("Human walks @static method");
    }
    public void instanceWalk() {
        System.out.println("Human walks @instance method");
    }
}

class Boy extends Human {
    public static void staticWalk() {
        System.out.println("Boy walks @static method");
    }
    public void instanceWalk() {
        System.out.println("Boy walks @instance method");
    }
}

class TestClass {
    public static void main(String[] args) {
        System.out.println("--static method 호출--");
        Human.staticWalk();
        Boy.staticWalk();

        System.out.println("--instance method 호출--");
        Human obj1 = new Boy();
        Boy obj2 = new Boy();

        obj1.instanceWalk();
        obj2.instanceWalk();
    }
}

// 출력 결과
--static method 호출영역--
Human walks @static method
Boy walks @static method

--instance method 호출영역--
Boy walks @instance method
Boy walks @instance method

 


[출처]

 

오버라이딩

 

 

그외