Names
- 변수의 issue
- 변수 길이
- python만 제약 없음, 다른 것들은 모두 제약 있음
- 대소 구분
- 대소구분하면 readability 떨어짐
- C기반 언어들은 변수 대소구분, 다른 문자들은 안함
- special words
- readability에 도움을 줌
keyword : 구문의 일부, 특별한 의미를 가짐 ⇒ 의미
reserved word: 이미 예약된 언어, 사용자가 정의하는 이름에서 사용 불가
- keyword의 대부분은 예약어임 (전부는 아님, java에서 goto는 예약어지만 키워드는 아니다. java는 goto에서 쓰이지 못한다.)
Variables 변수
💡 변수는 memory cell의 추상화(abstraction)
- 변수의 6가지 속성
- Name
- Address: 메모리주소
- Value
- Type
- Lifetime: memory에 올라올때~쫓겨날때까지의 시간
- Scope
- Address
- 변수는 실행될때마다 address가 달라질 수 있음.
- 만약 다른 변수가 같은 메모리 주소에 접근하려 한다면 → aliases
- aliases는 c,c++에서 포인터를 통해 생성됨, reliability와 readability 떨어트림.
- Type
- Value
- 위치에 따라 의미 달라짐
l-value: 변수의 l값은 주소
r-value: 변수의 r값은 값
- abstract memory cell은 int a; 에서 a 변수 자체를 의미
binding
속성이 결정되는 것
a name(변수, 함수등)에 the thing it names(코드, 클래스와 같은 실제 값)으로 연결하는 것.
- binding time
- 가능한 binding times
- language design time (연산)
- language implementation time (c에서 int type변수 size 결정)
- compile time (c, java 변수 타입 결정)
- load time (c, c++ static 변수를 메모리셀에 바인딩)
- runtime (nonstatic한 로컬 변수를 메모리셀에 바인딩)
Static binding
- 런타임 전에 첫 발생하고, 프로그램 실행 내내 변하지 않았다면 static binding임
⇒ binding이 실행시점 이전
Dynamic binding
- 실행 중에 첫 발생되고, 프로그램 실행 도중 바뀐다면 dynamic binding임
⇒ binding이 실행 시점
Explicit/Implicit Declaration
- 명시적 선언(Explicit Declaration): 변수의 타입을 선언문에 명시된 타입으로 바인딩한다.
- 묵시적 선언(Implicit Declaration): 변수명이나 대입할 값으로부터 정해지는 타입으로 변수의 타입을 바인딩한다. → writability는 + , reliability는 -
- Dynamic Type binding : 편하지만 공간, 시간적 비용은 높아진다. (Python)
- Advantage: flexibility
- Disadvantages: high cost, compiler가 type error detection 하는 것이 어렵다.
- storage bindings&lifetime
- allocation: 가능한 cells들 중 cell을 얻는 것
- deallocation: cell을 다시 가능한 cells 로 돌려놓는 것
- lifetime: process 시작~끝
- Static binding: 실행 전에 메모리 셀은 bound하고, 실행 내내 같은 메모리 셀에 바운드된채로 있는 것
- c, c++의 static 변수, 함수들
- 몇번 호출했는지 기억, 이전 상태 기억
- python은 static 키워드가 없어서, static 변수가 없다.
- Stack dynamic: static이 아니면 다 dynamic 붙음, heap만 implicit/explicit 구분
- 내가 사용할 문장이 실행 될 때 (런타임에)메모리를 할당
- history 기억x
- c의 static 아닌 local 변수들, java method들
- 여러번 호출하면 할당, 할당해제 반복으로 무리
- Explicit Heap dynamic
- 프로그래머가 명시한 것에 따라 할당/해제
- 오직 포인터와 참조에 의해서 일어난다
- c++ 의 new, delete 객체, 자바의 모든 객체 (자바는 모든 객체를 heap에 저장)
- Implicit heap-dynamic
- 할당과 해제가 할당문에 의해 이루어진다
- 효율적으로 쓰지 않으면 메모리 낭비, 에러 디텍션이 힘들다
Scope
변수 int a; 선언 시, a변수를 읽거나 쓸 수 있는 코드 영역
- static scope: c, c++, java, python 모두 해당
- 변수 범위: 그 변수가 선언된 블록 안
- c/c++ → 같은 이름의 변수 생성 시 블록으로 구분, java → 허용 안됨
- local 변수와 non local 변수로 구분
- non local : function이나 block 바깥 쪽에 선언된 변수. global 변수
- python에서 전역변수 사용은 가능하지만 수정을 불가능하다. 전역변수에 대입하면 자동으로 지역변수가 생기기 때문이다.
- 상태를 stack 형태로 유지, 관리
- dynamic scope: call chain을 따른다.
- 유지 보수가 어렵다
- writability 떨어진다
- 유일한 장점: 파라미터 패싱 편리함
Constants
- 주소 공간은 항상 static binding
- c, c++ → #define, java → final
- python → a=10 선언하고 값 안바꾸면 된다. 값을 바꾸면 변수가 됨
- value에 대한 binding은 expression만 아니면 static