프로그래밍 언어 문법 | ||
{{{#!wiki style="margin: -16px -11px; word-break: keep-all" | <colbgcolor=#0095c7><colcolor=#fff,#000> 언어 문법 | C( 포인터 · 구조체) · C++( 자료형 · 클래스 · 이름공간 · 상수 표현식 · 특성) · C# · Java · Python · Kotlin · MATLAB · SQL · PHP · JavaScript · Haskell |
마크업 문법 | HTML · CSS | |
개념과 용어 | 함수 · 인라인 함수 · 고차 함수 · 람다식 · 리터럴 · size_t · 상속 · 예외 · 조건문 · 참조에 의한 호출 · eval | |
기타 | == · === · deprecated · NaN · null · undefined · 모나드 · 배커스-나우르 표기법 | |
프로그래밍 언어 예제 · 목록 · 분류 | }}} |
1. 개요
일부 프로그래밍 언어들에서 지원하는 함수의 일종. 문자열로 된 표현식을 받아 코드로 해석하여 실행하는 역할을 한다. evaluate의 약자로, 문자열이 코드라고 가정하고 평가해서 실행한다는 의미다.비슷한 함수로
exec
등이 있다.2. 상세
eval(expression)
의 형태로 쓸 수 있다.일반적으로 코드를 동적으로 실행하기 위해 쓰인다. C언어 같은 컴파일러 언어에서는 지원하지 않고 Perl, JavaScript, Python 같은 스크립트 언어에 존재한다. 사용자가 입력하는 값이나 프로그램이 작동하면서 변하는 값을 문자열의 형태로 반영하여 실행할 수 있기 때문에 간편하다.
실행되는 모습을 보고 싶다면 F12 키를 눌러 자바스크립트 콘솔을 열고,
#!syntax javascript
e = 1
eval('2 + e')
라고 타이핑해보자. 당신이 두번째 줄의 인자로 입력한 것은 분명히 문자열이지만 정수 2와 변수 e 즉 정수 1을 더하여 3이 출력될 것이다.
3. eval() is evil
그러나eval
의 사용은 많은 경우에 금기시된다. 치명적인 보안 위험이 있기 때문이다.
GOTO문의 경우보다도 위험한데, GOTO는 아무리 잘못 써 봤자 그 코드를 다시 편집할 수 없게 만드는 정도에서 그치는 반면 eval
문을 잘못 사용하는 경우, 예를 들면 네트워크 상에서 가져온 문자열을 실행하는 경우 악의적으로 표현식을 작성한 사람에 의해
모든 너 데이터
다 내거다요 등의 사태가 일어날 수 있기 때문이다.eval
만으로 동적 실행을 하지 않으려고 하면 보안 위험이 적은 대체품은 얼마든지 있다. 일반적인 경우에는 동적으로 변수 등을 정해주는 함수, Python이라면 setattr
를 사용하면 될 일이지 eval
까지 사용할 이유는 없다.