이미 추측 한 것처럼 C ++은 해당 메커니즘없이 동일한 기능을 제공합니다. 따라서 엄밀히 말하면 try
/ finally
메커니즘은 실제로 필요하지 않습니다.
즉, 그것없이 수행하면 나머지 언어가 디자인되는 방식에 대한 몇 가지 요구 사항이 부과됩니다. C ++에서는 동일한 액션 세트가 클래스의 소멸자에 구현됩니다. C ++에서 소멸자 호출이 결정적이므로 주로 (독점적으로?) 작동합니다. 이것은 결국 객체 수명에 대한 다소 복잡한 규칙으로 이어지며, 그 중 일부는 직관적이지 않습니다.
다른 언어의 대부분은 대신 가비지 수집 형식을 제공합니다. 가비지 수집에 대해서는 논란의 여지가 있지만 (예 : 다른 메모리 관리 방법에 대한 효율성) 일반적으로 한 가지가 아닙니다. 가비지 수집기가 개체를 "정리"하는 정확한 시간은 직접 연결되지 않습니다. 개체의 범위에. 이를 통해 단순히 올바른 작업을 위해 필요할 때 또는 정리 작업이 임의로 지연되지 않도록 소중한 리소스를 처리 할 때 정리를 결정해야하는 경우 사용을 방지합니다. try
/ finally
그러한 언어가 결정 론적 정리를 요구하는 상황을 처리 할 수있는 방법을 제공합니다.
이 기능에 대한 C ++ 구문이 Java보다 "친숙하지 않다"고 주장하는 사람들은 그 요점이 누락되었다고 생각합니다. 더구나, 구문을 뛰어 넘는 책임 분담에 대한 훨씬 더 중요한 점이 누락되어 있으며 코드 디자인 방식과 더 많은 관련이 있습니다.
C ++에서이 결정적 정리는 오브젝트의 소멸자에서 발생합니다. 즉, 객체 자체를 정리하도록 객체를 설계 할 수 있습니다 (일반적으로 설계해야 함). 이것은 객체 지향 디자인의 본질로갑니다. 클래스는 추상화를 제공하고 자체 불변성을 적용하도록 설계되어야합니다. C ++에서 정확하게 하나를 수행합니다. 그것이 제공하는 불변량 중 하나는 객체가 파괴되면 해당 객체 (메모리뿐만 아니라 모든 객체)에 의해 제어되는 리소스가 올바르게 파괴된다는 것입니다.
Java (및 유사)는 다소 다릅니다. finalize
이론적으로 유사한 기능을 제공 할 수있는 기능을 지원하는 (다양한) 지원 은 지원이 약하기 때문에 기본적으로 사용할 수 없으며 실제로는 전혀 사용되지 않습니다.
결과적으로 클래스 자체 가 필요한 정리를 수행 할 수 있기 보다는 클래스 의 클라이언트 가 조치를 취해야합니다. 우리가 충분히 근시안적인 비교를한다면, 언뜻보기에이 차이가 아주 작고 Java가이 점에서 C ++과 상당히 경쟁적인 것 같습니다. 우리는 이런 식으로 끝납니다. C ++에서 클래스는 다음과 같습니다.
class Foo {
// ...
public:
void do_whatever() { if (xyz) throw something; }
~Foo() { /* handle cleanup */ }
};
... 그리고 클라이언트 코드는 다음과 같습니다.
void f() {
Foo f;
f.do_whatever();
// possibly more code that might throw here
}
Java에서는 클래스에서 객체가 조금 덜 사용되는 코드를 조금 더 교환합니다. 이것은 처음에는 상당히 균형 잡힌 것처럼 보입니다. 실제 코드와는 거리가 멀다. 가장 일반적인 코드에서는 클래스를 한 곳 에서만 정의 하지만 많은 곳에서 사용하기 때문이다. C ++ 접근 방식은 한 곳에서 정리를 처리하기 위해 해당 코드 만 작성한다는 것을 의미합니다. Java 접근 방식은 여러 위치에서, 해당 클래스의 객체를 사용하는 모든 장소에서 정리를 여러 번 처리하기 위해 해당 코드를 작성해야 함을 의미합니다.
간단히 말해서 Java 접근 방식은 기본적으로 우리가 제공하려는 많은 추상화가 "누설"임을 보장합니다. 결정 론적 정리가 필요한 모든 클래스는 클래스의 클라이언트가 정리할 대상 및 정리 방법에 대한 세부 사항을 알아야합니다. 클래스 자체에 숨겨져있는 세부 사항보다는
나는 "자바 방법"을 호출했습니다 있지만 위, try
/ finally
다른 이름으로 유사한 메커니즘은 완전히 자바로 제한되지 않습니다. 눈에 띄는 예를 들어, .NET 언어 (예 : C #)의 대부분 (모두?)은 동일합니다.
최근 Java와 C #의 반복은 이와 관련하여 "클래식"Java와 C ++ 사이의 중간 지점을 제공합니다. C #에서 정리를 자동화하려는 개체는 IDisposable
인터페이스를 구현할 수 있습니다.이 인터페이스 Dispose
는 C ++ 소멸자와 비슷한 (적어도 모호한) 메서드 를 제공합니다 . Java에서 / 와 유사하게 이것을 사용할 수 있지만 C # 은 범위가 입력 될 때 작성 될 자원을 정의하고 범위가 종료 될 때 소멸 되는 명령문으로 태스크를 조금 더 자동화합니다 . C ++에서 제공하는 자동화 및 확실성 수준은 여전히 부족하지만 여전히 Java에 비해 크게 개선되었습니다. 특히, 클래스 디자이너는 방법 의 세부 사항을 중앙 집중화 할 수 있습니다try
finally
using
의 구현에서 클래스를 처리합니다 IDisposable
. 클라이언트 프로그래머에게 남은 using
것은 IDisposable
인터페이스가 필요할 때 사용 되도록하기 위해 명령문을 작성하는 부담이 적다 는 것입니다. Java 7 이상에서는 유죄를 보호하기 위해 이름이 변경되었지만 기본 개념은 기본적으로 동일합니다.