프로그래밍에서는 종종 혼란스러워요. 어떤 함수는 싱글톤으로 풀리고, 어떤 함수는 정적 방법으로 해결되는데, 정적 메서드와 싱글톤의 원리와 사용 시나리오는 무엇인가요? 오늘 이 문제를 분명히 합시다.
1. 먼저 정적 방법과 비정적 방법의 차이를 살펴보겠습니다.
많은 프로그래머들은 정적 메서드가 먼저 로드되고, 비정적 메서드는 나중에 로드되며, 정적 메서드는 항상 메모리에 존재하고 비정적 메서드는 존재하지 않는다는 점을 이해하고 있습니다. 따라서 비정적 방법을 사용하는 것이 권장됩니다. 우선, 이 이해가 잘못되었다고 강조하는 것은 잘못된 일입니다.
우선, 메모리에서 분석해 보겠습니다. 애플리케이션이 초기화될 때 CLR(CLR은 공통 언어 런타임)은 Java 가상 머신과 마찬가지로 자원 관리(메모리 할당 및 가비지 컬렉션 등)를 담당하며 애플리케이션과 기본 운영 체제 간의 필요한 분리를 보장합니다. CLR은 두 가지 다른 번역명을 가지고 있습니다: 공통 언어 런타임(Common Language Runtime)과 공통 언어 런타임(Common Language Runtime)입니다. 각 프로세스에 대해 관리 힙(managed heap)이라는 가용 공간에서 주소 공간을 할당합니다. 관리되는 힙은 여러 영역으로 나뉘며, 그중 가장 중요한 것은 가비지 컬렉션 힙(GC 힙)과 로더 힙(로더 힙)으로, 로더 힙은 객체 인스턴스를 저장하는 데 사용되며 GC가 관리합니다. Loader Heap이 MethodTable 테이블을 통해 저장하는 가장 중요한 정보는 기본 타입, 정적 필드, 구현 인터페이스, 모든 메서드와 같은 메타데이터 관련 정보입니다. 로더 힙은 GC 제어를 받아들이지 않으며, 그 수명 주기는 생성부터 파괴까지입니다. 즉, 클래스가 로드되면 이 클래스의 정적 및 비정적 메서드 모두 Load Heap의 MethodTab 테이블에 GC 제어 없이 저장되며, 첫 로드 시 모두 메모리에 상주합니다.
정적 방법과 비정적 방법의 차이점은 무엇인가요? 차이점은 객체를 생성할 때 정적 메서드는 복사본만 가지는 반면, 비고정 메서드는 새로운 객체마다 GC 힙에 해당 인스턴스 정보를 복사하고, 동시에 새 객체를 스택에 올립니다. 스택 포인터가 가리키는 주소는 방금 GC 힙에 복사된 메모리 주소입니다. 따라서 메서드 호출 속도 측면에서 정적 메서드가 더 빠릅니다. 왜냐하면 비정적 메서드는 인스턴스화되고 메모리를 할당해야 하기 때문입니다.
프로그래밍 역사에서 볼 때, 초기 구조화 프로그래밍의 거의 모든 방법들은 정적인 방법이었고, 인스턴스화 방법의 도입은 객체지향 프로그래밍의 문제였기 때문에, 인스턴스화 방법은 실행 효율성과 메모리 문제를 해결하기 위한 것이 아니었습니다. 개발을 더 패턴화하고 객체지향적으로 만드는 것입니다.
위 분석을 통해 결론을 내릴 수 있습니다: 1. 정적 방법과 비정적 방법은 해법의 구분입니다. 2. 상속, 다형성, 또는 메서드가 클래스의 객체와 무관할 경우, 도구 클래스와 같은 정적 메서드를 선택해야 합니다.
2. 싱글톤 모드와 정적 방법의 차이점은 무엇인가요?
때때로 엔지니어링에서 런타임에 로드되는 일부 구성 속성 같은 정보를 유지해야 하며, 이는 애플리케이션 수명 전반에 걸쳐 존재해야 하며 공개되어 있으므로 한 개의 복사본만 필요합니다. 현재는 이 데이터를 유지하기 위해 싱글턴 또는 정적 방법을 고려할 예정이지만, 이 데이터는 객체지향 방식으로 얻어져 싱글턴을 사용할 것입니다.
첫째, 정적 메서드는 클래스 기반이고 싱글톤은 객체 기반입니다. 해상도 패턴이 객체 기반이라면 싱글톤을 사용하고, 그렇지 않으면 정적 방식을 사용하세요. 예를 들어, 싱글톤을 사용하려면 클래스를 상속하고, 인터페이스를 구현하며, 초기화 지연, 부모 클래스 재작성 등을 해야 하고, 두 번째로 정적 메서드는 프로세스 지향, 싱글턴은 객체 지향입니다. 셋째, 정적 속성 변수는 GC에서 지우지 않으므로 싱글톤 객체는 GC에서 지우지 않으며, 정적 메서드에서 생성된 객체는 정적 메서드가 실행될 때 해제됩니다. |