식 (프로그래밍)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
식 (프로그래밍)은 프로그래밍 언어에서 값을 계산하는 데 사용되는 구문 요소이다. 절차적 프로그래밍 언어에서는 식과 문이 구분되며, 식은 연산자와 피연산자로 구성되거나 함수 호출의 형태를 가질 수 있다. 식의 종류에는 변수, 리터럴과 같은 부분을 갖지 않는 식, 연산자와 피연산자로 구성된 연산자 식, 함수 또는 프로시저를 호출하는 함수 호출 식이 있다. 대입은 변수에 값을 할당하는 동작으로, 언어에 따라 문 또는 식으로 취급된다. 많은 프로그래밍 언어에서 식은 부작용을 가질 수 있으며, C 언어와 같은 일부 언어에서는 void 타입의 함수 호출이 void 타입의 식을 생성한다.
절차적 프로그래밍 언어에서는 식과 문이 명확하게 구분되는 경우가 많다. 이러한 언어에서는 프로시저가 여러 개의 문으로 구성되고, 식으로 이루어진 "식 문"이라는 문이 있는 것과 같은 구문(syntax)이 많다. 구문적으로 볼 때, 세미콜론 등으로 식이나 문을 분할하거나 종결하는 언어가 많고, 줄 바꿈으로 그렇게 되는 경우도 있다.
식은 내부에 다른 식을 포함할 수 있는지 여부에 따라 분류할 수 있다. `2 + 3`은 `5`로 평가되는 산술식이며, 변수는 메모리의 값을 나타내므로 `y + 6`과 같은 형태도 식에 해당한다. 관계식의 예로는 `4 ≠ 4`가 있으며, 이는 `false`로 평가된다.[2][3]
대입은 변수에 값을 할당하는 동작이다. 언어에 따라 대입이 문(statement)인 경우와 대입 연산자를 사용한 식(expression)인 경우가 있다.[1]
2. 식과 문
문을 특수한 괄호로 묶으면 식으로 만들 수 있는 언어도 있지만, 그다지 많지 않다. GCC에서는 독자적인 확장으로 지원되고 있다[5]。
식과 문이 명확하게 구분되지 않는 언어도 있다.
3. 식의 종류
3. 1. 부분을 갖지 않는 식
변수는 메모리의 값을 나타내며,[2][3] 몇몇 종류의 리터럴은 내부에 더 작은 부분을 가지지 않는다.
3. 2. 연산자 식 (Operator Expression)
연산자와 피연산자로 구성된 식이다. `2 + 3`은 `5`로 평가되는 산술 및 프로그래밍 식이다. 변수는 메모리의 값을 나타내므로 식이며, `y + 6`도 식이다. 관계식의 예로는 `4 ≠ 4`가 있으며, 이는 `false`로 평가된다.[2][3]
FORTRAN처럼 수치 계산만을 생각하면 되었던 시대에는 이항 연산자가 매우 일반적인 언어 기능으로 여겨졌지만, 이후 모든 데이터 형식을 프로그래밍 언어가 다루게 되면서, 이러한 데이터 형식과 연산자를 어떻게 처리할 것인지는 언어마다 달라졌다.
단항 연산은 하나의 피연산자를 가지는 연산으로, 피연산자 앞에 오는 전위(prefix) 연산자와 뒤에 오는 후위(postfix) 연산자가 있다. 삼항 연산자는 세 개의 피연산자를 가지는 연산자이다.
3. 2. 1. 이항 연산자 (Binary Operator)
FORTRAN처럼 수치 계산만을 생각하면 되었던 시대에는 이항 연산자가 매우 일반적인 언어 기능으로 여겨졌지만, 이후 모든 데이터 형식을 프로그래밍 언어가 다루게 되면서, 이러한 데이터 형식과 연산자를 어떻게 처리할 것인지는 언어마다 달라졌다. 언어에 따라서는 대입 등도 대입 연산자 등의 식으로 수행하는 설계를 하는 경우도 있다.
이러한 구문에서 골칫거리는 "연산자의 결합성"(:en:Operator associativity)과 "연산자 우선순위"(operator precedence)이다. 직관적으로는, 적어도 초등 교육 이후부터 익숙해진 "곱셈과 나눗셈이 먼저, 덧셈과 뺄셈이 나중"이라는 규칙이 있는 편이 이해하기 쉽지만, 그 외에도 여러 가지 "컴퓨터 프로그래밍에서 이것도 사용하고 싶다"는 연산, 예를 들어 비트 연산 등을 추가해 나가면 계층이 여러 단계로 늘어나게 된다.
C 언어 설계의 실수 중 하나는 비트 연산자 `&`와 `|`의 우선순위가 `==`보다 낮다는 점인데, 이는 예전에는 C 언어에 논리 연산자 `&&`와 `||`가 없어, 문맥에 따라 연산자의 의미가 바뀌는 사양이 있었던 것이 원인이다.[6]
이처럼 연산자와 관련된 문법 사양을 설계하는 것은 어렵고, 게다가 최근에는 앞서 언급했듯이 데이터 형식이 증가하면서 더욱 어려운 요소가 늘어나고 있다.
3. 2. 2. 단항 연산자 (Unary Operator)
단항 연산은 하나의 피연산자를 가지는 연산자이다. 피연산자 앞에 오는 전위(prefix) 연산자와 뒤에 오는 후위(postfix) 연산자가 있다. C 언어의 경우, (후위) `++`와 `--`, 즉 증가 및 감소 연산자 외에도 `expression.name`과 `expression->name`과 같은 구조체 등의 요소 선택도 구문적으로 후위 연산자이다.[2][3]
3. 2. 3. 삼항 연산자 (Ternary Operator)
삼항 연산자는 세 개의 피연산자를 가지는 연산자이다.
3. 3. 함수 호출 식
C와 대부분의 C 파생 언어들에서 void 반환 타입이 있는 함수에 대한 호출은 void 타입의 유효한 식이다.[8] void 타입의 값은 사용할 수 없으므로 이러한 식의 값은 무조건 버려진다.
함수 호출은 프로시저를 서브루틴으로 호출하는 식으로, `f(x, y)`와 같이 겉보기에는 수학에서의 함수 표기법과 유사한 구문을 사용하는 경우가 많다. 이는 함수형 프로그래밍 언어가 아닌 프로그래밍 언어에서도 대부분 이러한 표기법을 사용하거나, 이 언어 기능을 가지고 있기 때문이다.
4. 대입 (Assignment)
C#에서 대입은 식이지만, VB.NET에서는 대입은 문이다. 그렇기 때문에 비슷한 코드이지만 전혀 다른 처리 결과를 얻게 된다.[1]
C# 코드 예시:
```csharp
// C#
dynamic x = 123;
dynamic y = 234;
dynamic z;
z = y = x;
Console.WriteLine(x); // 123
Console.WriteLine(y); // 123
Console.WriteLine(z); // 123
```
VB.NET 코드 예시:
```vbnet
' VB.NET
Dim x = 123
Dim y = 234
Dim z
z = y = x
Console.WriteLine(x) '123
Console.WriteLine(y) '234
Console.WriteLine(z) 'False
```
5. 부작용 (Side Effect)
많은 프로그래밍 언어에서 함수, 따라서 함수를 포함하는 식은 부작용을 가질 수 있다. 부작용이 있는 식은 일반적으로 참조 투명성의 속성을 갖지 않는다. 부작용의 형식적인 개념은 실행 중인 프로그램의 추상 상태에 대한 변경이다.
또 다른 부류의 부작용은 캐시 메모리에 데이터를 로드하는 것과 같은, 계산 시스템의 구체적인 상태에 대한 변경이다. 종종 "부작용이 없는" 것으로 묘사되는 언어는 일반적으로 사이드 채널 공격과 같이, 악용될 수 있는 구체적인 부작용을 여전히 가지고 있다.
게다가 (다른 명백한 부작용이 없는) 식을 평가하는 데 걸리는 시간은 시스템의 정확한 작동에 때때로 필수적이다. 왜냐하면 시간상의 동작은 평가 환경 외부에서 상호 작용하는 시스템의 다른 부분에 의해 쉽게 보이기 때문이다. 그리고 벤치마크 테스트를 수행할 때와 같이, ''주된'' 효과로 간주될 수도 있다.
추상 부작용이 없는 식이 표현식이 평가되는 처리 환경에 의해 실행 경로에서 합법적으로 제거될 수 있는지 여부는 특정 프로그래밍 언어 사양에 따라 달라진다.[1]
6. 결과 타입으로서의 Void
C와 대부분의 C 파생 언어에서 void 반환 타입이 있는 함수에 대한 호출은 void 타입의 유효한 식이다.[8] void 타입의 값은 사용할 수 없기 때문에 이러한 식의 값은 무조건 버려진다.
참조
[1]
서적
Concepts in Programming Languages
Cambridge University Press
2002
[2]
웹사이트
Javascript expressions, Mozilla
https://developer.mo[...]
2009-07-06
[3]
웹사이트
Programming in C
https://www.cs.drexe[...]
2009-07-06
[4]
간행물
ISO/IEC 9899:1999
http://www.open-std.[...]
2009-08-31
[5]
웹사이트
Using the GNU Compiler Collection (GCC): Statement Exprs
https://gcc.gnu.org/[...]
[6]
웹사이트
http://www.lysator.l[...]
[7]
서적
Concepts in Programming Languages
Cambridge University Press
2002
[8]
간행물
ISO/IEC 9899:1999
http://www.open-std.[...]
2009-08-31
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com