10. 프로그래밍 언어 활용
(1) 데이터 입·출력
데이터 입·출력의 개요
- 데이터 입·출력 : 키보드로부터 데이터를 입력받아 화면이나 파일로 출력하는 것
- 이 페이지에서는 C와 Java의 기본적인 프로그램 구조를 이해하고, 다음과 같은 내용이 포함된 프로그램 코드를 읽고 해석하는 방법을 배운다.
- 헝가리안 표기법
- 자료형
- C언어의 입출력 함수 : scanf, printf
- Java의 입출력 함수 : Scanner, nextInt, print, printf, println
- 서식 지정자와 제어 문자
- 연산자의 우선순위
C 문제
예제 : 다음은 키보드로 6과 4를 입력 받아 두 수의 덧셈 결과를 출력하는 프로그램이다. 출력 결과를 확인하시오.
#include <stdio.h>
main()
{
int i, j, k;
scanf("%d %d", &i, &j);
k = i + j;
printf("%d\n", k);
}
- 결과
10 |
Java 문제
예제 : 다음은 입력받은 정수를 가지고 여러 연산을 수행한 후 출력하는 프로그램이다. 4가 입력되었다고 가정했을 때 출력 결과를 확인하시오.
import java.util.Scanner;
public class Test
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
System.out.printf("a * 3 = %d\n", a * 3);
System.out.println("a / 2 = " + (a / 2));
System.out.print("a - 1 = " + (a - 1));
scan.close();
}
}
- 결과
a * 3 = 12 a / 2 = 2 a - 1 = 3 |
※ nextInt() : 입력받은 값을 정수형으로 변환
헝가리안 표기법(Hungarian Notation)
- 변수명 작성 시, 변수의 자료형을 알 수 있도록 자료형을 의미하는 문자를 포함하여 작성하는 방법
- 예)
- int i_inputA : 정수형 변수
- double d_Result : 실수형 변수
주요 자료형
종류 | 자료형 | 크기(C) | 크기(Java) |
정수형 | int | 4 Byte | 4 Byte |
문자형 | char | 1 Byte | 2 Byte |
실수형 | float | 4 Byte | 4 Byte |
double | 8 Byte | 8 Byte |
주요 서식 문자열
서식 문자열 | 의미 |
%d | 정수형 10진수의 입출력에 사용 |
%o | 정수형 8진수의 입출력에 사용 |
%x | 정수형 16진수의 입출력에 사용 |
%c | 문자의 입출력에 사용 |
%s | 문자열의 입출력에 사용 |
%f | - 소수점을 포함한 실수의 입출력에 사용 - 출력 시, 소수점 이하는 기본적으로 6자리가 출력됨. |
주요 제어 문자
제어 문자 | 기능 |
\n | 커서를 다음 줄의 처음으로 이동 |
\t | 커서를 일정 간격 띄움 |
\0 | 널 문자 출력 |
연산자 우선순위
대분류 | 중분류 | 연산자 | 결합 규칙 | 우선순위 |
단항 연산자 | 단항 연산자 | !(논리 not), ~(비트 not), ++(증가), --(감소), sizeof(기타) | ← | 높음 ↑ ↓ 낮음 |
이항 연산자 | 산술 연산자 |
*, /, %(나머지) | → | |
+, - | ||||
시프트 연산자 | <<, >> | |||
관계 연산자 |
<, <=, >=, > | |||
==(같다), !=(같지 않다) | ||||
비트 연산자 | &(비트 and), ^(비트 xor), |(비트 or) | |||
논리 연산자 | &&(논리 and), ||(논리 or) | |||
삼항 연산자 | 조건 연산자 | ? : | → | |
대입 연산자 | 대입 연산자 | =, +=, -=, *=, /=, %=, <<=, >>= 등 | ← | |
순서 연산자 | 순서 연산자 | , | → |
(2) 제어문
제어문
- 서술된 순서에 따라 무조건 위에서 아래로 실행되는 프로그램의 순서를 변경할 때 사용하는 명령문
C 문제
예제 : 다음 C 언어로 구현된 프로그램의 실행 결과를 확인하시오.
#include <stdio.h>
main()
{
int score[] = { 86, 53, 95, 76, 61 };
char grade;
char str[] = "Rank";
for (int i = 0; i < 5; i++) {
switch (score[i] / 10) {
case 10:
case 9:
grade = 'A';
break;
case 8:
grade = 'B';
break;
case 7:
grade = 'C';
break;
default:
grade = 'F';
}
if (grade != 'F')
printf("%d is %c %s\n", i + 1, grade, str);
}
}
- 결과
1 is B Rank 3 is A Rank 4 is C Rank |
Java 문제
예제 : 다음 Java로 구현된 프로그램의 실행 결과를 확인하시오.
public class Test
{
public static void main(String[] args)
{
String str = "agile";
int x[] = { 1, 2, 3, 4, 5 };
char y[] = new char[5];
int i = 0;
while (i < str.length()) {
y[i] = str.charAt(i);
i++;
}
for (int p : x) {
i--;
System.out.print(y[i]);
System.out.print(p + " ");
}
}
}
- 결과
e1 l2 i3 g4 a5 |
※ length() : 배열 클래스의 속성으로, 배열 요소의 개수가 저장되어 있음.
※ charAt() : 문자열에서 지정된 위치의 문자를 반환
for 문
- 초기값, 최종값, 증가값을 지정하는 수식을 이용해 정해진 횟수를 반복하는 제어문
- 형식
for (초기값; 최종값; 증가값)
실행할 문장;
switch 문
- 조건에 따라 분기할 곳이 여러 곳인 경우 간단하게 처리할 수 있는 제어문
- 형식
switch (수식) {
case 레이블1:
실행할 문장1;
break;
case 레이블2:
실행할 문장2;
break;
...
default:
실행할 문장3;
}
if 문
- 조건에 따라 실행할 문장을 달리하는 문장
- 형식
if (조건) {
실행할 문장1;
else if {
실행할 문장2;
}
else {
실행할 문장3;
}
while 문
- 조건이 참인 동안 실행한 문장을 반복 수행하는 제어문
- 형식
while (조건)
실행할 문장;
break와 continue
- break : 반복문이나 switch 문 안에서 break가 나오면 블록을 벗어난다.
- continue : 반복문에서 continue가 나오면, continue 이후의 문장을 실행하지 않고 제어를 반복문의 처음으로 옮긴다.
(3) 포인터
포인터
- C 언어에서는 변수의 주소를 포인터라고 하고, 포인터를 저장할 수 있는 변수를 포인터 변수라고 한다.
- 변수의 주소인 포인터는 출력할 수도 있고, 포인터가 가리키는 곳에 값을 저장하거나 읽어 오는 등 다양한 조작이 가능하다.
- 이런 기능 때문에 C 언어는 주소를 제어할 수 있는 기능이 있다고 말한다.
C 문제
예제 : 다음 C 언어로 구현된 프로그램의 실행 결과를 확인하시오.
#include <stdio.h>
main()
{
int a = 50;
int *b = &a;
*b = *b + 20;
printf("%d, %d\n", a, *b);
char *s;
s = "selina";
for (int i = 0; i < 6; i += 2) {
printf("%c, ", s[i]);
printf("%c, ", *(s + i));
printf("%s\n", s + i);
}
}
- 결과
70 70 s, s, selina l, l, lina n, n, na |
포인터 표기 방법
char *s;
s = "selina";
- s에 저장된 값은 문자열의 시작 주소이다.
- s의 값을 1 증가시킨다는 것은 현재 s가 가리키고 있는 문자의 주소에서 다음 문자의 주소로 가리키는 주소를 증가시킨다는 것이다.
- 문자 자료형의 자료형 크기는 1 Byte 이므로, 다음 물리적 메모리의 주소는 1 Byte 증가한 곳을 가리키는 것이다.
(4) 구조체
구조체
- 배열이 자료의 형과 크기가 동일한 변수의 모임이라면, 구조체는 자료의 종류가 다른 변수의 모임이라고 할 수 있다.
- 예) 이름, 직위, 급여 등의 필드가 필요한 사원 자료를 하나의 단위로 관리하려면 문자와 숫자가 혼용되므로 배열로는 처리할 수 없는데, 이런 경우 구조체를 사용하면 간단하게 처리할 수 있다.
구조체의 정의
- 구조체를 정의한다는 것은 int 나 char 같은 자료형을 하나 만드는 것을 의미한다.
struct sawon {
char name[10];
char jjkwi[10];
int pay;
};
- struct : 구조체를 정의하는 예약어
- sawon : 구조체의 이름으로, 사용자가 임의로 정한다.
- 멤버 : 일반 변수를 선언하는 것과 동일하게 필요한 필드들을 임의로 선언하면 된다.
구조체 변수의 선언
- 정수형 변수를 사용하려면 'int a'와 같이 선언한 후 사용하는 것처럼, 구조체 변수를 사용하려면 먼저 정의된 구조체에 대한 변수를 선언해야 한다.
struct sawon ansan, *seoul;
- sawon ansan : 정의한 구조체 sawon 자료형으로 변수를 선언하는데 변수의 이름은 ansan 이라는 의미이며, 사용자가 임의로 정하면 된다.
- *seoul : 구조체의 포인터 변수이며, 'struct sawon *seoul' 과 같이 별도로 지정할 수도 있다.
구조체 멤버의 지정
- 구조체의 멤버는 모든 요소들이 개별적인 이름을 가지고 있으므로 구조체 멤버를 지정할 때는 구조체 변수와 함께 멤버 이름을 지정해야 한다.
ansan.name = "김한국";
ansan.jikwi = "대리";
ansan.pay = 4000000;
- '->'에 의한 지정 : 구조체 포인터 변수를 이용해 구조체 멤버를 지정할 때
seoul->name = "홍길동";
seoul->jikwi = "과장";
seoul->pay = 5000000;
- 구조체의 포인터 변수는 일반 포인터 변수처럼 *를 사용하여 멤버를 지정할 수도 있다.
(*seoul).name = "홍길동";
(*ansan).jikwi = "과장";
(*ansan).pay = 5000000;
C 문제
예제 : 다음 C 언어로 구현된 프로그램의 실행 결과를 확인하시오.
#include <stdio.h>
struct jsu {
char nae[12];
int os, db, hab, hhab;
};
int main() {
struct jsu st[3] = { {"데이터1", 95, 88}, {"데이터2", 84, 91}, {"데이터3", 86, 75} };
struct jsu* p;
p = &st[0];
(p + 1)->hab = (p + 1)->os + (p + 2)->db;
(p + 1)->hhab = (p + 1)->hab + p->os + p->db;
printf("%d", (p + 1)->hab + (p + 1)->hhab);
}
- 결과
501 |
해설
- 구조체 jsu의 구조
※ 위의 구조체는 다음과 같이 메모리의 연속된 공간에 저장된 후 사용된다.
① 구조체 jsu의 자료형으로 3개짜리 배열 st를 선언하고 초기화한다.
② 구조체 jus의 포인터 변수 p를 선언한다.
③ p에 st 배열의 첫 번째 요소의 주소를 저장한다.
④ p+1이 가리키는 곳의 멤버 hab에 p+1이 가리키는 곳의 멤버 os 값과 p+2가 가리키는 곳의 멤버 db값을 더한 후 저장한다. p가 st[0]을 가리키므로 p+1은 st[1]을, p+2는 st[2]를 가리킨다. 따라서 st[1]의 os 값 84와 st[2]의 db 값 75를 더한 값 159를 st[1]의 hab에 저장한다.
⑤ p+1이 가리키는 곳의 멤버 hhab에 p+1이 가리키는 곳의 멤버 hab 값과 p가 가리키는 곳의 멤버 os와 db 값을 모두 더한 후 저장한다. st[1]의 hab 값 159, st[0]의 os와 db 값 95와 88을 모두 더한 값 342를 st[1]의 hhab에 저장한다.
⑥ p+1이 가리키는 곳의 멤버 hab와 hhab의 값을 더한 후, 정수로 출력한다. 159와 342를 더한 501이 출력된다.
(5) 사용자 정의 함수
사용자 정의 함수
- 사용자가 직접 만들어 사용하는 함수
C 문제
예제 : 다음은 재귀 함수를 이용해 팩토리얼(Factorial) 연산을 수행하는 C 프로그램이다. 그 실행 결과를 확인하시오.
#include <stdio.h>
int factorial(int n);
main() {
int (*pf)(int);
pf = factorial;
printf("%d", pf(3));
}
int factorial(int n) {
if (n <= 1) {
return 1;
}
else {
return n * factorial(n - 1);
}
}
- 결과
6 |
※ int (*pf)(int);
- int : 함수의 반환값이 정수임을 알려준다.
- (*pf) : 함수가 저장된 곳의 위치를 저장하는 함수 포인터의 이름
- (int) : 함수가 전달받을 인수의 자료형
함수 포인터
- C 언어에서 함수 이름은 해당 함수가 시작되는 주소를 의미한다.
- 변수의 주소를 포인터 변수에 저장하는 것처럼, 함수의 주소도 함수 포인터에 저장할 수 있을 뿐만 아니라 함수 포인터를 이용하여 함수를 호출할 수도 있다.
- 함수 포인터를 선언하는 방법은 함수를 선언하는 것과 동일한데, 포인터 변수임을 의미하는 *를 붙여주고, 우선순위를 구분하기 위해 함수 포인터 이름과 함께 괄호로 묶어주는 것만 다르다.
(6) Java의 클래스
Java 클래스
- 클래스는 객체 생성을 위한 필드(속성)와 메서드(함수)를 정의하는 설계도로, Java는 아무리 작은 프로그램이라도 클래스를 만들어서 사용해야 한다.
Java 문제 1
예제 : 다음은 Java에서 클래스를 만들고 객체를 생성해서 사용하는 간단한 프로그램이다. 어떤 일을 수행하는지 확인하시오.
class ClassA {
int a = 10;
int funcAdd(int x, int y) {
return x + y + a;
}
}
public class Test {
public static void main(String[] args) {
int x = 3, y = 6, r;
ClassA cal = new ClassA();
r = cal.funcAdd(x, y);
System.out.print(r);
}
}
- 결과
19 |
생성자(Constructor)
- 객체 변수 생성에 사용되는 메서드
- 객체 변수를 생성하면서 초기화를 수행한다.
- 클래스 안에 생성자를 정의하는 문장이 있다면 문장에 적힌 대로 객체 변수를 초기화하면서 생성하지만, 없으면 그냥 객체 변수만 생성하고 제어가 다음 줄로 넘어간다.
Java 문제 2
예제 : 다음 Java 프로그램의 실행 결과를 확인하시오.
class ClassA {
ClassA() {
System.out.print('A');
this.prn();
}
void prn() {
System.out.print('B');
}
}
class ClassB extends ClassA {
ClassB() {
super();
System.out.print('D');
}
void prn() {
System.out.print('E');
}
void prn(int x) {
System.out.print(x);
}
}
public class Test {
public static void main(String[] args) {
int x = 7;
ClassB cal = new ClassB();
cal.prn(x);
}
}
- 결과
AED7 |
※ ClassA() {, ClassB() { : ClassA(), ClassB() 메서드는 클래스와 이름이 동일한데, 이와 같이 클래스와 이름이 동일한 메서드는 해당 클래스의 객체 변수 생성 시 자동으로 실행되며 이러한 메서드를 생성자(Constructor)라고 한다.
※ void prn() {
- ClassB 클래스는 ClassA 클래스의 메소드를 사용할 수 있다고 했으므로, ClassB 클래스에는 이름이 같은 메서드 prn()이 2개 존재하게 된다.
- 이와 같이 상속으로 인해 동일한 이름의 메서드가 여러 개인 경우, 부모 클래스에서 정의된 prn() 메서드는 자식 클래스의 prn() 메서드에 의해 재정의되어 자식 클래스의 prn 메서드만 사용되는데, 이를 메서드 오버라이딩(Method Overriding) 또는 메서드 재정의라고 한다.
※ void prn(int x) {
- 메서드의 이름이 prn()과 같지만, '인수를 받는 자료형과 개수'가 다르므로 서로 다른 메서드이다.
- 이렇게 이름은 같지만, 인수를 받는 자료형과 개수를 달리하여 여러 기능을 정의하는 것을 오버로딩(Overloading) 이라고 한다.
※ extends [클래스명] : 클래스 정의 시, 상속받을 클래스를 추가하는 예약어
※ super() : 부모 클래스의 생성자를 호출한다.
객체 변수의 선언
- 객체 변수를 선언한다는 것은 클래스를 사용하기 위해 객체 변수를 생성하고, 생성된 객체가 있는 곳의 주소를 객체 변수에 저장하는 것이다.
- 기본 형식
클래스명 객체변수명 = new 생성자()
super, this
- super : 상속한 부모 클래스를 가리키는 예약어
- this : 현재 실행 중인 메소드가 속한 클래스를 가리키는 예약어
(7) Java의 활용
추상 클래스와 형 변환
- 추상 메서드(Abstract Method)
- 자식 클래스에서 재정의해야만 사용할 수 있는 메서드
- 이러한 메서드를 하나 이상 포함하는 클래스를 추상 클래스(Abstract Class) 라고 한다.
- 이렇게 재정의한 메서드를 부모 클래스의 객체 변수를 통해 사용하려면 부모 클래스의 객체 변수를 선언할 때 자식 클래스의 생성자를 이용해야 하는데, 이것을 클래스의 형 변환(Casting)이라고 한다.
Java 문제
예제 : 다음 Java 프로그램의 실행 결과를 확인하시오.
abstract class Animal {
String a = " is animal";
abstract void look();
void show() {
System.out.println("Zoo");
}
}
class Chicken extends Animal {
Chicken() {
look();
}
void look() {
System.out.println("Chicken" + a);
}
void display() {
System.out.println("two wings");
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Chicken();
a.show();
}
}
- 결과
Chicken is animal Zoo |
※ abstract class Animal {
- abstract [클래스 정의부] : abstract는 추상 클래스를 정의하는 명령어로, 추상 클래스 정의 시 꼭 써야 하는 예약어이다.
- 추상 클래스는 내부에 실행 코드가 없는 추상 메서드를 포함하기 때문에, 객체 변수의 생성자로 사용할 수 없다.
Animal a = new Animal(); // 오류 발생
※ abstract void look();
- abstract [메서드 정의부] : abstract는 추상 메서드를 정의하는 명령어로, 추상 메서드 정의 시 꼭 써야 하는 예약어이다.
- 추상 메서드는 선언만 있고 내부에 실행 코드가 없는 메서드로, 이후 상속 관계가 설정된 자식 클래스에서 재정의한 후 사용한다.
추상 클래스(Abstract Class)
- 추상 메서드(Abstract Method)를 하나 이상 포함하는 클래스
- 추상 클래스는 내부에 실행 코드가 없는 추상 메서드를 포함하기 때문에, 객체 변수의 생성자로 사용할 수 없다.
- 추상 메서드는 선언만 있고 내부에 실행 코드가 없는 메서드로, 이후 상속 관계가 설정된 자식 클래스에서 재정의 후 사용한다.
추상 메서드의 재정의
- 추상 메서드는 부모 클래스가 자식 클래스에게 주는 의무와 같다.
- 부모 클래스와 상속 관계에 있다면 반드시 부모 클래스의 추상 메서드를 재정의해야 한다.
- 그렇지 않으면 프로그램에 오류가 발생한다.
형 변환(Casting)
- 부모 클래스의 구조를 가지면서 자식 클래스의 속성이나 메서드로 재정의하고 싶을 때 사용하는 기법
- 만약 부모 클래스의 구조를 가져야 할 이유가 없다면, 부모 클래스를 상속받아 재정의하고 있는 자식 클래스의 구조로 객체 변수를 만들어 사용하면 된다.
- 예) Chicken a = new Chicken();
(8) Python의 활용
Python
- 객체 지향 기능을 지원하는 스크립트 언어
- 다른 언어에 비해 문법이 간단하다는 장점이 있다.
- C, Java 와 비교했을 때, 기본 작성법의 차이점
- 변수의 자료형에 대한 선언이 없다.
- 문자와 문자열을 작은 따옴표(' '), 큰 따옴표(" ")로 구분 없이 사용할 수 있으며, 3개의 작은 따옴표(''' '''), 3개의 큰 따옴표(""" """)로도 묶어 표현할 수 있다.
- 문장의 끝을 의미하는 세미콜론(;)을 사용할 필요가 없다.
- if나 for와 같이 코드 블록을 포함하는 명령문을 작성할 때, 중괄호({}) 대신 콜론(:)과 여백으로 구분한다.
Python 문제 1
예제 : 다음 Python으로 구현된 프로그램에 "xyz321" 을 입력했을 때 그 실행 결과를 확인하시오.
x = input('입력 :')
a = [ 'abc123', 'def456', 'ghi789' ]
a.append(x)
a.remove('def456')
print(a[1][-3:], a[2][:-3], sep = ',')
for i in range(3, 6):
print(i, end = ' ')
- 결과
789,xyz 3 4 5 |
input() 함수
- Python의 표준 입력 함수
- 키보드로부터 입력 받아 변수에 저장하는 함수
- 입력되는 값은 문자열로 취급되어 저장된다.
- 기본 형식
변수 = input(출력문자)
print() 함수
- 형식
print(출력값1, 출력값2, ..., sep = 분리문자, end = 종료문자)
- sep
- 여러 값을 출력할 때, 값과 값 사이를 구분하기 위해 출력하는 문자
- 기본값 : 공백 한 칸(' ')
- end
- 맨 마지막에 표시할 문자
- 생략할 경우, 기본값은 줄나눔('\n')이다.
Python 문제 2
예제 : 다음 Python 프로그램의 실행 결과를 확인하시오.
a = {'apple', 'lemon', 'banana'}
a.update( {'kiwi', 'banana'} )
a.remove('lemon')
a.add('apple')
for i in a:
print(i)
- 결과
apple banana kiwi |
※ Range를 사용하지 않은 Python의 for문은 Java의 향상된 for문과 사용법이 동일하다.
- a 세트의 위치에는 세트 자료형 외에도 리스트와 같은 순차형 객체가 올수 있다.
※ 세트 자료형은 순서가 정해져 있지 않으므로, 세트 a에 저장된 'apple', 'lemon', 'banana'의 출력 순서는 실행할 때마다 달라질 수 있다.
세트(Set)
- 세트는 수학에서 배우는 집합(Set)과 같은 Python의 자료형으로, 중괄호({ })를 이용하여 리스트와 같이 다양한 요소들을 저장할 수 있다.
- 순서가 정해져 있지 않으며(unordered), 중복된 요소는 저장되지 않는다는 특징이 있다.
Range
- 연속된 숫자를 생성하는 것
- 리스트나 반복문에서 많이 사용된다.
- 형식
range(최종값) # 0에서 '최종값'-1 까지 연속된 숫자를 생성한다.
range(초기값, 최종값) # '초기값'에서 '최종값'-1 까지 연속된 숫자를 생성한다.
range(초기값, 최종값, 증가값) # '초기값'에서 '최종값'-1 까지 '증가값'만큼 증가하면서 숫자를 생성한다.
# '증가값'이 음수인 경우, '초기값'에서 '최종값'+1 까지 '증가값'만큼 감소하면서 숫자를 생성한다.
슬라이스(Slice)
- 문자열이나 리스트와 같은 순차형 객체에서 일부를 잘라(slicing) 반환하는 기능
- 형식
객체명[초기위치:최종위치] # '초기위치'에서 '최종위치'-1까지의 요소들을 가져온다.
객체명[초기위치:최종위치:증가값] # '초기위치'에서 '최종위치'-1까지 '증가값'만큼 증가하면서 해당 위치의 요소들을 가져온다.
# '증가값'이 음수인 경우, '초기위치'에서 '최종위치'+1까지 '증가값'만큼 감소하면서 해당 위치의 요소들을 가져온다.
- 슬라이스는 일부 인수를 생략하여 사용할 수 있다.
객체명[:] 또는 객체명[::] # 객체의 모든 요소를 반환한다.
객체명[초기위치:] # 객체의 '초기위치'에서 마지막 위치까지의 요소들을 반환한다.
객체명[:최종위치] # 객체의 0번째 위치에서 '최종위치'-1 까지의 요소들을 반환한다.
객체명[::증가값] # 객체의 0번째 위치에서 마지막 위치까지 '증가값' 만큼 증가하면서 해당 위치의 요소들을 반환한다.
리스트 관련 주요 메서드
형식 | 내용 |
pop(위치) | - 리스트의 '위치'에 있는 값을 출력하고, 해당 요소를 삭제한다. - 예) [10, 11, 12].pop(1) → 11 출력 → [10, 12] |
index(값) | - 리스트에서 '값'이 저장된 요소의 위치를 반환한다. - 예) [10, 11, 12].index(12) → 2 |
count(값) | - 리스트에서 '값'이 저장된 요소들의 개수를 반환한다. - 예) [1, 0, 1, 0, 0].count(0) → 3 |
extend(리스트) | - 리스트의 끝에 새로운 '리스트'를 추가하여 확장한다. - 예) ['a', 'b'].extend(['c', 'd']) → ['a', 'b', 'c', 'd'] |
reverse() | - 리스트의 순서를 역순으로 뒤집는다. - 예) [1, 2, 3].reverse() → [3, 2, 1] |
sort() | - 리스트를 정렬하며, 기본값은 오름차순이다. - reverse 속성을 이용하여 정렬 방식을 지정할 수 있다. (True : 내림차순, False : 오름차순) - 예1) [2, 1, 3].sort() → [1, 2, 3] - 예2) [2, 1, 3].sort(reverse = True) → [3, 2, 1] |
copy() | - 리스트를 복사한다. -예) a = [1, 2, 3] b = a.copy() |
리스트의 복사
- copy() 메서드를 사용하지 않고, '새로운 리스트 = 기존의 리스트' 형식으로 리스트를 복사하면, 2개의 리스트가 같은 메모리를 공유하기 때문에 어느 한 쪽의 리스트에서 작업을 수행하면 다른 리스트에도 작업 내용이 그대로 반영된다.
- 리스트를 복사한 후, 서로 별개의 자료 공간으로 사용하려면 반드시 copy() 메서드를 이용해야 한다.
세트 관련 주요 메서드
형식 | 내용 |
pop() | - 세트의 값을 출력하고, 요소를 삭제한다. - 예) {10, 11, 12}.pop() → 10 출력 → {11, 12} |
add(값) | - 세트에 '값'을 추가한다. - 예) {10, 11, 12}.add(13) → {10, 11, 12, 13} |
update(세트) | - 세트에 새로운 '세트'를 추가하여 확장한다. - 예) {'a', 'b', 'c'}.extend({'c', 'd'}) → {'a', 'b', 'c', 'd'} |
remove(값) | - 세트에서 '값'을 찾아 해당 요소를 삭제한다. - 예) {10, 11, 12}.remove(10) → {11, 12} |
세트의 pop() 메서드
- 세트의 pop() 메서드는 리스트와 달리 인수를 입력하지 못하며, pop() 사용시 어떤 요소가 출력되고 삭제될 지는 알 수 없다.
(9) 절차적 프로그래밍 언어
절차적 프로그래밍 언어
- 일련의 처리 절차를 정해진 문법에 따라 순서대로 기술하는 언어
- 프로그램이 실행되는 절차를 중요시한다.
- 데이터를 중심으로 프로시저를 구현하며, 프로그램 전체가 유기적으로 연결되어 있다.
- 자연어에 가까운 단어와 문장으로 구성된다.
- 과학 계산이나 하드웨어 제어에 주로 사용된다.
절차적 프로그래밍 언어의 종류
언어 | 특징 |
C | - 1972년 미국 벨 연구소의 데니스 리치에 의해 개발됨. - 시스템 프로그래밍 언어로 널리 사용됨. - 고급 프로그래밍 언어이면서 저급 프로그램 언어의 특징을 모두 갖춤. - 이식성이 좋아 컴퓨터 기종에 관계없이 프로그램을 작성할 수 있음. |
ALGOL | - 수치 계산이나 논리 연산을 위한 과학 기술 계산용 언어 - PASCAL과 C 언어의 모체가 됨. |
COBOL | - 사무 처리용 언어 - 영어 문장 형식으로 구성되어 있어 이해와 사용이 쉬움. - 4개의 DIVISION으로 구성됨. |
FORTRAN | - 과학 기술 계산용 언어 - 수학과 공학 분야의 공식이나 수식과 같은 형태로 프로그래밍 할 수 있음. |
*저급 언어 : 기계가 이해하기 쉬운 언어
*고급 언어 : 인간이 이해하기 쉬운 언어
(10) 객체 지향 프로그래밍 언어
객체 지향 프로그래밍 언어
- 현실 세계의 개체를 기계의 부품처럼 하나의 객체로 만들어, 기계의 부품들을 조립하여 제품을 만들 듯이 소프트웨어를 개발할 때도 객체들을 조립해서 프로그램을 작성하는 기법
- 프로시저보다는 명령과 데이터로 구성된 객체를 중심으로 하는 프로그래밍 기법
- 한 프로그램을 다른 프로그램에서 이용할 수 있도록 한다.
객체지향 프로그래밍 언어의 종류
언어 | 특징 |
JAVA | - 분산 네트워크 환경에 적용이 가능함. - 멀티 스레드 기능을 제공하므로, 여러 작업을 동시에 처리할 수 있음. - 운영체제 및 하드웨어에 독립적이며, 이식성이 강함. |
C++ | - C 언어에 객체 지향 개념을 적용한 언어 - 모든 문제를 객체로 모델링하여 표현함. |
Smalltalk | - 1세대 객체 지향 프로그래밍 언어로, 순수한 객체 지향 프로그래밍 언어 - 최초로 GUI를 제공하였음. |
(11) 스크립트 언어
스크립트 언어(Script Language)
- HTML 문서 안에 직접 프로그래밍 언어를 삽입하여 사용하는 언어
- 기계어로 컴파일되지 않고 별도의 번역기가 소스를 분석하여 동작한다.
- 게시판 입력, 상품 검색, 회원 가입 등과 같은 데이터베이스 처리 작업을 수행하기 위해 주로 사용한다.
- 스크립트 언어의 분류
분류 | 내용 |
서버용 스크립트 언어 | - 서버에서 해석되어 실행된 후, 결과만 클라이언트로 보냄. - 종류 : ASP, JSP, PHP, Python |
클라이언트용 스크립트 언어 | - 클라이언트의 웹 브라우저에서 해석되어 실행됨. - 종류 : 자바 스크립트(JavaScript), VB 스크립트(Visual Basic Script) |
스크립트 언어의 종류
언어 | 특징 |
자바 스크립트 (JavaScript) |
- 웹 페이지의 동작을 제어하는 데 사용되는 클라이언트용 스크립트 언어 - 클래스가 존재하지 않으며, 변수 선언도 필요 없음. - 서버에서 데이터를 전송할 때 아이디, 비밀번호, 수량 등의 입력 사항을 확인하기 위한 용도로 많이 사용됨. |
VB 스크립트 (Visual Basic Script) |
- 마이크로소프트 사에서 자바 스크립트에 대응하기 위해 제작한 언어 - Active X를 사용하여 마이크로소프트 사의 애플리케이션을 컨트롤 할 수 있음. |
ASP (Active Server Page) |
- 서버 측에서 동적으로 수행되는 페이지를 만들기 위한 언어 - 마이크로소프트 사에서 제작하였음. - Windows 계열에서만 수행 가능함. |
JSP (Java Server Page) |
- Java로 만들어진 서버용 스크립트 언어 - 다양한 운영체제에서 사용 가능함. |
PHP (Professional Hypertext Preprocessor) |
- Linux, Unix, Windows 운영체제에서 사용 가능한 서버용 스크립트 언어 - C, Java 등과 문법이 유사하므로 배우기 쉬워 웹 페이지 제작에 많이 사용됨. |
Python | - 객체 지향 기능을 지원하는 대화형 인터프리터 언어 - 플랫폼에 독립적이고, 문법이 간단하여 배우기 쉬움. |
쉘 스크립트 (Shell Script) |
- 유닉스/리눅스 계열의 쉘(Shell)에서 사용되는 명령어들의 조합으로 구성된 스크립트 언어 - 쉘 스크립트에서 사용되는 제어문 → 선택형 : if, case → 반복형 : for, while, until |
Basic | - 절차 지향 기능을 지원하는 대화형 인터프리터 언어 - 초보자도 쉽게 사용할 수 있는 문법 구조를 가짐. |
*Active X : 마이크로소프트 사에서 Windows 환경의 응용 프로그램을 웹과 연결하기 위해 개발한 프로그램 기술로서, Active X를 이용하면 동적인(Dynamic) 콘텐츠와 응용 프로그램 제작이 편리하다.
(12) 선언형 언어
선언형 언어
- 프로그램이 수행해야 할 문제를 기술하는 언어
- 목표를 명시하고 알고리즘은 명시하지 않는다.
- 선언형 언어의 분류
분류 | 내용 |
함수형 언어 | - 수학적 함수를 조합하여 문제를 해결하는 언어 - 알려진 값을 함수에 적용하는 것을 기반으로 함. - 재귀 호출이 자주 이용됨. - 종류 : LISP |
논리형 언어 | - 기호 논리학에 기반을 둔 언어 - 논리 문장을 이용하여 프로그램을 표현하고 계산을 수행함. - 반복문이나 선택문을 사용하지 않음. - 종류 : PROLOG |
명령형 언어
- 문제를 해결하기 위한 방법을 기술하는 언어
- 순차적인 명령 수행을 기본으로 한다.
- 폰노이만 구조에 개념적인 기초를 두고 있다.
- 명령형 언어에는 절차적 언어와 객체 지향 언어가 있다.
- 종류 : FORTRAN, COBOL, C, Java 등
선언형 언어의 종류
언어 | 특징 |
HTML | - 인터넷의 표준 문서인 하이퍼텍스트 문서를 만들기 위해 사용하는 언어 - 특별한 데이터 타입이 없는 단순한 텍스트이므로 호환성이 좋고 사용이 편함. |
LISP | - 인공 지능 분야에 사용되는 언어 - 기본 자료 구조가 연결 리스트 구조임. - 재귀(Recursion) 호출을 많이 사용함. |
PROLOG | - 논리학을 기초로 한 고급 언어 - 인공 지능 분야에서의 논리적인 추론이나 리스트 처리 등에 주로 사용됨. |
XML | - 기존 HTML의 단점을 보완하여 웹에서 구조화된 폭넓고 다양한 문서들을 상호 교환할 수 있도록 설계된 언어 - HTML에 사용자가 새로운 태그(Tag)를 정의할 수 있음. - 문서의 내용과 이를 표현하는 방식이 독립적임. |
Haskell | - 함수형 프로그래밍 언어로, 부작용(Side Effect)이 없음. - 코드가 간결하고 에러 발생 가능성이 낮음. |
(13) 라이브러리
라이브러리
- 프로그램을 효율적으로 개발할 수 있도록 자주 사용하는 함수나 데이터들을 미리 만들어 놓은 집합체
- 자주 사용하는 함수들의 반복적인 코드 작성을 피하기 위해 미리 만들어 놓은 것이며, 필요할 때는 언제든지 호출하여 사용할 수 있다.
- 라이브러리의 분류
분류 | 내용 |
표준 라이브러리 | - 프로그래밍 언어에 기본적으로 포함되어 있는 라이브러리 - 여러 종류의 모듈이나 패키지 형태임. |
외부 라이브러리 | - 개발자들이 필요한 기능들을 만들어 인터넷 등에 공유해 놓은 라이브러리 - 외부 라이브러리를 다운 받아 설치한 후 사용함. |
*모듈 : 하나의 기능이 한 개의 파일로 구현된 형태
*패키지 : 하나의 패키지 폴더 안에 여러 개의 모듈을 모아 놓은 형태
C 언어의 대표적인 표준 라이브러리
- C 언어는 라이브러리를 헤더 파일로 제공한다.
- C 언어에서 헤더 파일을 사용하려면 '#include <stdio.h>' 와 같이 include 문을 이용해 선언한 후 사용해야 한다.
헤더 파일 | 기능 |
stdio.h | - 데이터의 입출력에 사용되는 기능들을 제공함. - 주요 함수 : printf, scanf, fprintf, fscanf, fclose, fopen 등 |
math.h | - 수학 함수들을 제공함. - 주요 함수 : sqrt, pow, abs 등 |
string.h | - 문자열 처리에 사용되는 기능들을 제공함. - 주요 함수 : strlen, strcpy, strcmp 등 |
stdlib.h | - 자료형 변환, 난수 발생, 메모리 할당에 사용되는 기능들을 제공함. - 주요 함수 : atoi, atof, srand, rand, malloc, free 등 |
time.h | - 시간 처리에 사용되는 기능들을 제공함. - 주요 함수 : time, clock 등 |
Java의 대표적인 표준 라이브러리
- Java는 라이브러리를 패키지에 포함하여 제공한다.
- Java에서 패키지를 사용하려면 'import java.util'과 같이 import 문을 이용해 선언한 후 사용해야 한다.
- import로 선언된 패키지 안에 있는 클래스의 메서드를 사용할 때는 클래스와 메서드를 마침표(.)로 구분하여 'Math.abs()'와 같이 사용한다.
패키지 | 기능 |
java.lang | - 자바에 기본적으로 필요한 인터페이스, 자료형, 예외 처리 등에 관련된 기능을 제공함. - import 문 없이도 사용할 수 있음. - 주요 클래스 : String, System, Process, Runtime, Math, Error 등 |
java.util | - 날짜 처리, 난수 발생, 복잡한 문자열 처리 등에 관련된 기능을 제공함. - 주요 클래스 : Date, Calendar, Random, StringTokenizer 등 |
java.io | - 파일 입출력과 관련된 기능 및 프로토콜을 제공함. - 주요 클래스 : InputStream, OutputStream, Reader, Writer 등 |
java.net | - 네트워크와 관련된 기능을 제공함. - 주요 클래스 : Socket, URL, InetAddress 등 |
java.awt | - 사용자 인터페이스(UI)와 관련된 기능을 제공함. - 주요 클래스 : Frame, Panel, Dialog, Button, Checkbox 등 |
*Java에서는 특정 기능을 수행하는 함수를 메서드(Method)라고 한다.
Python의 대표적인 표준 라이브러리
- Python 에서 라이브러리를 사용하려면 'import random' 과 같이 선언하고, 사용할 때는 마침표(.)로 구분하여 'random.choice()' 와 같이 사용한다.
클래스 | 기능 |
내장 함수 | - Python에 기본적인 인터페이스로, import 문이나 클래스명 없이도 사용할 수 있음. - 주요 메서드 : abs(), slice(), pow(), print() 등 |
os | - 운영체제와 상호 작용하기 위한 기능을 제공함. - 주요 메서드 : getcwd(), chdir(), system() 등 |
re | - 고급 문자열 처리를 위한 기능을 제공함. - 주요 메서드 : findall(), sub() 등 |
math | - 복잡한 수학 연산을 위한 기능을 제공함. - 주요 메서드 : cos(), log() 등 |
random | - 무작의 선택을 위한 기능을 제공함. - 주요 메서드 : choice(), sample(), random(), randrange() 등 |
statistics | - 통계값 산출을 위한 기능을 제공함. - 주요 메서드 : mean(), median(), variance() 등 |
datetime | - 날짜와 시간 조작을 위한 기능을 제공함. - 주요 메서드 : today(), date(), strftime() 등 |
*Java는 표준 라이브러리에 여러 패키지가 포함되어 있지만, Python은 표준 라이브러리라는 하나의 패키지만 존재한다. 그러므로 라이브러리를 사용할 때는 패키지가 아닌 각 클래스를 호출하여 사용한다.
(14) 예외 처리
예외 처리(Exception Handling)
- 예외가 발생했을 때 프로그래머가 해당 문제에 대비해 작성해 놓은 처리 루틴이 수행되도록 한 것
- 예외가 발생했을 때 일반적인 처리 루틴은 프로그램을 종료시키거나 로그(Log)를 남기는 것이다.
- C++, Ada, Java, JavaScript 와 같은 언어에는 예외 처리 기능이 내장되어 있다.
- 필요한 경우, 조건문을 이용해 예외 처리 루틴을 작성한다.
- 대표적인 예외의 원인
- 컴퓨터 하드웨어 문제
- 운영체제의 설정 실수
- 라이브러리 손상
- 사용자의 입력 실수
- 받아들일 수 없는 연산
- 할당하지 못하는 기억 장치 접근
Java의 예외 처리
- Java는 예외를 객체로 취급하며, 예외와 관련된 클래스를 java.lang 패키지에서 제공한다.
- Java에서는 try ~ catch 문을 이용해 예외를 처리한다.
- try 블록 코드를 수행할 때마다 예외가 발생하면, 예외를 처리하는 catch 블록으로 이동하여 예외 처리 코드를 수행하므로 예외가 발생한 이후의 코드는 실행되지 않는다.
- try ~ catch 문 안에 또 다른 try ~ catch 문을 포함할 수 있다.
- try ~ catch 문 안에서는 실행 코드가 한 줄이라도 중괄호({ })를 생략할 수 없다.
- 기본 형식
try {
예외가 발생할 가능성이 있는 코드;
}
catch (예외객체1 매개변수) {
예외객체1에 해당하는 예외 발생 시 처리 코드;
}
catch (예외객체2 매개변수) {
예외객체2에 해당하는 예외 발생 시 처리 코드;
}
catch (예외객체n 매개변수) {
예외객체n에 해당하는 예외 발생 시 처리 코드;
}
catch (Exception 매개변수) {
예외객체 1~n에 해당하지 않는 예외 발생 시 처리 코드;
}
finally {
예외의 발생 여부와 관계 없이 무조건 처리되는 코드;
}
- 일반적으로 예외가 발생한 경우에는 'try문 → 해당 예외 catch문 → finally문' 순으로 진행되며, 예외가 발생하지 않은 경우에는 'try문 → finally문' 순으로 진행된다.
- finally문은 예외 발생과 관계 없이 무조건 수행되는 블록으로, 생략이 가능하다.
Java의 주요 예외 객체
예외 객체 | 발생 원인 |
ClassNotFoundException | 클래스를 찾지 못한 경우 |
NoSuchMethodException | 메소드를 찾지 못한 경우 |
FileNotFoundException | 파일을 찾지 못한 경우 |
InterruptedIOException | 입·출력 처리가 중단된 경우 |
ArithmeticException | 0으로 나누는 등의 산술 연산에 대한 예외가 발생한 경우 |
IllegalArgumentException | 잘못된 인자를 전달한 경우 |
NumberFormatException | 숫자 형식으로 변환할 수 없는 문자열을 숫자 형식으로 변환한 경우 |
ArrayIndexOutOfBoundsException | 배열의 범위를 벗어난 접근을 시도하는 경우 |
NegativeArraySizeException | 0보다 작은 값으로 배열의 크기를 지정한 경우 |
NullPointerException | 존재하지 않은 객체를 참조한 경우 |
'Certificate > DPE' 카테고리의 다른 글
[정보처리기사 실기] 개념 암기 (2) | 2022.03.26 |
---|---|
[정보처리기사 실기] 시험 대비 (0) | 2022.03.06 |
[정보처리기사 실기] 12. 제품 소프트웨어 패키징 (2) | 2022.03.06 |
[정보처리기사 실기] 11. 응용 SW 기초 기술 활용 (1) | 2022.03.05 |
[정보처리기사 실기] 09. 소프트웨어 보안 구축 (0) | 2022.03.03 |
[정보처리기사 실기] 08. SQL 응용 (0) | 2022.03.02 |
[정보처리기사 실기] 07. 애플리케이션 테스트 관리 (2) | 2022.02.28 |
[정보처리기사 실기] 06. 화면 설계 (0) | 2022.02.28 |