프로그래밍 변수 종류 - peulogeulaeming byeonsu jonglyu

JayHyun 2021. 4. 26. 22:23

1. 데이터 타입

 데이터 타입은 변수에 저장될 데이터의 형식을 나타내는 것으로, 변수에 값을 저장하기 전에 문자형/정수형/실수형 등 어떤 형식의 값을 저장할지 데이터 타입을 지정하여 변수를 선언해야 한다.

유형

기능

정수(Integer)

정수 숫자를 저장할 때 사용

1, -1, 10, -100

부동 소수점(Floating Point)

소수점 이하가 있는 실수 저장할 때 사용

0.123, -1.6

문자(Character)

한 문자를 저장할 때 사용, ' ' 안에 표시

'A', 'b', '1', '*'

문자열(Character String)

문자열을 저장할 때 사용, " " 안에 표시

"Hello!", "1+2=3"

불리언(Boolean)

조건의 참 / 거짓(기본) 여부를 판단하여 저장

True, False

배열(Array)

◍ 같은 타입의 데이터 집합을 만들어 저장할 때 사용

◍ 데이터는 중괄호 안에 콤마로 구분하여 값을 나열

{1, 2, 3, 4}

1.1. C/C++ 의 데이터 타입 크기 및 기억 범위

종류

데이터 타입

크기

문자

char

1Byte

부호없는 문자형

unsigned char

1Byte

정수

short

2Byte

int

4Byte

long

4Byte

long long

8Byte

부호없는 정수형

unsigned short

2Byte

unsigned int

4Byte

unsigned long

4Byte

실수형

float

4Byte

double

8Byte

long double

8Byte

1.2. JAVA의 데이터 타입 크기

종류

데이터 타입

크기

문자

char

2Byte

정수

byte

1Byte

short

2Byte

int

4Byte

long

8Byte

실수형

float

4Byte

double

8Byte

논리형

boolean

1Byte


2. 변수 (Variable)

2.1. 변수의 개요

 변수는 컴퓨터가 명령을 처리하는 도중 발생하는 값을 저장하기 위한 공간으로, 변할 수 있는 값을 의미한다. 변수는 저장하는 값에 따라 정수형, 실수형, 문자형, 포인터형 등으로 구분한다.

2.2. 변수명 작성 규칙

◍ 영문자, 숫자, Underbar(_)를 사용할 수 있다.

◍ 첫 글자는 영문자나 under bar로 시작해야 하며, 숫자는 올 수 없다.

◍ 글자 수 제한은 없다.

◍ 공백, *, +, -, / 등의 특수문자를 사용할 수 없다.

◍ 대/소문자를 구분한다.

◍ 예약어를 변수명으로 사용할 수 없다.

◍ 변수 선언 시 문장 끝에 반드시 세미콜론을 붙인다.

2.3.기억 클래스(Storage Class)

 변수 선언 시 메모리 내에 변수의 값을 저장하기 위한 기억영역이 할당되는데, 할당되는 기억영역에 따라 사용 범위에 제한이 있다. 이러한 기억영역을 결정하는 작업을 기억 클래스(Storage Class)라고 한다.

▶ C언어에서의 기억 클래스

종류

기억 영역

예약어

생존 기간

사용 범위

자동 변수

메모리(스택)

auto

일시적

지역적

레지스터 변수

레지스터

register

정적 변수(내)

메모리(데이터)

static

영구적

정적 변수(외)

전역적

외부 변수

extern

1) 자동 변수(Automatic Variable)

 함수나 코드의 범위를 한정하는 블록 내에서 선언되는 변수이다. 함수나 블록이 실행되는 동안에만 존재하고, 이를 벗어나면 자동으로 소멸된다. 초기화하지 않으면 Garbage Value 값이 저장된다.

2) 외부 변수(External Variable)

현재 파일이나 다른 파일에서 선언된 변수나 함수를 참조하기 위한 변수이다. 함수 밖에서 선언하고, 함수가 종료된 뒤에도 값이 소멸되지 않는다. 

 초기화하지 않으면 자동으로 0을 갖는다. 다른 파일에서 선언된 변수를 참조할 경우 초기화 할 수 없다.

3) 정적 변수(Static Variable)

◍ 내부 정적 변수: 함수나 블록 내에서 선언, 선언한 함수나 블록 내에서만 사용 가능

◍ 외부 정적 변수: 함수 외부에서 선언, 모든 함수에서 사용 가능

 두 변수 모두 함수나 블록이 종료된 뒤에도 값이 소멸되지 않는다. 초기화는 변수 선언 시 한 번만 가능하고, 생략하면 자동으로 0의 값으로 초기화된다.

4) 레지스터 변수(Register Variable)

 레지스터 변수는 메모리가 아닌 CPU 내부의 레지스터에 기억영역을 할당받는 변수이다. 함수나 블록이 실행되는 동안에만 존재하며 벗어나면 자동으로 소멸한다. 

 레지스터의 사용 개수는 한정되어 있어 꽉 차면 자동 변수로 취급되어 메모리에 할당된다. CPU에 저장되어 메모리 주소를 가질 수 없기 때문에 변수의 주소를 구하는 주소 연산자(&)를 사용할 수 없다.

2.4. 변수의 선언

자료형 변수명 = 값;
int number = 10;   

// int 타입의 변수 명이 number인 변수를 선언한다. 변수의 값은 10이다. 

3. 연산자 

3.1. 산술 연산자

 산술 연산자는 산술 계산에 사용되는 연산자이다. 

모양

의미

모양

의미

+

덧셈

%

나머지 연산

-

뺄셈

++

증가 연산자

*

곱셈

--

감소 연산자

/

나눗셈

++, --는 1항 연산으로 사용 가능 

* 증가/감소 연산자는 ++a, --a와 같은 전치, a++, a--와 같은 후치가 있다. 연산자의 위치에 따라 값에 증/감을 먼저/나중에 처리한 후 연산을 진행한다.

3.2. 관계 연산자

 관계 연산자는 두 수의 관계를 비교하여 참/거짓의 결과를 얻는 연산자이다.

모양

의미

모양

의미

==

같다

!=

같지 않다

>

크다

>=

크거나 같다

<

작다

<=

작거나 같다

3.3. 비트 연산자

 비트 연산자는 비트별(0 또는 1)로 연산하여 결과를 얻는 연산자이다.

모양

의미

모양

의미

&

and, 모든 비트가 1일 때만 1

|

or, 모든 비트 중 하나라도 1이면 1

^

xor, 모든 비트가 같으면 0, 하나라도 다르다면 1

~

nor, 각 비트의 부정, 0이면 1, 1이면 0

<<

왼쪽 shift, 비트를 왼쪽으로 이동

>>

오른쪽 shift, 비트를 오른쪽으로 이동

3.4. 논리 연산자 

 논리연산자는 두 개의 논리 값을 연산하여 참/거짓을 결과로 갖는 연산자이다. 

모양

의미

!

not, 부정

&&

and, 모두 참이면 참

||

or, 하나라도 참이면 참

3.5. 대입 연산자

 연산 후 결과를 대입하는 연산식을 간략하게 입력할 수 있는 연산자이다. 

모양

의미

모양

의미

+=

a = a+b

%=

a = a%b

-=

a = a-b

<<=

a = a<<b

*=

a = a*b

<<=

a = a>>b

/=

a = a/b

++, --는 1항 연산으로 사용 가능 

3.6. 조건 연산자

 조건에 따라 서로 다른 수식을 수행한다. 삼항 연산자라고도 하며, 조건의 수식이 참이면 수식1을, 거짓이면 수식2를 수행한다

 조건 ? 수식1 : 수식2;

예)a=1, b=2, c=3일 때,

   c -= a < b ? a - b : b - a;

    "a < b의 결과는 참이기 때 수식 a - b의 결과인 -1을 사용,

   따라서 c = c - (-1) = 3 + 1 = 4"

3.7. 기타 연산자

◍ sizeof : 자료형의 크기를 표시한다.

◍ 콤마: 한 줄에 두 개 이상의 수식을 작성하거나 변수를 정의한다. 순서 연산자라고도 한다.

◍ (자료형) : 자료형을 다른 형으로 변환할 때 사용한다. 캐스트(cast) 연산자라고도 한다.

3.8. 연산자 우선순위

프로그래밍 변수 종류 - peulogeulaeming byeonsu jonglyu

4. 제어문 

4.1. 제어문의 개요

 컴퓨터 프로그램은 명령어가 서술된 순서에 따라 무조건 위에서 아래로 실행되는데, 조건을 지정해서 진행 순서를 변경할 수 있다. 제어(Control)하는 명령문으로 ‘제어문’ 혹은 ‘조건문’이라고 한다.

4.2. 제어문의 종류

1) 단순 if 문

조건에 따라 실행할 문장을 달리하는 제어문이다. 조건이 참일 때만 실행할 문장을 지정할 수도, 참과 거짓에 대해 각각 다른 실행문을 지정할 수도 있다. if문의 조건을 연달아서 지정할 경우, if(조건){실행문1} else if(조건){실행문2}로 지정한다. 

 조건에 따라 나머지 항목에서 시행할 명령을 지정하고 싶다면 else {실행문}으로 적는다.

2) 다중 if 문

조건이 여러 개 일 때 사용하는 제어문이다. if문 안에 if문을 작성할 수도 있다.

3) switch 문

 조건에 따라 분기할 곳이 여러 곳인 경우 간단하게 처리할 수 있는 제어문이다. 조건의 참/거짓 여부가 아닌 ‘값’으로 구분하며 값에 따라 명령이 수행된다. 

​ case 문의 레이블에는 한 개의 상수만 지정할 수 있고, int/char/enum 형의 상수만 가능하다. case문의 레이블에는 변수를 지정할 수 없다.

 switch 문에서 break; 는 생략이 가능하지만, break문이 생략되면 수식과 레이블이 일치하지 않을 때, 실행할 문장부터 break문을 만나거나 switch문이 종료될 때까지 모든 문장이 실행된다. 만약 값에 따라 탈출이 불가능하면 리소스를 지속적으로 소비하며 계산을 시도한다. 

4) goto 문

 프로그램 실행 중 현재 위치에서 원하는 다른 문장으로 건너뛰어 수행을 계속하기 위해 사용하는 제어문이다. 원하는 문장으로 쉽게 이동할 수 있지만, 많이 사용하면 프로그램 이해와 유지 보수가 어려워지는 단점이 있다.


5. 반복문

5.1. 반복문의 개요

 제어문의 한 종류로, 일정한 횟수를 반복하는 명령문을 말한다. 변수의 값을 일정하게 증가시키면서 정해진 수가 될 때까지 명령이나 명령 그룹을 반복 수행한다.

5.2. 반복문의 종류

1) for 문

 for문은 초기값, 최종값, 증가값을 지정하는 수식을 이용해 정해진 횟수를 반복하는 제어문이다.

 초기 값을 정한 다음 최종 값에 대한 조건이 참이면 실행할 문장을 수행하고, 초기 값을 증가 값만큼 증가시키면서 최종 값에 대한 조건이 참인 동안 실행 문장을 반복한다.

 초기값, 최종값, 중간값 중 하나 이상을 생략할 수 있고, 각각의 요소에 여러 개 수식을 지정할 수 있다. 각 조건에 참여하는 수식을 모두 생략하면 for문은 무한 반복된다.

 처음부터 최종값에 대한 조건식을 만족하지 못하면 한 번도 수행하지 않는다. 문자도 for문을 수행할 수 있다.

2) while 문

 조건이 참인 동안 실행할 문장을 반복 수행하는 제어문이다. 실행할 문장을 반복 수행하다가 조건이 거짓이면 while 문을 끝낸 후 다음 코드를 실행한다. 조건이 처음부터 거짓이면 한 번도 수행하지 않는다.

3) do ~ while 문

 while문과 동일한 동작을 하지만, 실행할 문장을 무조건 한 번은 실행한 다음 조건을 판단하여 탈출 여부를 결정한다. 실행할 문장을 우선 실행한 후 조건을 판별하여 조건이 참이면 실행 문장을 계속 반복하고, 거짓이면 do~while 문을 끝낸 후 다음 코드를 실행한다.

4) break, continue

 switch 문이나 반복문의 실행을 제어하기 위해 사용하는 예약어이다. 

◍ break: 반복문 블럭을 벗어나기 위해 사용

◍ continue: 반복문에서만 사용, 이후 문장을 실행하지 않고 제어를 반복문의 처음으로 옮긴다.


6. 배열과 문자열

6.1. 배열의 개요

 배열은 동일한 데이터 유형을 여러 개 사용해야 할 경우, 여러 변수들을 조합해서 하나의 이름으로 정의해서 사용하는 것을 말한다. 

​ 하나의 이름으로 여러 기억장소를 가리키기 때문에 배열에서 개별적인 요소들의 위치는 첨자를 이용해 지정한다. 변수명 뒤에 대괄호 []를 붙이고, 그 안에 사용할 개수를 지정한다.

 C언어에서 배열의 위치는 0부터 시작하고, 배열 위치를 나타내는 첨자 없이 배열 이름을 사용하면 첫 번째 요소의 주소를 지정하는 것과 같다.

 배열은 행 우선으로 데이터가 기억장소에 할당된다.

6.2. 배열의 종류

1) 1차원 배열

 변수들을 일직선상의 개념으로 조합한 배열이다. 

◍ 자료형: 배열에 저장할 자료의 형을 지정

◍ 변수명: 사용할 배열의 이름, 사용자가 임의로 지정

◍ 개수: 배열의 크기를 지정, 생략 가능

2) 2차원 배열

 변수들을 평면(행과 열)으로 조합한 배열이다. 

◍ 자료형: 배열에 저장할 자료의 형을 지정

◍ 변수명: 사용할 배열의 이름, 사용자가 임의로 지정

◍ 행 개수: 배열의 행 크기를 지정

◍ 열 개수: 배열의 열 크기를 지정

6.3. 배열의 초기화

 배열은 선언 시 초기값을 지정할 수 있다. 배열의 크기를 생략한 경우에는 반드시 초기 값을 지정해야 지정한 개수 만큼의 배열이 선언된다.

 초기 값을 '숫자, '의 형태로 지정하면 배열의 첫 번째 요소에는 숫자가 입력되고, 나머지 요소에는 0이 입력된다. 2차원 배열의 초기화 2가지 방법이 있는데, 첫 번째 방법은 {{1,2,3,4},{2,3,4,5}}이고, 두번째 방법은 {1,2,3,4,2,3,4,5}이다.

6.4. 배열 형태의 문자열 변수

 C언어에서는 " "로 묶인 글자는 글자 수에 관계없이 문자열로 처리하는데, C언어에 문자열을 저장하는 자료형이 없기 때문에 배열 또는 포인터 개념을 이용해 처리된다.

형식: char 이름[크기] = "문자열"

 배열에 문자열을 저장하면 문자열의 끝을 알리기 위한 '널 문자('\0')'가 문자열 끝에 자동으로 추가되기 때문에, 이를 고려해서 크기를 지정해야 한다.

 배열에 문자열을 저장할 때는 배열 초기 값을 반드시 지정해야 하고, 이미 선언한 배열에는 문자열을 저장할 수 없다.


7. 포인터 

7.1. 포인터와 포인터 변수

 포인터는 변수의 주소를 말하며, C언어에서는 주소를 제어할 수 있는 기능을 제공한다. C언어에서 변수의 주소를 저장할 때 사용하는 변수를 포인터 변수라고 한다.

◍  포인터 변수를 선언할 때는 자료형을 먼저 쓰고 변수명 앞에 간접 연산자 *를 붙인다. 

예) int *a

◍ 포인터 변수에 주소를 저장하기 위해 변수의 주소를 알아낼 때는 변수 앞에 번지 연산자 &를 붙인다. 예) a = &b

◍ 실행문에서 포인터 변수에 간접 연산자 *를 붙이면 해당 포인터 변수가 가리키는 곳의 값을 말한다. 예) c = *a;

 포인터 변수는 필요에 의해 동적으로 할당되는 메모리 영역인 힙 영역에 접근하는 동적 변수이다. 포인터는 객체를 참조하기 위해 주소를 값으로 하는 형식을 말한다. 커다란 배열에 원소를 효율적으로 저장하고자 할 때 이용한다. 하나의 자료에 동시에 많은 리스트의 연결이 가능하다.

▶  메모리 영역

◍ 코드 영역 : 실행할 프로그램의 코드가 저장됨

◍ 데이터 영역 : 전역 변수와 정적 변수가 저장 됨

◍ 힙 영역 : 필요에 의해 동적으로 할당되는 영역

◍ 스택 영역 : 함수의 매개 변수와 지역 변수가 저장 됨

▶  포인터 변수의 용도

◍ 연결된 자료 구조를 구성하기 위해 사용한다.

◍ 동적으로 할당된 자료 구조를 지정하기 위해 사용한다.

◍ 배열을 인수로 전달하기 위해 사용한다.

◍ 문자열을 표현하기 위해 사용한다.

◍ 큰 배열에서 효율적으로 요소를 저장하기 위해 사용한다.

◍ 메모리에 직접 접근하기 위해 사용한다.

7.2. 포인터와 배열

 배열을 포인터 변수에 저장한 후 포인터를 이용해 배열의 요소에 접근할 수 있다. 배열 위치를 나타내는 첨자를 생략하고, 배열 대표명만 지정하면 배열의 첫 번째 요소의 주소를 지정하는 것과 같다. 배열 요소에 대한 주소를 지정할 때는 일반 변수와 동일하게 & 연산자를 사용한다

예)

int a[5], *b;
b = ab = &a[0]

8. 절차적 프로그래밍 언어

8.1. 절차적 프로그래밍 언어의 개요

 절차적 프로그래밍 언어는 일련의 처리 절차를 정해진 문법에 따라 순서대로 기술해나가는 언어이다. 절차적 프로그래밍 언어는 데이터를 중심으로 프로시저를 구현하며, 프로그램 전체가 유기적으로 연결되어 있다. 자연어와 가까운 단어와 문장으로 구성된다. 과학 계산이나 하드웨어 제어에 주로 사용된다.

8.2. 절차적 프로그래밍의 장단점

 절차적 프로그래밍은 컴퓨터 처리 구조와 유사하여 실행 속도가 빠르다. 같은 코드를 복사하지 않고 다른 위치에서 호출하여 사용할 수 있다. 모듈 구성이 용이하며, 구조적인 프로그래밍이 가능하다.

 다만, 프로그램을 분석하기 어려워 유지 보수나 코드 수정이 어렵다는 단점이 있다.

8.3. 절차적 프로그래밍 언어의 종류

◍ C: 시스템 프로그래밍 언어, 고급 프로그래밍 언어이면서 저급 프로그램 언어의 특징을 모두 갖춤, 컴파일러 방식의 언어

◍ ALGOL: 수치 계산이나 논리 연산을 위한 과학 기술 계산용 언어

◍ COBOL: 사무 처리용 언어

◍ FORTRAN: 과학 기술 계산용 언어


9. 객체지향 프로그래밍 언어

9.1. 객체지향 프로그래밍 언어의 개요

 객체지향 프로그래밍 언어는 현실 세계의 개체(Entity)를 기계의 부품처럼 하나의 객체로 만들어, 기계적인 부품들을 조립하여 제품을 만들 듯이 소프트웨어를 개발할 때도 객체들을 조립해서 프로그램을 작성할 수 있도록 한 프로그래밍 기법이다.

 프로시저보다는 명령과 데이터로 구성된 객체를 중심으로 하는 프로그래밍 기법으로, 한 프로그램을 다른 프로그램에서 이용할 수 있도록 한다. 종류는 Java, C++, Smalltalk가 있다. 

9.2. 객체지향 프로그래밍 언어의 장단점

 객체지향 프로그래밍 언어는 상속을 통한 재사용과 시스템 확장이 용이하고, 코드의 재활용성이 높다. 사용자와 개발자 사이의 이해를 쉽게 해준다. 대형 프로그램 작성이 용이하고, 소프트웨어 개발 및 유지보수가 용이하다. 

 다만, 프로그래밍 구현을 지원해주는 정형화 된 분석 및 설계 방법이 없다. 구현 시 처리 시간이 지연된다.

9.3. 객체지향 프로그래밍 언어의 종류

◍ JAVA: 분산 네트워크 환경에 적용이 가능하며, 멀티스레드 기능을 제공하므로 여러 작업을 동시에 처리가능, 캡슐화, 재사용성 높음

◍ C++: C 언어에 객체지향 개념을 적용한 언어

◍ Smalltalk: 1세대 객체지향 프로그래밍 언어, 최초로 GUI를 제공

9.4. 객체지향 언어의 구성 요소

1) 객체(Object)

 객체는 데이터(속성)와 이를 처리하기 위한 연산(메소드)를 결합시킨 실체이다. 데이터 구조와 그 위에서 수행되는 연산들을 가지고 있는 소프트웨어 모듈을 말한다. 

 속성(Attribute)은 한 클래스 내에 속한 객체들이 가지고 있는 데이터 값들을 단위 별로 정의하는 것으로, 성질, 분류, 식별, 수량 또는 현재 상태 등을 표현한다.

 메소드(Method)는 객체가 메시지를 받아 실행해야 하는 구체적인 연산으로, 객체의 상태를 참조하거나 변경하는 수단이다. 

2) 클래스(Class)

 클래스는 둘 이상의 유사한 객체들을 묶어서 하나의 공통된 특성으로 표현하는 요소이다.  공통된 특성과 행위를 갖는 객체의 집합이며, 객체의 유형 또는 타입을 의미한다.

3) 메시지(Message)

 메시지는 객체들 간에 상호작용을 하는데 사용되는 수단을 말한다. 객체의 메소드(연산)를 일으키는 외부의 요구사항이다. 메시지를 받은 객체는 대응하는 연산을 수행하여 예상된 결과를 반환한다. 

9.5. 객체지향 언어의 특징

1) 캡슐화(Encapsulation)

 캡슐화는 데이터(속성)와 데이터를 처리하는 함수를 하나로 묶는 것을 말한다. 캡슐화 된 객체의 세부 내용이 외부에 은폐되어, 변경이 발생할 때 오류의 파급 효과를 줄인다. 캡슐화 된 객체들은 재사용이 용이하다.

2) 정보 은닉(Information Hiding)

 정보은닉은 다른 객체에서 자신의 정보를 숨기고 자신의 연산만을 통해 접근을 허용하는 것을 말한다. 캡슐화에서 가장 중요한 개념이다. 

3) 추상화(Abstraction)

 추상화는 불필요한 부분을 생략하는 것으로 객체의 속성 중 가장 중요한 것에만 중점을 두고 개략화 하는 것이다. 데이터의 성질을 추출해 슈퍼 클래스를 선정하는 개념이다. 한마디로, 모델화 하는 것을 말한다. 

4) 상속성(Inheritance)

 상속성은 이미 정의된 상위 클래스의 모든 속성과 연산을 하위 클래스가 물려받는 것이다.  하위 클래스는 다시 정의하지 않고서도 자신의 속성으로 사용할 수 있다.

5) 다형성(Polymorphism)

 메시지에 의해 객체(클래스)가 연산을 수행하게 될 때 하나의 메시지에 대해 각 객체가 가지고 있는 고유한 방법(특성)으로 응답할 수 있는 능력을 의미한다. 객체들은 동일한 메소드명을 사용하며 같은 의미의 응답을 한다.


10. 스크립트 언어

10.1. 스크립트 언어(Script Language)의 개요

 스크립트 언어는 HTML 문서 안에 직접 프로그래밍 언어를 삽입하여 사용하는 것으로, 기계어로 컴파일 되지 않고 별도의 번역기가 소스를 분석하여 동작하게 하는 언어이다.

 게시판 입력, 상품 검색, 회원 가입 등과 같은 데이터베이스 처리 작업을 수행하기 위해 주로 사용한다.

 크립트 언어는 클라이언트의 웹 브라우저에서 해석되어 실행되는 클라이언트용 스크립트 언어와 서버에서 해석되어 실행된 후 결과만 클라이언트로 보내는 서버용 스크립트 언어가 있다.

◍ 서버용 스크립트 언어 : ASP, JSP, PHP, 파이썬

◍ 클라이언트용 스크립트 언어 : JavaScript

10.2. 스크립트 언어의 장단점

 스크립트 언어는 컴파일 없이 바로 실행하므로 결과를 바로 확인할 수 있다. 학습 및 코딩하기 쉽고, 개발 시간이 짧다. 소스 코드를 쉽고 빠르게 수정할 수 있다. 

 다만, 코드를 읽고 해석해야 하기 때문에 실행 속도가 느리며, 런타임 오류가 많이 발생한다.

10.3. 스크립트 언어의 종류

◍ JavaScript: 웹페이지의 동작을 제어하는 데 사용되는 클라이언트용 스크립트 언어로, 클래스가 존재하지 않으며 변수 선언도 필요 없다.

◍ ASP: 서버 측에서 동적으로 수행되는 페이지를 만들기 위한 언어, Windows계열에서만 수행 가능한 프로그래밍 언어이다.

◍ JSP: JAVA로 만들어진 서버용 스크립트로, 다양한 운영체제에서 사용 가능

◍ PHP: 서버용 스크립트 언어로, Linux, Unix, Windows 운영체제에서 가능하다, C, Java 등과 문법이 유사하므로 배우기 쉬워 웹 페이지 제작에 많이 사용된다.

◍ Python: 객체지향 기능을 지원하는 대화형 인터프리터 언어로, 플랫폼에 독립적이고 문법이 간단하여 배우기 쉽다.


11. 선언형 언어

 명령형 언어는 문제 해결을 위한 방법을 기술한 언어로 폰노이만 구조에 개념적인 기초를 둔다. 알고리즘을 명시하고, 목표는 명시하지 않으며, 특정 구문의 연산을 이용하여 상태를 변경시키고, 프로그램을 동작시킨다. 명령형 언어는 개체의 동작과 상태를 중요시한다. 명령형 언어에는 절차적 언어와 객체지향 언어가 있다.

 선언형 언어는 이러한 명령형 언어(절차적언어(C), 객체지향언어(JAVA))와 반대되는 개념의 언어로, 명령형 언어가 문제를 해결하기 위한 방법을 기술한다면 선언형 언어는 프로그램이 수행해야 하는 문제를 기술하는 언어이다. 선언형 언어는 목표를 명시하고 알고리즘은 명시하지 않는다.

 선언형 언어에는 함수형 언어와 논리형 언어 등이 있다.

11.1 선언형 언어의 종류 

1) 함수형 언어

함수형 언어는 수학적 함수를 조합해 문제를 해결하는 언어이다. 알려진 값을 함수에 적용하여 적용형 언어라고도 한다. 재귀호출이 자주 이용되고, 벙렬 처리에 용이하다. 

 종류로는 LISP가 있다.

2) 논리형 언어

 논리형 언어는 기호 논리학에 기반을 둔 언어로, 논리 문장을 이용하여 프로그램을 표현하고 계산 수행한다. 선언적 언어라고도 하며 비절차적 언어의 특성을 가진다. 또한, 반복문이나 선택문을 사용하지 않는다. 

 종류로는 PROLOG가 있다. 

11.2. 선언형 언어의 장단점

 가독성과 재사용성이 좋다. 작동 순서를 구체적으로 작성하지 않기 때문에 오류가 적다. 프로그램 동작을 변경하지 않고도 관련 값을 대체할 수 있다.

11.3. 선언형 프로그래밍 언어 종류

◍ HTML: 인터넷 표준 문서인 하이퍼텍스트 문서를 만들기 위해 사용하는 언어

◍ LISP: 인공지능 분야에 사용되는 언어

◍ PROLOG: 논리학을 기초로 한 고급 언어

◍ XML: 기존 HTML의 단점을 보완하여 웹에서 구조화된 폭넓고 다양한 문서들을 상호 교환할 수 있도록 설계된 언어이다.

◍ Haskell: 함수형 프로그래밍 언어로 부작용이 없다.


12. 라이브러리

12.1. 라이브러리의 개념

 라이브러리는 프로그램을 효율적으로 개발할 수 있도록 자주 사용하는 함수나 데이터들을 미리 만들어 모아 놓은 집합체이다. 필요할 때 언제든지 호출 및 사용할 수 있어 효율적인 프로그램 개발이 가능하다. 

 라이브러리는 표준 라이브러리와 외부 라이브러리가 있다. 표준 라이브러리는 프로그래밍 언어에 기본적으로 포함되어 있는 라이브러리로, 여러 종류의 모듈*이나 패키지* 형태를 제공한다. 

 외부 라이브러리는 개발자들이 필요한 기능들을 만들어 인터넷 상에 공유해 놓은 것으로, 다운 받아 설치 후 사용한다.

* 모듈: 하나의 기능이 한 개의 파일로 구현된 형태

* 패키지: 하나의 패키지 폴더 안에 여러 개의 모듈을 모아 놓은 형태

12.2. C언어의 대표적인 표준 라이브러리

 C 언어에서는 라이브러리를 헤더 파일로 제공한 것으로 각 헤더 파일에는 응용 프로그램 개발에 필요한 함수들이 정리되어 있다. 

◍ include 문을 이용해 선언한 후 사용해야 한다.

◍ stdio.h : 데이터 입출력에 사용되는 기능들을 제공한다.printf, scanf, fprintf 등

◍ math.h : 수학 함수들을 제공한다. sqrt, pow, abs 등

◍ string.h : 문자열 처리에 사용되는 기능들을 제공한다. strlen, strcpy, strcmp 등

◍ stdlib.h : 자료형 변환, 난수 발생, 메모리 할당에 사용되는 기능들을 제공한다. atio, atof, srand, rand, malloc, free 등

◍ time.h : 시간 처리에 사용되는 기능들을 제공한다. time, clock 등

12.3. JAVA의 대표적인 표준 라이브러리

 JAVA는 라이브러리를 패키지에 포함하여 제공하는데, 각 패키지에 JAVA 응용 프로그램 개발에 필요한 메소드들이 클래스로 정리되어 있다.

 'import java.util'과 같이 import문을 이용해 선언한 후 사용해야 한다. import로 선언된 패키지 안에 있는 클래스의 메소드를 사용할 때는 클래스와 메소드를 마침표(.)로 구분하여 'Math.abs()'와 같이 사용한다.

◍ java.lang : 자바에 기본적으로 필요한 인터페이스, 자료형, 예외 처리 등에 관련된 기능을 제공하고 import없이 사용 가능하다, String, System, Process, Runtime, Error 등

◍ java.util : 날짜 처리, 난수 발생, 문자열 처리 등, Date, Calendar, Random, StringTokenizer

◍ java.io : 파일 입출력과 관련된 기능 및 프로토콜을 제공한다, InputStream, OutputStream, Reader, Writer 등

◍ java.net : 네트워크 관련된 기능을 제공한다. Socket, URL, InterAddress 등

◍ java.awt : 사용자 인터페이스(UI)와 관련된 기능을 제공한다. Frame, Panel, Dialog, Button, Checkbox 등


13. 데이터 입·출력 

13.1. C언어의 표준 입출력 함수의 개요

 표준 입출력 함수란 키보드로 입력받아 화면으로 출력할 때 사용하는 함수로, scanf(), getchar(), gets(), printf(), putchar(), puts() 등이 있다.

1) scanf() 함수

 C언어의 표준 입력 함수, 키보드로 입력받아 변수에 저장하는 함수이다. 기본 형식은 scanf(서식문자열, 변수의 주소);이다. 서식 문자열은 입력받을 데이터의 자료형을 지정하는 것이다. scanf() 함수는 입력받을 데이터의 자료형, 자릿수 등을 지정할 수 있다.

 한 번에 여러 개의 데이터 입력 받을 수 있다. 또한 서식 문자열과 변수의 자료형은 일치해야 한다. 또한 변수의 주소에 연산자 &을 붙여 표현한다.

scanf("%3d", &a);  
//입력 자릿수를 3자리로 지정

서식 문자열의 종류는 다음과 같다. 

%d

정수형 10진수 입출력

%u

부호없는 정수형 10진수 입출력

%o

정수형 8진수 입출력

%c 

문자 입출력

%x

정수형 16진수 입출력

%s

문자열 입출력

%ld

long형 10진수 입출력

%f

소수점을 포함하는 실수 입출력

%lo

long형 8진수 입출력

%e

지수형 실수 입출력

%lx

long형 16진수 입출력

%p

주소를 16진수로 입출력

2) printf() 함수

 printf() 함수는 C언어의 표준 출력 함수로 인수로 주어진 값을 화면에 출력하는 함수이다. 기본 형식은 printf(서식문자열, 변수); 이다. scanf()와 달리 주소 연산자 &는 붙이지 않는다. 

printf("%-8.2f, 202.1"); 
// 출력 : 202.10__ (__는 공백 2자리)

◍ %: 서식 문자임을 지정

◍ -: 왼쪽부터 출력

◍ 8: 출력 자릿수를 8자리로 지정

◍ 2: 소수점 이하를 2자리로 지정

◍ f: 실수로 출력

 제어 문자의 종류는 다음과 같다. 

\n 

new line,  커서를 다음 줄 앞으로 이동

\b

backspace, 커서를 왼쪽으로 한 칸 이동

\t

tab, 커서를 일정 간격 띄움

\r

carriage return, 커서를 현재 줄의 처음으로 이동

\0

null, 널 문자 출력

\'

single quote, 작은 따옴표 출력

\"

double quote, 큰 따옴표 출력

\a

alert, 시스템 벨 소리 출력

\\

backslash, 역 슬래시 출력

\f

form feed, 한 페이지 넘김

3) 그 외 표준 입출력 함수

▶ 입력

◍ getchar(): 키보드로 한 문자를 입력받아 변수에 저장하는 함수

◍ gets(): 키보드로 문자열을 입력받아 변수에 저장하는 함수, 엔터키를 누르기 전까지 모든 입력 값을 하나의 문자열로 인식하여 저장한다.

▶ 출력

◍ putchar(): 인수로 주어진 한 문자를 화면에 출력하는 함수

◍ puts(): 인수로 주어진 문자열을 화면에 출력 후 커서를 자동으로 다음 줄 앞으로 이동하는 함수

13.2. JAVA에서의 표준 입출력

1) 입력

 Scanner 클래스를 이용해 키보드로부터 값을 입력받은 객체 변수를 생성한 후 사용한다.  메인 함수에 따라 import를 이용하여 Scanner 함수를 호출할 필요가 있다. 기본 형태는 Scanner 변수명 = new Scanner(System.in); 이다. 

Scanner scan01 = new Scanner(System.in);
inNum = scan01.nextInt();

◍ Scanner: 입력 객체 변수 생성 클래스

◍ scan01: 객체 변수명 선언

◍ new: 객체 생성 예약어

◍ Scanner(): 클래스 이름, () 붙여서 작성

◍ System.in: 표준 입력장치, 키보드로부터 값을 입력받는 객체 변수 생성

◍ inNum: 입력받은 값을 저장할 변수

◍ scan01.nextInt(): 입력에 사용할 객체 변수, 입력받은 값을 정수형으로 반환

2) 출력

 Java에서는 화면에 글자를 출력하기 위해서 printf() 메소드를 이용한다. 기본 형식은  System.out.printf(서식문자열, 변수); 이다. C언어와 동일하게 \를 이용하여 출력 형태를 지정할 수 있다.

System.out.printf("%-8.2f", 202.1); 
// 출력 : 202.10__ (__는 빈칸 2자리를 의미)

14. 예외 처리(Exception Handling)

14.1. 예외 처리의 개요

 프로그램의 정상적인 실행을 방해하는 조건이나 상태를 예외(Exception)라고 하며, 이러한 예외가 발생했을 때 프로그래머가 해당 문제에 대비해 작성해 놓은 처리 루틴을 수행하도록 하는 것을 예외 처리(Exception Handling)이라고 한다.

 예외의 원인은 컴퓨터 HW적 문제, OS의 설정 문제, 라이브러리 손상, 사용자의 입력 실수나 연산 문제, 할당하지 못하는 기억장치 접근 등 다양하다. 

 C++, Java, 자바스크립트와 같은 언어에는 예외 처리 기능이 내장되어 있으며, 그 외의 언어에서는 필요한 경우 조건문을 이용해 예외 처리 루틴을 작성한다.

14.2. Java의 예외 처리

 JAVA는 예외를 객체로 취급하며, 예외와 관련된 클래스를 java.lang 패키지에서 제공한다. JAVA에서는 try~catch 문을 이용해 예외를 처리한다. 예외가 발생하면 예외가 발생한 이후의 코드는 실행되지 않는다.

▶ try~catch 문을 이용해 예외 처리

◍ try 블럭 코드를 수행하다가 예외가 발생하면 catch 블록으로 이동하여 예외 처리 코드 수행한다.

◍ catch 블럭에서 선언한 변수는 해당 블록에서만 유효하다.

◍ try~catch 안에 또 다른 try~catch 문 선언 및 사용이 가능하다.

◍ 실행 코드가 한 줄이라도 중괄호 반드시 작성해야 한다. 

14.3. JAVA의 주요 예외 객체

◍ ClassNotFoundException: 클래스를 찾지 못한 경우

◍ NoSucMethodException: 메소드를 찾지 못한경우

◍ FileNotFoundException: 파일을 찾지 못한 경우

◍ InterruptedIOException: 입출력 처리가 중단된 경우

◍ ArithmeticException: 0으로 나누는 등의 산술 연산에 대한 예외가 발생한 경우

◍ IllegalArgumentException: 잘못된 인자를 전달한 경우

◍ NumberFormatException: 숫자 형식이 아닌 문자열을 숫자로 변환한 경우

◍ ArrayIndexOutofBoundsExcption : 배열의 범위를 벗어난 접근을 시도한 경우

◍ NegativeArraySizeException: 0보다 작은 값으로 배열의 크기를 지정한 경우

◍ NullPointErexception: 존재하지 않는 객체를 참조한 경우


15. 프로토타입

15.1. 프로토타입의 개념

 프로그래밍 언어에서 프로토타입이란 함수 원형(Function Prototype)이라는 의미로, 컴파일러에게 사용될 함수에 대한 정보를 미리 알리는 것이다.

 함수가 호출되기 전에 함수가 미리 정의되면 프로토타입을 정의하지 않아도 된다. 프로토타입은 본문이 없다는 점을 제외하고 함수 정의와 형태가 동일하다. 프로토타입에 정의된 반환 형식은 함수 정의에 지정된 반환 형식과 반드시 일치해야 한다.

15.2. C언어에서 프로토타입 선언

C언어에서 프로토타입은 main() 함수 바깥쪽에 선언해야 한다.

int func(int i, int j){     
	func 함수 코드;
    
}main(){    
	메인 함수 코드;
    
}int func(int i, int j) // func() 함수의 프로토타입 선언
main(){     
	메인 함수 코드;
    
}int func(int i, int j){     
	func 함수 코드;}