-
수식계산
수식은 연산자, 함수를 피연산자또는 매개변수에 적용하는 표현이다.
피연산자 또는 매개변수는 재귀적 정의에 의해 수식이다.피연산자와 매개변수 자리에는 수식이 나올 수 있기 때문에 재귀적이다.
연산자
특별하고 간단한 구문을 사용하는 빌트인 함수빌트인 함수는 어너 설계 과정에서 미리 만들어진 함수를 말한다.
연산자의 표기는 중위표기, 후위표기, 전위표기가 있다.
언어에 따라서 이 형식이 달라지기도 한다.
다중 키워드 연산에서 중위 표기법이 쓰이기도 한다.
삼항연산자가 그 예시이다.후위표기는 우리가 알고있는 후위연산자++이 있다.
파이썬은 후위연산자가 존재하기 않는다.
연어를 설계할때 수식을 정의할때 한가지를 나타낼때 여러가지 표현을 가능하도록
하지 않기 위함이다.(언어의 일관성)우선순위
다음과 같은 복잡한 수식이 있다고 해보자.
a + b * c ** d ** e / f
전위표기법은 애초에 괄호를 많이 사용하기 때문에 우선순위의 문제가 발생하지 않는다.
단, 중위표기법에서는 괄호를 최대한 사용하지 않기 때문에 문제가 생긴다.
따라서 언어별로 지원하는 우선순위를 확인해야 할 필요가 있다.결합규칙
결합 규칙은 언어들 간에 차이가 좀 적은 편이지만 여전히 차이가 있다.
기본 수학 연산자는 항상 좌에서 우로 결합되며, 그 결과 9 - 3 - 2는 4가 되지 8이
아니다.
파이썬에서는 제승 연산자 (**
)가 표준적인 수학의 표기법을 따라 오른쪽
에서 왼쪽으로 결합된다. 즉 2**
2**
3는 256이지 64가 아니다.
지정을 수식 안에 서 쓸 수 있게 허용하는 언어라면 지정은 오른쪽에서 왼쪽으로 결합된다.
그러므로 C에서 a = b = a + c 는 a + c를 b에 넣고 그런 다음 그 값을 a에도 넣는다.
규칙은 언어마다 약간씩 차이가 있으므로 확실하지 않은 경우 괄호를 하도록 권장한다.지정의 의미
순수한 함수형 언어라면 수식이 프로그램을 구성하는 블록이 되고 계산은 전적으로 수식의 계산으로 이루어진다.
전체 계산에서 어느 수식 부분의 효과는 그 수식이 자기를 둘러싼 문맥에 돌려주는 값으로만 나타난다.
복잡한 계산은 재귀를 이용하여 무한개까지의 가능한 값과 수식과 문맥을 생성할 수 있다.
명령형 언어에서는 반대로 계산은 메모리에 있는 변수의 값을 차례로 변경시키는 과정이다.
지정은 이러한 변경을 일으키는 가장 기본 수단이다.
각 지정은 두개의 아규먼트를 받는데 하나는 값이고 하나는 값을 대입할 변수를 가리키는 참조
이다.1. d = a; 2. a = b + c;
1에서 a는 값이고 2에서는 b + c를 넣을 위치이다.
C언어에서 변수는 값을 저장하는 장소에 이름을 붙인 것이다.
이름이 곧 저장소이고 저장소에 값을 복사하는 것이다.
즉, 변수의 값 보델이라고 부르고 포인터도 주소값으로 취급한다.지정문에서 왼쪽에서 쓰이는 방식 때문에 위치를 나타내는 수식은 l-value라고
불려진다. 값을 나타내는 수식은 (어떤 주소에 저장될 값일 수 있다.) r-값이라
고 불린다. 변수의 값 모델에서는 주어진 수식이 어디에 나타나는가에 따라 l-값
또는 r-값이 된다.값과 참조모델
몇몇 언어에서 변수의 참조모델을 도입하면서 l값과 r값을 보다 명시적으로 구분하고 있다.
파이썬은 변수는 값을 가지는 컨테이너의 일밍 아니라 값에대한 참조 이름이다.b = 2l c = b; a = b + c;
C프로그래머는 b에 2를 넣고 그 값을 c에 복사했다. 그리고 그 값을 읽어서 합을 a에 넣는다 라고 할 것이다.
파이썬 프로그래머는 b가 2를 가리키게 하고 c가 또 그것을 가리키게 한다. 그리고 그 두 참조를 +연산에게 보내서 a가 그 결과를 참조하게 하낟.
라고 할 것이다.값 모델
변수는 이름, 값, 저장소를 가진다.참조모델
변수가 값을 가지는 저장소라기 보다 값에대한 참조
모든 변수가 l-value이고 r-value가 기대되는 곳에 나타나면 값을 간접 참조한다.(묵시적, 자동)변수의 값과 참조 모델의 차이에서 변수의 값이 그 자리에서 바뀔 수 있는가 라는 점과 다른 객체를 가리키는 두 변수의 값이 같을 수 있는가 라는 점을 구
별하는 것이 특히 중요하다.이것은 프로그램의 결과에 영향을 미치게 된다. 즉 두 변수가 다른 객체를 가리키는데 값이 같을 수 있다면 객체가 같은지와 값이 같
은지가 구별되어야 한다.
이것이 자바 언어에서 a == b와 a.equals(b)를 구별해야 하는 이유이다.박싱
자바와 같은 혼합 모델에서 빌트인 타입에 대해 값 모델을 이용하는 것의 문제점은
값 모델 객체를 클래스 타입(참조 모델)을 기대하는 매개변수 자리에 넘길수 없다는 점이다.
값 모델 객체는 Object를 상속하지 않기 때문이다.
따라서 프로그래머가 래핑 객체를 만들어 이를 전달해야 한다.
이를 박싱이라고 한다.값 모델 변수를 참조모델 객체로 바꿈.
박싱한 객체에서 다시 값을 꺼내는 것을 언박싱이라고 한다.
자바의 초기 버전에서는 프로그래머가 빌트인 타입의 객체를 클래스
컨테이너에 넣으려면 클래스 객체로 래핑(wrapping, 포장)해야 했다.import java.util.Hashtable; ... Hashtable ht = new Hashtable(); ... Integer N = new Integer(13); // Integer is a "wrapper" class ht.put(N, new Integer(31)); Integer M = (Integer) ht.get(N); int m = M.intValue();
자바 5 이후로는 자바 언어에서 자동 박싱과 언박싱을 정의했기 때문에 명시적
으로 박싱과 언박싱을 지정할 필요가 없다. 또한 해시테이블은 제너릭에서 해시맵
으로 정의되어 Integer 타입에 대해서 제너릭 클래스의 객체가 생성되므로 get의
결과를 (Integer)로 변환할 필요도 없어진다import java.util.Hashmap<T>; ... Hashmap<Integer, Integer> ht = new Hashmap<>(); ... ht.put(13, 31); int m = ht.get(13);
그러나 혼합모델인 자바 언어에서는 여전히 int 타입을 제너릭의 타입 매개변수
로 줄 수 없고 컬렉션 클래스의 요소 타입으로 쓸 수도 없다.728x90