프로그래밍 언어 문법 | |
{{{#!folding [ 펼치기 · 접기 ] {{{#!wiki style="margin: 0 -10px -5px; word-break: keep-all" | 프로그래밍 언어 문법 C(포인터 · 구조체 · size_t) · C++(클래스 · 이름공간 · 상수 표현식 · 특성) · C# · Java · Python(함수 · 모듈) · Kotlin · MATLAB · SQL · PHP · JavaScript(표준 내장 객체) · Haskell(모나드) |
마크업 언어 문법 HTML · CSS | |
개념과 용어 함수(인라인 함수 · 고차 함수 · 콜백 함수 · 람다식) · 리터럴 · 문자열 · 상속 · 예외 · 조건문 · 반복문 · 비트 연산 · 참조에 의한 호출 · eval · 네임스페이스 · 호이스팅 | |
기타 #! · == · === · deprecated · NaN · null · undefined · 배커스-나우르 표기법 | }}}}}} |
프로그래밍 언어 목록 · 분류 · 문법 · 예제 |
1. 개요
deprecated /ˈdɛp.ɹɪ.keɪt.ɪd/특정 용어, 기능, 디자인 또는 관습의 사용을 비권장 내지 규탄하는 행위[1]를 뜻하는 영어 단어 'deprecation'의 분사형.
주로 프로그래밍 분야에서, 더 이상 사용이 권장되지 않는 특정한 API나 기능에 대해 deprecated되었다고 한다. deprecated된 API/기능은 이후 후속 버전에서 지원이 삭제[2]될 수 있다.
번역할 수 없는 표현이기 때문에 실무에서는 그냥 deprecated라고 영어로 쓰며 영어에 익숙하지 않거나 개발 자체가 처음인 초보자를 대상으로 설명할 때에는 경우에 따라 '비권장됨'[3], '지원 종료됨' 등으로 번역한다.
2. 원인
주로 버그가 있거나, 보안 취약점이 발견되었거나, 최신 버전에서 설계의 변화가 생겼거나, 해당 API가 이미 deprecated된 다른 API와 연관되어 있는 경우에 deprecated로 처리한다. deprecated된 API나 기능의 경우 새로운 코드를 작성할 때 사용하지 말고, 만약 기존 코드에서 사용된 경우 새로운 대체 API나 기능을 사용해 고칠 것을 권고한다.왜 바로 해당 API를 제거하지 않는지 의문이 들 수도 있는데, 해당 API가 조금이라도 안정 버전에 공개되었을 경우, 해당 API를 사용하는 다른 응용 프로그램의 호환성을 깨트리지 않기 위한 임시방편적 조치이다. 즉, 해당 API를 당장 지우지는 않겠지만, 미래에 반드시 사라질 예정이니 최신 버전을 사용하도록 권고하는 것.
3. 언어별 상세
3.1. C++
#!syntax cpp
// 변수 deprecate하기
[[deprecated]]
int deprecated_variable;
// 함수 deprecate하기
[[deprecated]]
void deprecated_function([[deprecated]] int deprecated_parameter) {} // 함수 파라미터 deprecate하기
// 타입 정의 deprecate하기
[[deprecated]]
typedef int deprecated_typedef;
// 클래스, 구조체, enum 등 deprecate하기
class [[deprecated]] deprecated_class {
public:
// 멤버 및 메서드 deprecate하기
[[deprecated]] int deprecated_member;
};
// deprecate 사유 추가하기
[[deprecated("본 함수는 다음과 같은 이유로 사용이 권장되지 않습니다.")]]
void deprecated_function2() {}
// warning: 'deprecated_function2' is deprecated: 본 함수는 다음과 같은 이유로 사용이 권장되지 않습니다.
C++14 표준부터 attribute를 통해 deprecate하는 기능이 추가되었다. #
3.2. Java
Java에서는@Deprecated
어노테이션과 JavaDoc의 @deprecated 태그를 사용하여 해당 기능이 더 이상 사용되지 않음을 컴파일러와 개발자에게 알릴 수 있다.#!syntax java
// Java deprecate 예시
public class Example {
// 변수 deprecate
/**
* @deprecated
* 해당 변수는 더 이상 사용되지 않습니다. {@link newVariable}을 사용하세요.
*/
@Deprecated
public static final String deprecatedVariable = "사용되지 않는 변수";
public static final String newVariable = "새로운 변수";
// 메서드 deprecate
/**
* @deprecated
* 해당 메서드는 더 이상 사용되지 않습니다. {@link #newMethod()}을 사용하세요.
*/
@Deprecated
public void deprecatedMethod() {
System.out.println("사용되지 않는 메서드");
}
public void newMethod() {
System.out.println("새로운 메서드");
}
// 클래스 deprecate
/**
* @deprecated
* 해당 클래스는 더 이상 사용되지 않습니다. {@link newClass}을 사용하세요.
*/
@Deprecated
public static class deprecatedClass {
public void doSomething() {
System.out.println("사용되지 않는 클래스");
}
}
public static class newClass {
public void doSomething() {
System.out.println("새로운 클래스");
}
}
// 열거형 depreacte
/**
* @deprecated
* 해당 열거형은 더 이상 사용되지 않습니다. {@link NewEnum}을 사용하세요.
*/
@Deprecated
public enum DeprecatedEnum {
// 열거형 상수 deprecate
/**
* @deprecated
* 해당 열거형 상수는 더 이상 사용되지 않습니다. {@link NEW_VALUE}을 사용하세요.
*/
@Deprecated
DEPRECATED_VALUE,
NEW_VALUE;
}
public enum NewEnum {
NEW_VALUE;
}
}
Java SE 9에서 @Deprecated
어노테이션에 추가된 속성인 since
와 forRemoval
을 사용하여 추가적인 정보를 제공할 수 있다. since
속성을 통해 해당 기능이 어떤 버전부터 deprecated되었는지, forRemoval
속성을 통해 해당 기능이 미래에 완전히 제거될 예정인지를 명시할 수 있다.#!syntax java
/**
* @deprecated
* 해당 메서드는 버전 1.5 이후로 더 이상 사용되지 않으며 삭제될 예정입니다. {@link #newMethod}를 사용하세요.
*/
@Deprecated(since = "1.5", forRemoval = true)
public void deprecatedMethod() {
System.out.println("사용되지 않는 메서드");
}
public void newMethod() {
System.out.println("새로운 메서드");
}
4. 유명한 예시
- PHP에서 5.3에 deprecated를 도입했는데, 이 때문에 PHP 5.3 이상에서 제로보드를 설치 시 설치 화면에 deprecated 범벅이 되는 사태가 발생했었다. 제로보드가 PHP 4.x 기준 문법을 사용했기 때문.
- PHP 5.3을 사용하는 경우 php.ini 파일에서
error_reporting = E_ALL ^ E_DEPRECATED
로 설정하면 deprecation 경고의 출력을 막아 정상적으로 ZB4를 사용할 수 있다. 하지만 PHP 5.4부터는 기존 버전에서 deprecated되었던session_register()
등의 지원이 완전히 삭제되었기 때문에 ZB4를 이용할 수 없다.
5. 관련 문서
[1] discouragement of use of something human-made, such as a term, feature, design, or practice[2] retire, phase out, EOL(End of Life) 등으로 표현한다[3] 이 표현의 경우 현재 완료형이 없는 한국어에서 전달하기 몹시 까다롭기 때문에 주로 문장형으로 풀어서 쓴다. 번역체에 가까운 'A 함수는 비권장되었다'라고 쓰는 대신 'A 함수는 x.y 버전부터 사용이 권장되지 않는다' 처럼 풀어서 쓰는 식.