본문 바로가기

정보처리기사_실기

정보처리기사 149 ~ 155 (데이터 입.출력 ~ JAVA 활용)

 

  • 데이터 입.출력
    • 키보드로부터 데이터를 입력받아 화면이나 파일로 출력하는 것
    • C : scanf, printf
    • JAVA : Scanner, nextInt, printf, println
  • C 예제 
#include <stdio.h>

main()
{
	int i, j, k;
    scanf("%d %d", &i, &j);
    k = i + j;
    printf("%d\n", k);
}
  • include <stdio.h> : 표준 입.출력과 관련된 함수를 정의해 놓은 헤더 파일
  •  scanf("%d %d", &i, &j) : 앞의 %d = i의 값, 뒤의 %d = j의 값

 

  • JAVA 예제
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();
    }
}
  • Scanner scan = new Scanner(System.in)
    • Scanner : 입력에 사용할 객체 변수를 생성할 떄 사용하는 클래스 이름
    • scan : 객체 변수명
    • new : 객체 생성 예약어
    • Scanner() : 클래스의 이름
    • System.in : 표준 입력장치 즉, 키보드를 의미
  • nextInt() : 입력값을 정수형으로 반환
  • 헝가리안 표기법
    • 변수의 자료형을 알 수 있도록 자료형을 의미하는 문자를 포함하여 작성하는 방법
  • 주요 제어 문자
    • \n : 한 줄 띄움
    • \t : 일정 간격 띄움
    • \0 : 널 문자 출력

 

  • C_ 1
#include <stdio.h>
main() {
	int i = 10, j = 10, k = 30;
①    i /= j;
②    j -= i;
③    k %= j;
④    printf("%d, %d, %d\n", i, j, k);
}
  • ① : i = i / j → 10 / 10 ==> i = 1
  • ② : j = j - i → 10 - 1 ==> j = 9
  • ③ : k = k를 j로 나눈 나머지 → 30%9 ==> k = 3
  • ④ : i, j, k를 순서대로 출력 ==> 1, 9, 3

 

  • C_ 2
#include <stdio.h>
main () {
 	int result, a =100, b = 200, c = 300;
①   result = a < b ? b++ : --c;
②   printf("%d, %d, %d\n", result, b, c);
}
  • ① : a가 b보다 작으면 b++을 수행하고 아니면 --c를 수행
    • a 100이 b 200 보다 작으므로 b++을 수행
    • b++ 은 후치연산 → result에 b의 값(200)을 저장한 후 b를 1 증가시킨다
    • result = 200, b = 201, c = 300
  • ② : 200, 201, 300

 

  • C_ 3
#includ <stdio.h>
main () {
	int i = 5, j = 4, k = 1, L, m;
①    L = i = 5 || j != 0;
②    m = j <= 4 && k < 1;
③    printf("%d, %d\n", L, m);
}
  • ① : 논리 연산자를 먼저 수행 → j != 0 이 참이므로 1(참) 저장
    • L = 1
  • ② : j <= 4는 참이나 K < 1이 거짓이므로 0(거짓) 저장
    • m = 0
  • ③ : 1, 0

 

  • 제어문
    • 서술된 순서에 따라 무조건 위에서 아래로 실행되는 프로그램의 순서를 변경할 때 사용하는 명령문
    • if, switch, for, while 등...
  • 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);
            }
        }
  • ① : score 배열 안에 86, 53, 95, 76, 61을 저장
  • ② : 문자형 grade 선언
  • ③ : str 배열을 Rank로 초기화
  • ④ : i가 5보다 작은동안 switch문 수행
  • ⑤ : i가 0 → score[0] = 86
    • 86 / 10 = 8 →case8 로 이동
  • ⑥ : score[i] / 10 이 8일 경우 찾아오는 곳
  • ⑦ : grade에 B를 저장
  • ⑧ : switch문을 벗어나 ⑨로 이동
  • ⑨ : grade가 F면 반복문의 처음으로 아니면 print문 수행
    • score[1], score[4]는 F가 나옴
    • 결과
      • 1 is B Rank
      • 2 is A Rank
      • 4 is C Rank

 

  • JAVA 예제
public class Test {
	public static void main(Stringp[] 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]);
                Sysyem.out.print(p + " ");
        }
    }
}
  • ① : 문자열 변수 str을 선언하고 "agile"로 초기화
  • ② : 배열 x를 선언하고, | 1 | 2 | 3 | 4 | 5 | 로 초기화
  • ③ : 5칸의 배열 y를 선언
  • ④ : 정수형 변수 i를 선언하고 0으로 초기화
  • ⑤ : i 가 str의 길이 (5)보다 작은 동안 ⑥ ~ ⑦ 수행
  • ⑥ : y[i]에 str의 1번째 문자를 저장 → y는 | a | g | i | l | e |
  • ⑦ : i에 1 증가
  • ⑧ : 향상된 반복문, x 배열의 각 요소 값을 차례로 받으면서 x 배열의 요소 수 만큼 ⑨ ~ ⑩ 수행
  • ⑨ : i에 1 감소
  • ⑩ : x 배열의 1번째 값이 p를 거쳐 y[i]의 값과 함께 출력
  • 결과 : e1 l2 i3

 

  • 포인터
    • 특정 변수의 주소를 가리키는 것
    • Java는 포인터를 쓸 수 없음
  • C 예제
#include <stdio.h>
main () {
①	int a = 50;
②    int *b = &a;
③    *b = *b + 20;
④    printf("%d, %d\n", a, *b);
⑤    char *s;
⑥    s = "gilbut";
⑦    for (int i = 0; i < 6; i += 2) {
⑧    	printf("%c, ", s[i]);
⑨        printf("%c, ", *(s + i));
⑩        printf("%s\n", s + i);
    }
}
  • ① : 정소형 변수 a를 선언하고 50으로 초기화
  • ② : 포인터변수 b를 선언하고 a의 주소로 초기화 → b에는 a의 주소가 저장
  • ③ : b가 가리키는 값에 20을 더함 → a의 값 + 20 = 70
  • ④ : a와 *b의 값 출력 → 70, 70
  • ⑤ : 포인터변수 s를 선언
  • ⑥ : gilbut이라는 문자의 주소를 s에 저장
  • ⑦ : i가 0부터 2씩 증가하면서 6보다 작은동안 반복문 수행
  • ⑧ : s[i] 즉 s[0]의 값 = g
  • ⑨ : *(s+i) 즉 (s+0)의 값 = g
  • ⑩ : s[0]에서 부터 문자열 끝까지의 문자 출력 = gilbut
  • 결과 : g, g, gilbut

 

  • 구조체
    • 자료의 종류가 다른 변수의 모임
    • 구조체 정의 : struct
  • 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);
}
  • A : 구조체 jsu는 12글자의 nae와 정수형 os, db, hab, hhab으로 저장
  • ① : 구조체 jsu의 자료형
    • st[0] : 데이터1, 95, 88
    • st[1] : 데이터2, 84, 91
    • st[2] : 데이터3, 86, 75
  • ② : jsudㅢ 포인터 변수 p를 선언
  • ③ : p에 st[0] 요소의 주소를 저장
  • ④ : p+1이 가리키는 곳의 hab에 p+1이 가리키는 곳의 os와 p+2가 가리키는 곳의 db를 더함
    • p+1의 hab은 84 + 75 = 159
  • ⑤ : p+1이 가리키는 곳의 hhab에 p+1이 가리키는 곳의 hab과 p가 가리키는 곳의 os와 p가 가리키는 곳의 db를 더함
    • p+1의 hhab은 159 + 95 + 88 = 342
  • ⑥ : p+1의 hab과 hhab의 합을 출력 → 342 + 159 = 501
  • 결과 : 501

 

 

  • 사용자 정의 함수
    • 사용자가 직접 만들어서 사용하는 함수
  • C 예제 (버블정렬)
#include <stdio.h>
void align(int a[]) {
	int temp;
    for (int i = 0; i < 4; i++)
    	for (int j = 0; j < 4 - i; j++)
        	if (a[j] > a[j+1]) {
            	temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp
                }
}

main() {
	int a[] = {85, 75, 50, 100, 95 };
    align(a);
    for (int i = 0; i < 5; i++)
    	printf("%d", a[i]);
}
  • 버블정렬 함수 → 50 75 85 95 100

 

  • 자바의 클래스
    • 객체 생성을 위한 필드와 메소드를 정의하는 설계도
    • 생성자
      • 객체 변수 생성에 사용되는 메소드로 객체 변수를 생성하면서 초기화를 수행
  • JAVA 예제
class A {
	int a;
④    public A(int a) {
⑤		this.a = a; }
⑦    void display() {
⑧    	System.out.println("a=" + a); }
}
class B extends A {
②	public B(int a) {
③    	super(a);
⑥        super.display();
    }⑨
}
public class Test {
	public static void main(String[] args) {
①    	B obj = new B(10);
    }⑩
}
  • ① : 클래스 B의 객체변수 obj를 선언하고 생성자에 인수 10을 전달
  • ② : B 클래스의 시작, 1에서 전달받은 10을 a 가 받음
  • ③ : super() : 부모 클래스를 호출하고 10을 인수로 전달
  • ④ : 생성자 A의 시작
  • ⑤ : a = 10
  • ⑥ : 부모 클래스의 display()를 호출
  • ⑦ : A 클래스의 display 시작
  • ⑧ : a=10 출력
  • 결과 : a=10

 

 

  • 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 클래스의 생성자를 이용하여 Animal 클래스의 객체 변수 a를 선언
  • ② : Chicken 클래스의 생성자인 Chicken() 메소드의 시작
  • ③ : Chicken 클래스의 look() 메소드 호출
  • ④ : look() 메소드
  • ⑤ : Chicken과 a의 값 is animal 을 출력 → Chicken is animal
  • ⑥ : Chicken() 메소드 종료
  • ⑦ : a.show() 메소드 호출, Animal의 show 메소드 호출
  • ⑧ : animal 클래스의 show() 메소드
  • ⑨ : Zoo 출력
  • 결과 
    • Chicken is animal
    • Zoo