언어
언어는 의사 전달 수단으로 자연어는 말과 글의 형태로 존재한다
프로그래밍 언어
프로그램 작성에 사용되는 언어로 사람이 기계에게 의사를 전달하는 수단이지만 사람끼리의 소통 또한 고려해야 한다
프로그램
컴퓨터가 수행할 명령어를 순서대로 나열해 둔 것
프로그래밍 언어는 컴퓨터가 수행할 수 있고 사람이 읽을 수 있는 형태로 계산을 나타내는 표기 체계
프로그래밍 언어의 특징
- 형식: 주로 글
- 내용: 엄밀한 규칙, 정확한 의도
- 방향성: 단방향
프로그래밍 언어르 배우는 이유
- 프로그래밍에 대한 사고 능력을 확장시켜 준다
- 문제 해결자로 현명하게 언어를 선택할 수 있도록 해준다
- 언어 사용자로서 언어를 자세히 배울 수 있게 해준다
- 현명한 관리자, 설계자가 될 수 있도록 한다
내 언어의 한계가 내 세상의 한계다
프로그래밍을 배워야 하는 이유
- 체계적으로 생각하는 방법을 가르쳐 준다
- 변화를 표현하는 방법을 가르쳐 준다
프로그래밍 언어의 기본 기능
- 작성력: 프로그래머의 의도를 나타낼 수 있도록 한다
- 가독성: 프로그램을 쉽게 해독할 수 있도록 한다
- 실행 가능성: 컴퓨터에서 실행될 수 있도록 한다
프로그래밍 언어의 부가 기능
- 추상화: 대상을 간략히 추려 나타내는 방법
- 모듈화: 복잡한 대상을 나누어 구성할 수 있는 방법
프로그래밍 언어의 특성
- 기계적: 기계적으로 처리할 수 있어야 한다 (엄밀한 규칙)
- 구조적: 복잡한 구조를 나타낼 수 있어야 한다 (자료구조, 제어구조)
- 가변적: 시대의 필요에 따라 바뀔 수 있음 (명령형 언어에 객체지향 개념 탑재 등)
프로그래밍 언어 스펙트럼
프로그래머 - 요구사항 -> 프로그래밍 언어 <- 제약사항 - 컴퓨터 구조
언어 스펙트럼 어셈블리어 - C - Python 점점 추상화 수준이 높아짐 어셈블리어가 컴퓨터 구조에 더 가깝고 Python 이 프로그래머에 더 가깝다 추상화 수준이 높을수록 프로그래머에 가깝다
저급 언어
- 기계에 종속적인 언어: 기계어, 어셈블리어
고급 언어
- 기계에서 독립적으로 정의되고 실행될 수 있는 언어: C, Java, Python 등
프로그래밍 언어의 구성 요소
데이터, 연산, 명령어, 서브프로그램, 타입, 모듈
데이터
자료를 프로그램이 처리할 수 있는 형태로 나타낸 것 숫자, 문자, 문자열, 멀티미디어 등
데이터의 분류
- 이진 데이터: 이진수의 나열로 이루어진 데이터
- 텍스트 데이터: 문자열을 나타내는 데이터
연산
데이터를 처리하는 방법 연산 적용 결과로 새로운 데이터를 얻는다
- 연산자: 특별한 연산을 수행하는 함수
- 변수: 연산 결과를 저장하는 이름
연순 표현 구조
- 수식: 값을 나타내는 표현
- 문장: 처리를 나타내는 표현
명령어
특정 작업을 지시하는 단어 if, while 등
대부분 프로그래밍 언어는 다양한 연산자와 명령을 통해 수식과 문장을 구성
연산의 종류
- 원시연산: 언어가 기본적으로 제공하는 연산
- 사용자 정의 연산: 프로그래머가 추가로 정의한 연산
- 라이브러리: 자주 사용할만한 연산을 미리 정의해둔 것
서브프로그램
전체 프로그램을 이루는 작은 코드 블록에 이름을 붙인 것으로 서브 루틴이라고 부르기도 한다
서브프로그램의 분류
- 함수: 연산 수행 결과 값을 반환하는 서브 프로그램
- 프로시저: 결과 값을 반환하지 않는 서브 프로그램
타입
데이터 집합과 연산 집합을 합친 개념 연산 안정성 보장을 위해 필요
타입 안정성
함수 f 타입이 f(x): A -> B 라면 모든 a => A 에 대해 f(a) => B 여야함
프로그래밍 언어 분류
- 강타입 언어: 타입 오류를 모두 검출하는 언어
- 약타입 언어: 일부 타입 오류를 허용하는 언어 (C, Java)
- 무타입 언어: 타입 선언문이 없고 타입이 계속 변경될 수 있는 언어
자바의 경우는 일부 타입 캐스팅을 제외하면 거의 강타입에 가깝다
모듈
독립적 프로그램 구성 단위로 서브프로그램도 모듈의 일종이다
모듈의 특징
내/외부를 구별하며 독자적 이름 공간을 차지한다 변수, 함수, 타입 등 프로그래밍 언어에서 제공하는 거의 모든 것을 포함한다
프로그래밍 언어 학습 방법
프로그래밍 언어의 두 가지 측면
프로그램의 형태 + 수행 과정
프로그램의 형태
- 작성한 프로그램
- 데이터
- 연산 -> 구문론적 관점에서의 프로그램
수행 과정
- 실행 시 프로세스
- 메모리
- 수행 흐름 -> 의미론적 관점에서의 프로그램
좋은 프로그램을 많이 읽어야 한다 프로그램을 많이 작성해 본다 직접 실행해보며 많이 생각해 봐야 한다