1. 교과목 소개와 특성
- 프로그래밍 언어들의 개념적 기초
- 각 언어가 가진 특징과 장점
- 운영체제, 하드웨어 시스템과의 연계성
- 문제 해결을 위한 최적의 언어 선택 방법
2. 컴퓨터 시스템의 기초
2.1 컴퓨터의 5대 장치
- 연산장치
- 제어장치
- 기억장치
- 입력장치
- 출력장치
2.2 최초의 컴퓨터 시스템
- ABC 컴퓨터 (1943년)
- Atanasoff와 Berry가 설계
- 최초의 전자식 컴퓨터
- ABC = Atanasoff-Berry Computer
- ENIAC (1946년)
- 대포 탄도 계산용으로 개발
- 2차 세계대전 중 개발 시작
- 폰 노이만 구조 (1948년)
- 현대 컴퓨터의 기본 구조 확립
- 프로그램 내장 방식 도입
- 현재까지 사용되는 기본 구조
3. 프로그래밍 언어의 정의
3.1 기본 정의
- 컴퓨터와의 의사소통을 위한 표현법
- 계산을 기술하는 형식적 표현 체계
- 기계가 읽을 수 있고 사람도 이해할 수 있는 형식
3.2 자연어와 인공어의 차이
- 자연어
- 자연 발생적으로 생성
- 시간과 지역에 따라 변화
- 한국어, 영어 등의 일반 언어
- 인공어(프로그래밍 언어)
- 인위적으로 설계
- 명확한 문법 규칙
- 모호성이 없는 의미 전달
4. 프로그래밍 언어 학습의 중요성
4.1 학습의 필요성
- 기존 언어에 대한 깊은 이해
- 효율적인 프로그래밍 능력 향상
- 적절한 언어 선택 능력 개발
- 새로운 언어 학습의 용이성
- 언어 설계 능력 기초 습득
4.2 언어와 사고의 관계
- 프로그래밍 언어는 사고방식과 밀접한 관련
- 컴퓨터에 대한 이해와 프로그래밍 능력은 상호 연관
- 언어 이해를 통한 컴퓨터 활용 능력 향상
5. 프로그래밍 언어의 역사적 발전
5.1 초기 발전
- 1957-58년: 최초의 고급 프로그래밍 언어
- 하드와이어드 시스템에서 프로그램 내장 방식으로 발전
- 어셈블리어의 등장과 발전
5.2 현대적 발전
- 현재까지 약 260여 개의 프로그래밍 언어 개발
- 객체지향 프로그래밍의 등장과 발전
- 하드웨어 발전에 따른 언어의 진화
프로그래밍 언어의 학습과 진화
1. 프로그래밍 언어의 발전 배경
1.1 시대적/환경적 변화
- 하드웨어 환경 변화에 따른 요구사항 진화
- 프로그래밍 언어 설계 개념의 지속적 변화
- 전산학의 기본 법칙과 개념의 정형화 진행 중
- 일부 근본적 문제들은 여전히 논쟁 중
2. 프로그래밍 언어의 형식적 정의
2.1 역사적 발전 과정
- 1940년대 이전
- 하드와이어드 방식 (전선 연결 방식)
- 초기 프로그래밍 개념의 태동
- 1940년대 후반
- 폰 노이만 방식의 프로그래밍 개념 등장
- 프로그램 내장 방식(Stored Program) 도입
- CPU 실행 가능한 기계어 명령 코드 체계 확립
- 어셈블리 언어의 등장
- 기계어 코딩의 어려움 해소
- 심볼 기반 프로그래밍 도입
- 기계 종속적, 저급 수준 추상화
- 읽고 쓰기의 어려움 존재
- 고급 언어의 출현
- 높은 수준의 추상화 도입
- 일상적 표현 방식 채택
- 주요 특징:
- 간단하고 이해하기 쉬운 표현
- 하드웨어 독립성(포터빌리티)
- 배정문, 반복문, 선택문 기본 구조
2.2 문맥 자유 언어(Context-Free Language)
- 현대 프로그래밍 언어의 기반
- 4가지 문법 클래스 중 3번째 단계
- 스택 자료구조 활용
- 정규 문법(Regular Grammar)과 함께 현대 프로그래밍 언어 정의
3. 프로그래밍 언어의 특성
3.1 기계 가독성(Machine Readable)
- 효과적인 기계어 번역 가능
- 제한된 시간 내 번역 실행
- CPU 실행 가능한 코드 생성
3.2 인간 가독성(Human Readable)
- 기계 독립적 추상성 제공
- 자연어에 가까운 표현 방식
- 번역 과정 필요성
3.3 지역성(Locality)
- 대형 프로그램의 판독성 문제 해결
- 부분적 이해 가능성 제공
- 함수 단위 프로그래밍 지원
- 운영체제 지역성 개념과 연관
3.4 개발 환경 통합
- 소프트웨어 개발 환경 포함 추세
- 통합 개발 환경(IDE) 중심
- 다중 언어 지원 (예: Visual Studio)
4. 프로그래밍 언어 학습의 중요성
4.1 언어 이해 증진
- 현재 사용 중인 언어의 깊은 이해
- 효율적 알고리즘 작성 능력 향상
- 다양한 언어 특징 비교 분석
4.2 프로그래밍 능력 향상
- 유용한 프로그래밍 구사 능력 배양
- 풍부한 프로그래밍 어휘력 확보
- 다양한 구현 기술 습득
4.3 언어 선택 능력
- 문제에 적합한 언어 선택
- 효율적 문제 해결 방법 결정
- 새로운 언어 학습 용이성
프로그래밍 언어의 추상화 개념
1. 추상화의 기본 개념
1.1 추상화의 정의
- 주어진 작업이나 객체를 필요한 속성들의 일부분만으로 묘사하는 방법
- 현대 프로그래밍 언어의 핵심 개념
- 불필요한 세부사항을 감추고 필수적인 특징만 표현
1.2 추상화의 예시: “사람” 개념
- 기본적 특징: 외형(눈, 코, 귀, 손발 등)
- 기능적 특징: 먹기, 말하기, 걷기 등
- 상세 특성 생략: 분자 구조, 정확한 체내 수분 비율 등
- 필수적 속성만으로 개념 표현
2. 추상화의 주요 분류
2.1 자료 추상화 (Data Abstraction)
- 기본적 추상화
- 컴퓨터 내부 자료 표현
- 메모리 관리(변수 사용)
- 이진수의 10진수 표현
- 구조적 추상화
- 배열(Array)
- 구조체(Struct)
- 레코드(Record)
- 단위 추상화
2.2 제어 추상화 (Control Abstraction)
- 기본적 추상화
- 기본 명령어 그룹화
- 고수준 명령어 표현
- 예: x = x + 1, goto 문
- 구조적 추상화
- 제어 구조: if문, switch-case문
- 반복 구조: for, while, do-while
- 함수 호출 체계
- 단위 추상화
- 프로시저(함수 포함)
- 라이브러리 함수
- 수학 함수(sin, cos 등)
3. 추상화의 현대적 발전
3.1 병행 프로그래밍
- 동기화(Synchronization) 개념
- 통신 메커니즘
- 코루틴, 태스크, 프로세스
3.2 컴포넌트 프로그래밍
- 재사용 가능한 컴포넌트
- 모듈화된 설계
- 인터페이스 기반 통신
4. 추상화의 실제 적용
4.1 객체 지향 프로그래밍
- 클래스를 통한 추상화 구현
- 인스턴스(객체)를 통한 실체화
- 예: 사람 클래스와 실제 개인(객체)
4.2 식별자 시스템
- 이름을 통한 객체 구분
- 고유 식별자 필요성(예: 주민등록번호)
- 중복 방지 메커니즘
5. 추상화의 이점
- 가독성(Readability) 향상
- 코드의 이해도 증가
- 유지보수 용이성
- 신뢰도 향상
- 모듈화 용이
- 복잡성 관리
- 필수 정보만 노출
- 불필요한 세부사항 은닉
- 전체 시스템의 단순화