프로그래밍 개요
프로그래밍 정의
특정 결과 달성하기 위해 실행 가능한 컴퓨터 프로그램을 설계 및 구축하는 프로세스
분석 - 요구사항에 대한 분석
리소스 소비량
간단한 정의
말 그대로 프로그램을 만드는 행위 자체를 의미 (특정 목적을 위해 컴퓨터에 명령을 내림)
컴퓨터에게 실행을 요구하는 일종의 커뮤니케이션
코딩 vs 프로그래밍
코딩 : 프로그램 안에 포함되어 있는 프로그래밍의 하위 집합
프로그래밍 : 설계 - 구현 - 테스트(유지보수)까지의 단계 총집합
웹
백엔드 - 서버쪽
프론트엔드 - 디자인요소 강함
풀스택 = 백엔드 + 프론트엔드
프로그래밍 순서
문제 인식 + 프로그램 설계 > 프로그램 구현 > 테스트와 디버깅 > 프로그램 유지보수 > 문제 인식
프로그래밍 방법론
소프트웨어 개발 생명주기(SDLC : Software Development Life Cycle)
- 각 단계에서 작업 방법과 문서 작성 형식 등을 규정
- 요구 명세화 - 분석 - 설계 - 개발 - 시험 - 유지보수
개발 방법론 종류
- 구조적 방법론
- 객체지향 방법론
- CBD 방법론
프로그래밍 언어 개요
프로그래밍 언어 역사
- 1GL(First-generation programming language)
- 10진이나 이진 형태의 프로그램으로 구성
- 절대적인 기계어
- 천공카드나 자기테이프로부터 읽거나 컴퓨터 전면 패널의 스위치를 조작함으로써 읽는 언어
- 2GL
- 어셈블리어
- 기계어와 1:1 대응되기 때문에 변환기가 불필요
- 기계어에 상응하는 빠른 속도
- x86 CPU 기계어(10110000 01100001) => 어셈블리어(mov al, 061h)
- 3GL
- 고급 언어로서 현재 주로 사용되고 있는 프로그래밍 언어
- 컴파일러 혹은 인터프리터에 의해 변환(기계 독립적)
- C/C++, C# Java, BASIC
프로그래밍 언어 주요 특성
- 기능과 목표
- 추상화
- 표현력
프로그래밍 언어의 요소
- 구문(Syntax)
- 프로그램의 모습, 형태, 구조에 대해 정의하는 것 -> 언어의 문법을 확인
- 단어, 구, 컨텍스트
- 의미(Semantics)
- 타입 시스템(Type System)
프로그래밍 언어 분류 - 처리 수준
- 저급 언어(Low-level Language)
- 컴퓨터가 이해하기 쉽게 작성된 프로그래밍 언어
- 처리속도가 빠름
- 이식성 및 가독성이 낮음
- Intel x86, Microsoft x86-64, ARM, MIPS 등
- 고급 언어(High-level programming language)
- 사람이 알아듣기 쉬운 언어
- 처리속도가 느림
- 이식성 및 가독성이 높음
- 종류
- 컴파일 언어(Complied Language)
- 실행파일로 만들어서 실행함
- C, C++, Go, Rust 등
- 인터프리터 언어(Interpreted Language)
- 코드파일에서 1줄씩 실행함
- PHP, Java Script 등
- JIT 컴파일 언어(Just-In-Time complied Language)
- 컴파일 간단하게 거쳐서 기계어를 1줄씩 읽음(컴파일 + 인터프리터)
- C#, JAVA, Python 등
- 컴파일 언어(Complied Language)
절차적 언어(Procedural Language) & 객체 지향 언어(Object Oriented Language)
절차적 언어 | 객체 지향 언어 |
프로그램이 프로시저 단위로 나뉜다 | 프로그램이 객체 단위로 나뉜다 |
데이터와 함수가 분리되어 있다 | 데이터와 메서드가 통합되어 있다 |
순차적으로 처리한다 | 비순차적으로 처리한다(순차적이긴 함) |
개발생산성, 유지보수 및 확장에 용이하지 않다 | 용이하다 |
실행 속도가 빠르다 | 실행 속도가 느리다 |
C언어 탄생 배경
- C언어는 최초의 고급언어로 1972년 켄 톰슨과 데니스 리치가 벨 연구소에서 일할 당시 새로 개발된 유닉스 운영체제에서 사용하기 위해 개발한 프로그래밍 언어
- 과거 독보적 운영체제였던 유닉스에는 CPU 구조에 변화가 생길 때마다 매번 어셈블리어로 새로 작성해야 하는 문제가 있었는데 이를 개선하고자 탄생했다.
C언어 특징
- 하드웨어 제어
- 확장성
- 빠른 실행 속도
- 유연성
- 표준 라이브러리
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
- #include
- #은 전처리기, 컴파일 하기 이전에 미리 처리되는 문구
- 말 그대로 컴파일 하기 전에 처리해야하는 명령어를 의미
- 컴파일 하기 전에 우측에 존재하는 것을 추가하라는 의미
- stdio.h
- .h 확장자를 가지는 파일은 헤더파일로 C 표준 라이브러리가 제공해주는 함수들 정보가 있는 집합체
- 표준 입출력 헤더파일(STanDard Input Output)
- 입력과 출력에 관련된 라이브러리 함수들이 포함
- return 0;
- 함수가 종료되었을 때 값을 돌려주는 역할
- 기술 발달함에 따라 return 0 안해도 암묵적으로 0을 return 함
- C언어 표준에는 return 0;을 작성하도록 권장
- 세미콜론(;)
- 모든 코드 마지막에는 반드시 입력(마침표 역할)
- 없으면 에러 발생함
- main 함수
- C언어로 만든 프로그램 실행시 가장 먼저 실행되는 함수
- 프로그램 내에서 1개만 존재
- 반환 값 타임
- 정수형(int형)으로 반환
- 인자 값(void는 아무것도 없다는 의미)
- 아래 값을 인자로 받을 수 있음
- 인자 개수(Argc, Argument count)
- 인자 값(Argv, Argument value)
- 환경 변수 값(Envp, Environment Value)
- 아래 값을 인자로 받을 수 있음
- 반환 값 타임
식별자 (Identifiers)
: 변수, 함수, 상수 등을 식별하기 위한 고유 이름
- 식별자 규칙
- 알파벳(A-Z, a-z), 숫자(0-9) 및 밑줄("_")만 사용 가능
- 첫 번째 문자는 숫자(0-9)로 시작 불가
- 대소문자 구별함
- 공백이나 띄어쓰기 및 특수문자 사용 불가
- 키워드(예약어)는 식별자로 사용 불가
- 표기법
- Snake
- 각 단어 언더바로 연결
- snake_case
- Camel
- 시작을 소문자로 하고 각 단어의 시작은 대문자로 함
- camelCase
- 헝가리안
- 변수타입 이름 앞에 축약해서 붙임
- strName, intNum
- 파스칼
- 대문자로 시작해서 각 단어의 첫 글자를 대문자로 표기함
- PascalCase
- Snake
변수(Variables)
- 숫자, 문자와 같은 값들 저장하는 공간
- 데이터 타입, 변수 이름으로 구성
- 선언 방법
- 타입 변수이름[, 변수이름]; => 변수의 선언만 하는 방법
- 타입 변수이름 = 초기값[, 변수이름 = 초기값]; => 변수의 선언과 동시에 초기화하는 방법
상수(Constant)
- 프로그램 실행 중에 변경 불가능한 데이터
- 상수도 데이터 타입(Data type) 사용 가능
- 종류
- 리터럴 상수
- 이름 정의되지 않은 상수
- 심볼릭 상수
- 이름 정의되어 있는 상수
- const, define 키워드 사용
- 상수 사용시 초기화가 "반드시" 필요
- 리터럴 상수
자료형(Data Type)
- 정수형
- signed : 부호있는 변수 = 기본형식 | unsigned : 부호없는 변수 키워드 사용 가능 (정수형, 문자형만)
- short (2 byte)
- int (4 byte)
- long (4 byte)
- 문자형
- char (1 byte)
- 실수형
- float (4 byte)
- double (8 byte)
- long double (12 byte)
자료형(Data Type)별 크기
운영체제 | char | short | int | long | pointer |
32비트 UNIX | 1 byte | 2 byte | 4 byte | 4 byte | 4 byte |
64비트 UNIX | 1 byte | 2 byte | 4 byte | 8 byte | 8 byte |
64비트 Windows | 1 byte | 2 byte | 4 byte | 4 byte | 8 byte |
'정보보호과정' 카테고리의 다른 글
5주차(1) - 2022/03/07 리버스 엔지니어링 개요 (0) | 2022.03.07 |
---|---|
4주차(2) - 2022/03/02 프로그래밍 개론 (0) | 2022.03.02 |
3주차(4) - 2022/02/24 리눅스 기초 (0) | 2022.02.24 |
3주차(3) - 2022/02/23 리눅스 기초 (0) | 2022.02.23 |
3주차(2) - 2022/02/22 리눅스 기초(파일과 디렉터리) (0) | 2022.02.22 |