2023 정보처리기사 실기 예상 문제 모음

 

C언어 기출문제 모음

JAVA 기출문제 모음

Python 기출문제 모음

정보처리기사 실기 SQL 기출문제 모음

 

정보처리산업기사(정처산기) 실기 C언어 기출문제 모음

정보처리산업기사(정처산기) 실기 Java 기출문제 모음

정보처리산업기사(정처산기) 실기 Python 기출문제 모음

정보처리산업기사(정처산기) 실기 SQL 기출문제 모음


22년 1회

15. <인사팀>의 인원이 총 20명이고, 그 중 3명은 20대, 6명은 30대, 나머지는 40대일 때, 다음 <SQL문>으로 검색될 수 있는 튜플의 개수(인원 수)를 쓰시오.

SELECT 이름 FROM 인사팀 WHERE 나이 BETWEENE 35 AND 49;

답 : (     ) 명 이상, (     )명 이하

더보기

11, 17


22년 1회

18. 다음은 <Student> 테이블에서 학생 수가 5명 이상인 과목에 대해 중간고사 평균을 조회하는 <SQL문>이다. 괄호에 알맞은 답을 적어 <SQL문>을 완성하시오.

SELECT sub_Code As 과목코드, ( 가 ) (mid) AS 중간평균
FROM Students
GROUP BY sub_Code
HAVING ( 나 ) ( * ) >=5;
더보기

가 : AVG

나 : COUNT


22년 2회

3. 다음 테이블(salaries)에서 사원번호(emp_num)가 2073인 사원의 급여(salary)를 2500으로 갱신하는 SQL문을 작성하시오. (단, 문장 마지막의 세미콜론(;)의 여부는 채점에 영향을 주지 않는다)

emp_num name salary
2071 White 2400
2072 Red 2315
2073 Brown 2478
2074 Green 3100
2075 PurPle 4200
더보기

UPDATE salaries SET salary =2500 WHERE emp_num=2073;


22년 2회

18. 다음 관계 대수식을 해석하여 SQL문으로 작성하시오.

더보기

SELECT FNAME, LNAME,SALARY FROM EMP WHERE DNO=1005;


22년 3회

18. SQL에 대한 다음 설명에서 괄호에 들어갈 알맞은 명령어를 쓰시오.

SQL의 하나인 DDL은 DB 구조, 데이터 형식, 접근 방식 등 DB를 구축하거나 수정할 목적으로 사용하는 언어로, 다음 3가지 명령어를 사용하여 표현한다.
(  가  ) : 스키마, 도메인, 테이블 등의 개체를 정의하는 데 사용하는 명령어
(  나  ) : 개체에 대한 정의를 변경하는 데 사용하는 명령어
(  다  ) : 스키마, 도메인, 테이블 등의 개체를 삭제하는 데 사용하는 명령어
더보기

(가) : CREATE

(나) : ALTER

(다) : DROP


23년 1회

19. 다음은 Company 테이블을 생성하는 SQL문이다. company 테이블의 TITLE 속성에는 Intern, Staff, Manager, Director, President 값만 허용할 수 있도록 <SQL문> (가) 와 (나)에 적합한 단어를 쓰시오

CREATE TABLE COMPANY(
           ID INT NOT NULL,
           NAME VARCHAR(20) NOT NULL,
           AGE INT NOT NULL,
           TITLE VARCHAR(20) (가) (TITLE(나) ('Intern','Staff','Manager','Director','President'))
       );
더보기

(가) CHECK

(나) IN


23년 2회

6. 아래 처리조건을 보고 SQL문을 작성하시오.

<처리조건>
-학생 테이블에서 학년이 3학년 이상이 수강하는 과목을 검색한다
-검색 결과 중복을 제거한다
더보기

SELECT DISTINCT 과목 FROM 학생 WHERE 학년 >= 3;


23년 2회

19. SQL문에서 특정 속성의 값을 제한하기 위해 사용하는 문법으로 도메인이 가질 수 있는 값의 범위를 제약할 때 사용하는 제약조건을 쓰시오.

더보기

CHECK


23년 3회

3. 아래 처리조건을 보고 SQL문을 작성하시오.

<처리조건>
-customer 테이블에서 학년(GRADE) 속성을 중복 없이 검색한다
더보기

SELECT DISTINCT GRADE FROM CUSTOMER;


2023 정보처리기사 실기 예상 문제 모음

 

C언어 기출문제 모음

JAVA 기출문제 모음

Python 기출문제 모음

정보처리기사 실기 SQL 기출문제 모음

 

정보처리산업기사(정처산기) 실기 C언어 기출문제 모음

정보처리산업기사(정처산기) 실기 Java 기출문제 모음

정보처리산업기사(정처산기) 실기 Python 기출문제 모음

정보처리산업기사(정처산기) 실기 SQL 기출문제 모음

2023 정보처리기사 실기 예상 문제 모음

 

C언어 기출문제 모음

JAVA 기출문제 모음

Python 기출문제 모음

정보처리기사 실기 SQL 기출문제 모음

 

정보처리산업기사(정처산기) 실기 C언어 기출문제 모음

정보처리산업기사(정처산기) 실기 Java 기출문제 모음

정보처리산업기사(정처산기) 실기 Python 기출문제 모음

정보처리산업기사(정처산기) 실기 SQL 기출문제 모음


22년 1회

11. 다음 Python으로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

x=10
y= 'test'
print(type(x))
print(type(y))

22년 3회

5. 다음 Python으로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오. 

def f(n) :
  return lambda a:a*n
k=f(3)
print(k(10))

22년 3회

10. 다음 Python으로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

def af(a,b):
  return a+b
def sf(a,b):
  return a-b
print(sf(af(4,5),6))

23년 1회

20. 다음 (가)에 무엇이 들어갈지 쓰시오

wallet=['credit','id']
card=True
if('cash'in wallet):
	print('택시')
(가)(card):	
	print('버스')
else:
	print('도보')
지갑안에 신용카드(credit)와 신분증(id)이 있고 카드(card)를 가지고 있다.
대중교통을 이용하는데
지갑 안에 현급(cash)이 있다면 택시를 이용하고
현금이 없는 경우 카드가 있는지 확인하고
카드가 있다면 버스를 이용한다
만약 현금과 카드 둘다 없다면 도보를 이용한다
더보기

elif


23년 2회

11. 다음 보기에서 Python 언어의 특징을 모두 고르시오

<보기>
ㄱ. 변수 선언 시 자료형 작성은 필수
ㄴ. 세미콜론을 사용하지 않아도 된다
ㄷ. 변수에 연속하여 값을 저장하는 것이 가능하다
ㄹ. 같은 수준의 코드는 반드시 동일한 여백을 가져야 한다
ㅁ. gcc를 이용해 컴파일하기 때문에 인터프리터 언어가 아니다
더보기

ㄴ, ㄷ, ㄹ


2023 정보처리기사 실기 예상 문제 모음

 

C언어 기출문제 모음

JAVA 기출문제 모음

Python 기출문제 모음

정보처리기사 실기 SQL 기출문제 모음

 

정보처리산업기사(정처산기) 실기 C언어 기출문제 모음

정보처리산업기사(정처산기) 실기 Java 기출문제 모음

정보처리산업기사(정처산기) 실기 Python 기출문제 모음

정보처리산업기사(정처산기) 실기 SQL 기출문제 모음

2023 정보처리기사 실기 예상 문제 모음

 

C언어 기출문제 모음

JAVA 기출문제 모음

Python 기출문제 모음

정보처리기사 실기 SQL 기출문제 모음

 

정보처리산업기사(정처산기) 실기 C언어 기출문제 모음

정보처리산업기사(정처산기) 실기 Java 기출문제 모음

정보처리산업기사(정처산기) 실기 Python 기출문제 모음

정보처리산업기사(정처산기) 실기 SQL 기출문제 모음


22년 1회

19. 다음 Java로 구현된 프로그램을 분석하여 그 실행결과를 쓰시오.

public class Test {
	public static void main(String args[]) {
    	int a=0, ss=0;
        while(true) {
        if(ss>100) break;
        ++a;
        ss+=a;
        }
        System.out.print(a+ss);
     }
 }

22년 1회

20. 다음 Java로 구현된 프로그램을 분석하여 그 실행결과를 쓰시오. 

public class Test {
	public static void main(String args[]) {
    	int x=1, T_x=0, t_x=0;
        T_x= (x>=0) ? x:-x;
        if(x>=0)
        	t_x=x;
        else
        	t_x=-x;
        System.out.println(T_x + " " + t_x);
        }
 }

22년 2회

10. 다음 Java로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

class Test {  
  public static void main(String args[]) { 
    int i=17;
    i+=1;
    i-=2;
    i*=3;
    i/=4;
    i%=5;
    System.out.print(i); 
  } 
}

22년 2회

16. 다음 Java로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

class Test {  
  public static void main(String args[]) { 
    int a=26;
    int b=91;
    int g=0;
    int c=a<b?a:b;
    for(int i=1; i<c;i++){
      if(a%i==0 && b%i==0)
        g=i;
    }
    System.out.print(g);
  } 

}

22년 3회

3. 다음 Java로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

class Main {  
  public static void main(String args[]) { 
    int[] a=new int[8];
    int i=0;
    int n=11;
    while(n>0){
      a[i++]=n%2;
      n/=2;
    }
    for(i=7;i>=0;i--)
      System.out.print("%d",a[i]);
  } 
}
더보기

00001011


22년 3회

15. 다음 JAVA로 구현된 프로그램을 분석하여 그 실행결과를 쓰시오.

class Main {  
  public static void main(String args[]) { 
    int a[][]=new int [3][3];
    init(a);
    data(a);
    prnt(a);
  } 

  static void init(int a[][]){
    for(int i=0; i<3;i++)
      for(int j=0; j<3;j++)
        a[i][j]=0;
  }

    static void data(int a[][]){
      int v=1;
    for(int i=0; i<3;i++)
      for(int j=i; j<3;j++)
        a[i][j]=v++;
  }

    static void prnt (int a[][]){
    for(int i=0; i<3;i++){
      for(int j=0; j<3;j++){
        if(a[i][j]==0)
          System.out.printf(" ");
      else
          System.out.printf("%d", a[i][j]);
     }
      System.out.println();
    } 
  }
}
더보기

123

  45

    6


23년 1회

12. 다음 코드의 출력결과를 쓰시오

public class Main {
	public static void main(String[] args) {   // true, false
		int x = 1;
		System.out.println(!(x>0));
		System.out.println((x!=0) || (x>0));
		System.out.println(x << 2);
		System.out.println(x & 2);
		System.out.println(x %= 3);
	}
}
더보기

false
true
4
0
1


23년 2회

15. 출력결과

class Main {
    public static void main(String[] args) {
    	int[] a = {4, 7, 1, 2};
    	for(int i=0; i<3; i++) {
    		for(int j=i+1; j<4; j++) {
    			if(a[i] > a[j]) {
    				int temp = a[j];
    				a[j] = a[i];
    				a[i] = temp;
    			}
    		}
    	}
    	for(int i=0; i<4; i++) {
    		System.out.print(a[i] + "a");
    	}
    }
}
더보기

1a2a4a7a


23년 3회

10. 출력결과

class Berry {
	String Str;
	void meth() {
		func();
	}
	void func() {
		System.out.println(Str);
	}
}
class Apple extends Berry {
	String Str;
	void func() {
		Str = "Apple";
		super.Str = "Berry";
		super.func();
		System.out.println(Str);
	}
}
public class Main {
	public static void main(String[] args) {
		Berry A = new Apple();
		A.meth();
	}
}
더보기

Berry
Apple


23년 3회

15. 출력결과

public class Main {
	static int  a = 0;
	static int func(int t) {
		a = a+t;
		return a;
	}
	public static void main(String[] args) {
		for(int i=0; i<5; i++) {
			func(i);
		}
		System.out.print(a);
	}
}

23년 3회

17. 출력결과

class A {
	int f(int a, int b) {
		return a+b;
	}
}
public class Main {
	public static void main(String[] args) {
		A a = new A();
		System.out.print(a.f(25, 25));
	}
}

2023 정보처리기사 실기 예상 문제 모음

 

C언어 기출문제 모음

JAVA 기출문제 모음

Python 기출문제 모음

정보처리기사 실기 SQL 기출문제 모음

 

정보처리산업기사(정처산기) 실기 C언어 기출문제 모음

정보처리산업기사(정처산기) 실기 Java 기출문제 모음

정보처리산업기사(정처산기) 실기 Python 기출문제 모음

정보처리산업기사(정처산기) 실기 SQL 기출문제 모음

2023 정보처리기사 실기 예상 문제 모음

 

C언어 기출문제 모음

JAVA 기출문제 모음

Python 기출문제 모음

정보처리기사 실기 SQL 기출문제 모음

 

정보처리산업기사(정처산기) 실기 C언어 기출문제 모음

정보처리산업기사(정처산기) 실기 Java 기출문제 모음

정보처리산업기사(정처산기) 실기 Python 기출문제 모음

정보처리산업기사(정처산기) 실기 SQL 기출문제 모음


22년 1회

6. 다음 C언어로 구현된 프로그램을 실행하여 7을 입력했을 때, 그 실행결과를 쓰시오

#include <stdio.h>

main() {
  int n, count=0;
  scanf("%d", &n);
  for(int i=2; i<=n/2;i++)
    if(i%1==0)
      count++;
  printf("%d",count);
}

22년 1회

9. 다음 C언어로 구현된 프로그램을 분석하여 그 실행결과를 쓰시오.

#include <stdio.h>

main() {
  int n=3, r=0;
  for(int i=1; i<10;i=i+2)
    r=r+n*i;
  printf("%d", r);
}

22년 1회

14. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

#include <stdio.h>

main() {
  int n1=15, n2=22;
  n1 ^=n2;
  n2 ^=n1;
  n1 ^=n2;
  printf("%d %d", n1, n2);
}
더보기

22 15


22년 1회

17. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

#include <stdio.h>

main() {
  int num=35, evencnt=0, oddcnt=0;
  for(int i=1; i<=num; i++){
    if(i%2==0)
      evencnt++;
    else
      oddcnt++;
  }
  printf("%d %d", evencnt, oddcnt);
}
더보기
17 18

22년 2회

1. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

#include <stdio.h>

main() {
  int a=27, b=12;
  int l, g;
  for(int i=b; i>0; i--){
    if(a%i==0&&b%i==0){
      g=i;
      break;
    }
  }
  l=a*b/g;
  printf("%d",g+l);
}

22년 2회

7. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

#include <stdio.h>

main() {
  int sum=0;
  int i=0;
  for(i=0;i<=10;i++){
    if(i%2!=0)
      continue;
        sum+=i;
  }
  printf("%d",i+sum);
}

22년 2회

14. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

#include <stdio.h>
main() {
  int arr[6];
  int max=0, min=99;
  int sum=0;
  for(int i=0; i<6;i++){
    arr[i]=i*i;
    sum+=arr[i];
  }
  for(int i=0;i<6;i++){
    if (max<arr[i])
      max=arr[i];
    if (min>arr[i])
      min=arr[i];
  }
  printf("%.2f",(sum-max-min)/4.0);
}
더보기

7.50


22년 2회

15. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

#include <stdio.h>
#include <math.h>
main() {
  int arr[5];
  for(int i=0; i<5;i++){
    arr[i]=(i+2)+(i*2);
  }
  for(int i=0;i<5;i++){
    printf("%d",check(arr[i]));
  }
}
int check(int a){
  int n=(int)sqrt(a);
  int i=2;
  while(i<=n){
    if(a%i==0) return 0;
    i++;
  }
  return 1;
}
더보기

11010


22년 2회

19. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

#include <stdio.h>

main() {
  char a[3][5]={"KOR","HUM","RES"};
  char*pa[]={a[0],a[1],a[2]};
  int n=sizeof(pa)/sizeof(pa[0]);
  for(int i=0; i<n;i++)
    printf("%c", pa[i][i]);
}

22년 3회

6. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

#include <stdio.h>

main() {
  int a[3][5]={{27,13,21,41,12},{11,20,17,35,15},{21,15,32,14,10}};
  int sum, ssum=0;
  for(int i=0;i<3; i++){
    sum=0;
    for(int j=0; j<5;j++)
      sum+=a[i][j];
    ssum+=sum;
  }
  printf("%d",ssum);
}

22년 3회

8. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

#include <stdio.h>

main() {
  int i=1, n=0;
  while(i<=50){
    if(i%7==0)
      n+=i;
    i++;
  }
  printf("%d", n);
}

22년 3회

16. 다음 C언어로 구현된 프로그램에서 화면에 5를 입력한 후 나타나는 결과를 쓰시오.

#include <stdio.h>

main() {
  int n, sum=0;
  printf("정수를 입력하시오 : ");
  scanf("%d",&n);
  for (int i=1; i<=n;i++)
    sum=sum+i;
  printf("%d", sum);
}

23년 1회

4. 다음 코드에서 (가)에 들어갈 것을 쓰시오.

#include<stdio.h>
#define LEN 10
void swap(int arr[], int i, int j) {
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}
int partition(int arr[], int left, int right) {
	int pivot = arr[(left + right) / (가)];
	while(left <= right) {
		while(arr[left] < pivot)
			left++;
		while(arr[right] > pivot) 
			right--;
		if(left <= right) {
			swap(arr, left, right);
			left++;
			right--;
		}
	}
	return left;
}
void sort(int arr[], int left, int right) {
	if(left >= right)
		return;
	int center = partition(arr, left, right);
	sort(arr, left, center-1);
	sort(arr, center, right);
}
void quick_sort(int arr[]) {
	sort(arr, 0, LEN-1);
}
int main(void) {
	int data[LEN] = {5, 8, 3, 12, 9, 25, 15, 21, 1, 19};
	quick_sort(data);
	for(int i=0;i<LEN;i++){
		printf("%d\n", data[i]);
	}
}
더보기

2

 

퀵 정렬 문제


23년 1회

5. 다음 코드에서 (가)에 들어갈 것을 쓰시오.

#include<stdio.h>
int SumNTo1(int n) {
	if(n <= 1)
		return 1;
	else
		return n + (가);
}
int main() {
	int result = SumNTo1(100);
	printf("%d", result);
}
더보기

 SumNTo1(n-1)


23년 1회

16. 다음 코드에서 (가)에 들어갈 것을 쓰시오.

#include<stdio.h>
int recursive(int n) {
	if(n <= 1) 
		return 1;
	else 
		return n*n+recursive((가));
}
int main() {
	int i;
	scanf("%d", &i);
	printf("%d ", recursive(i));
}

23년 2회

3. 출력 결과

#include<stdio.h>
int main() {
	int d = 55;
	int n = 4;
	int r = 0, q = 0;
	r = d;
	while(r >= 4) {
		r = r - n;
		q++;
	}
	printf("%d 그리고 ", q);
	printf("%d", r);
}
더보기

13 그리고 3


23년 2회

16. 코드 아래에 있는 것이 출력결과인데 출력결과의 파란색 빈칸에 들어갈 출력값을 적으시오

#include<stdio.h>
void Sort(int a[][6]) {
	for(int i=0; i<=4; i++) {
		for(int j=5; j>=0; j--) {
			if(i==0 | i==4 | j==0 | j==5) {
				printf("%3d", a[i][j]);
			}
			else {
				printf("   ");  // 공백 3칸 
			}
		}
		printf("\n");
	}
}
int main() {
	int a[5][6] = {{0, 1, 2, 3, 4, 5},
				{6, 7, 8, 9, 10, 11},
				{12, 13, 14, 15, 16, 17},
				{18, 19, 20, 21, 22, 23},
				{24, 25, 26, 27, 28, 29}};
	Sort(a);
}

더보기

17                           12

23                           18


23년 2회

17. 출력결과

#include<stdio.h>
int main() {
	char s1[5] = "abcd";
	char s2[5];
	for(int i=0; i<4; i++) {
		s2[i] = s1[3-i];
	}
	s2[5] = '\0';
	printf("%s", s2);
}
더보기

dcba


23년 2회

18. 출력결과

#include<stdio.h>
int main() {
	// A = 65, a = 97
	int a = 10;
	char b = 'a';
	printf("%d \n", a);
	printf("%d \n", b); 
	printf("%c", b); 
}
더보기

10
97
a


23년 2회

20. 출력결과

#include<stdio.h>
int main() {
	int result=1, i;
	for(i=1; i<=5; i++) {
		result *= i;
	}
	printf("%d", result);
}

23년 3회

2. 출력결과

#include<stdio.h>
#define MAX 4
int prin(int a);
int main() {
	prin(MAX);
}
int prin(int a) {
	if(a > 1) prin(a-1);
	printf("%d", a);
}
더보기

1234


23년 3회

5. 달팽이 배열


23년 3회

7. 출력결과

#include<stdio.h>
int main() {
    int data[] = {15, 12, 26, 23, 31, 36};
    int temp = 0;
    int cnt = sizeof(data)/sizeof(int);
    for(int i=0; i < cnt-1; i++) {
        for(int j=0; j < cnt - 1 - i; j++){
            if(data[j] > data[j+1]) {
                temp = data[j];
                data[j] = data[j+1];
                data[j+1] = temp;
            }
            }
        }
      
    for(int i=1; i<cnt-1;i++){
        printf("%d ", data[i]);
    }
}
더보기

15 23 26 31


23년 3회

9. 출력결과

#include<stdio.h>
int sub(int* a) {
	printf("%d", *a);
	printf("%d", a[2]);
}
int main() {
	int a[10] = {1,2,3,4,5,6};
	sub(a);
	sub(a+2);
}
더보기

1335


23년 3회

13. (가), (나)에 적절한 것을 쓰시오

#include<stdio.h>
int compare(int i, int j, int *ma, int *in) {
	if(i>j) {
		*ma = j;
		*in = i;
	}
	else {
		*ma = i;
		*in = j;
	}
}
int main() {
	int max = 0;
	int min = 0;
	compare(3, 7, (가), (나));
	printf("작은수:%d 큰수:%d", max, min);
}
더보기

(가) &max

(나) &min

 


2023 정보처리기사 실기 예상 문제 모음

 

C언어 기출문제 모음

JAVA 기출문제 모음

Python 기출문제 모음

정보처리기사 실기 SQL 기출문제 모음

 

정보처리산업기사(정처산기) 실기 C언어 기출문제 모음

정보처리산업기사(정처산기) 실기 Java 기출문제 모음

정보처리산업기사(정처산기) 실기 Python 기출문제 모음

정보처리산업기사(정처산기) 실기 SQL 기출문제 모음

[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

[2022년 1회] 정보처리산업기사 실기 기출문제

[2022년 2회] 정보처리산업기사 실기 기출문제

[2022년 3회] 정보처리산업기사 실기 기출문제

「23년 1회」정보처리산업기사 실기 기출문제

「23년 2회」정보처리산업기사 실기 기출문제


1. 다음은 트랜잭션의 4가지 특성에 대한 설명이다. 설명에 해당하는 것을 쓰시오(원래는 <보기>에서 고르는 문제)

1. 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없다
2. 트랜잭션이 일단 완료되면 그 후에 어떤 형태로 시스템이 고장 나더라도 트랜잭션의 결과는 잃어버리지 않고 지속되어야 한다.
더보기

1. 격리성

2. 지속성


2. 보기에 있는 것을 DDL, DML, DCL로 분류하시오.

<보기>
GRANT
DELETE
CREATE
ALTER
SELECT
REVOKE
INSERT
UPDATE
DROP
더보기

DDL : CREATE, ALTER, DROP

 

DML: SELECT, DELETE, INSERT, UPDATE

 

DCL : REVOKE, GRANT


3. 출력 결과

#include<stdio.h>
int main() {
	int d = 55;
	int n = 4;
	int r = 0, q = 0;
	r = d;
	while(r >= 4) {
		r = r - n;
		q++;
	}
	printf("%d 그리고 ", q);
	printf("%d", r);
}
더보기

13 그리고 3


4. 데이터링크 계층의 대표적인 프로토콜로 정보를 전송 제어 부호가 포함된 프레임이라는 단위로 분할하여 전송하며 프로토콜의 구조는 프레임의 끝, 주소부, 제어부, 데이터부, 오류검출부로 구분된다.

프레임은 I-Frame, S-Frame, U_Frame이 있다. 설명에 해당하는 프로토콜을 쓰시오

더보기

HDLC


5. 아래 OSI계층 표의 PDU(데이터 단위)를 쓰시오.

(원래는 보기가 있는 문제)

물리 계층  
데이터링크 계층  
네트워크 계층  
더보기
물리 계층 비트
데이터링크 계층 프레임
네트워크 계층 패킷

6. 아래 처리조건을 보고 SQL문을 작성하시오.

<처리조건>
-학생 테이블에서 학년이 3학년 이상이 수강하는 과목을 검색한다
-검색 결과 중복을 제거한다
더보기

SELECT DISTINCT 과목 FROM 학생 WHERE 학년 >= 3;


7. <보기>를 V모델 순서대로 나열하시오

<보기>
ㄱ. 인수 테스트
ㄴ. 시스템 테스트
ㄷ. 통합 테스트
ㄹ. 단위 테스트
더보기

ㄹ -> ㄷ -> ㄴ -> ㄱ

단위->통합->시스템->인수


8. 아래는 정규화 과정 중 일부에 대한 설명이다. 적절한 설명을 보기에서 고르시오

<보기>
ㄱ. 이행적 함수 종속 관계를 제거한다
ㄴ. 기본키에 속하지 않는 모든 속성이 기본키에 완전 함수 종속이 되도록 부분 함수 종속성을 제거한다.
ㄷ. 결정자가 후보키가 아닌 함수 종속성을 제거한다

1) 제 2정규화 : 

2) 제 3정규화 : 

3) BCNF : 

더보기

1) 제 2정규화 : ㄴ

2) 제 3정규화 : ㄱ

3) BCNF : ㄷ


9. 아래 기호를 써서 HRN 스케줄링 기법에 우선 순위 공식을 쓰시오

P: 우선순위
S: 서비스 시간
W : 대기 시간
더보기

P=(S+W)/ S 또는 (W+S)/S


10. 다음 설명에 해당하는 것을 보기에서 고르시오 

데이터 프레임을 연속적으로 전송하는 과정에서 NAK를 수신하게 되면, 오류가 발생한 프레임 이후에 전송된 모든 데이터 프레임을 재전송하는 방식이다
<보기>
ㄱ. Selective-Repeat ARQ
ㄴ. Stop-and-Wait ARQ
ㄷ. Non-Acknowledge ARQ
ㄹ. Go-Back N ARQ
ㅁ. Selective ARQ
ㅂ. Adaptive ARQ
ㅅ. Forward-Stop ARQ
ㅇ. Auto-Repeat ARQ
더보기

Go-Back N ARQ


11. 다음 보기에서 Python 언어의 특징을 모두 고르시오

<보기>
ㄱ. 변수 선언 시 자료형 작성은 필수
ㄴ. 세미콜론을 사용하지 않아도 된다
ㄷ. 변수에 연속하여 값을 저장하는 것이 가능하다
ㄹ. 같은 수준의 코드는 반드시 동일한 여백을 가져야 한다
ㅁ. gcc를 이용해 컴파일하기 때문에 인터프리터 언어가 아니다
더보기

ㄴ, ㄷ, ㄹ


12. 다음은 Java 관련 용어에 대한 설명이다. 설명에 해당하는 것을 쓰시오

Java에서 힙(heap)에 남아있으나변수가 가지고 있던 참조값을 잃거나 변수 자체가 없어짐으로써 더 이상 사용되지 않는 객체
더보기

가비지(Garbage)


13. 다음 <보기>를 블랙박스와 화이트박스 테스트로 분류하시오

<보기>
ㄱ. 제품의 내부 요소들이 명세서에 따라 수행되고 충분히 실행되는 가를 보장하기 위한 검사이다
ㄴ. 각 기능별로 적절한 정보 영역을 정하여 적합한 입력에 대한 출력의 정확성을 점검한다
ㄷ. 프로그램의 구조에 의거하여 테스트 하는 것이다
ㄹ. 요구사항 명세서에 기술되어 있는 소프트웨어 기능을 토대로 실시하는 테스트이다

블랙 박스 테스트 : 

화이트박스 테스트 : 

더보기

블랙 박스 테스트 : ㄴ, ㄹ

화이트박스 테스트 : ㄱ, ㄷ


14. 정보처리를 수행하는 응용 프로그램과의 인터페이스를 제공하며 전자우편이나 파일 전송 같은 사용자 서비스를 제공하는 OSI 계층을 쓰시오

더보기

응용 계층


15. 출력결과

class Main {
    public static void main(String[] args) {
    	int[] a = {4, 7, 1, 2};
    	for(int i=0; i<3; i++) {
    		for(int j=i+1; j<4; j++) {
    			if(a[i] > a[j]) {
    				int temp = a[j];
    				a[j] = a[i];
    				a[i] = temp;
    			}
    		}
    	}
    	for(int i=0; i<4; i++) {
    		System.out.print(a[i] + "a");
    	}
    }
}
더보기

1a2a4a7a


16. 코드 아래에 있는 것이 출력결과인데 출력결과의 파란색 빈칸에 들어갈 출력값을 적으시오

#include<stdio.h>
void Sort(int a[][6]) {
	for(int i=0; i<=4; i++) {
		for(int j=5; j>=0; j--) {
			if(i==0 | i==4 | j==0 | j==5) {
				printf("%3d", a[i][j]);
			}
			else {
				printf("   ");  // 공백 3칸 
			}
		}
		printf("\n");
	}
}
int main() {
	int a[5][6] = {{0, 1, 2, 3, 4, 5},
				{6, 7, 8, 9, 10, 11},
				{12, 13, 14, 15, 16, 17},
				{18, 19, 20, 21, 22, 23},
				{24, 25, 26, 27, 28, 29}};
	Sort(a);
}

더보기

17                           12

23                           18

 


17. 출력결과

#include<stdio.h>
int main() {
	char s1[5] = "abcd";
	char s2[5];
	for(int i=0; i<4; i++) {
		s2[i] = s1[3-i];
	}
	s2[5] = '\0';
	printf("%s", s2);
}
더보기

dcba


18. 출력결과

#include<stdio.h>
int main() {
	// A = 65, a = 97
	int a = 10;
	char b = 'a';
	printf("%d \n", a);
	printf("%d \n", b); 
	printf("%c", b); 
}
더보기

10
97
a


19. SQL문에서 특정 속성의 값을 제한하기 위해 사용하는 문법으로 도메인이 가질 수 있는 값의 범위를 제약할 때 사용하는 제약조건을 쓰시오.

더보기

CHECK


20. 출력결과

#include<stdio.h>
int main() {
	int result=1, i;
	for(i=1; i<=5; i++) {
		result *= i;
	}
	printf("%d", result);
}

[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

[2022년 1회] 정보처리산업기사 실기 기출문제

[2022년 2회] 정보처리산업기사 실기 기출문제

[2022년 3회] 정보처리산업기사 실기 기출문제

「23년 1회」정보처리산업기사 실기 기출문제

「23년 2회」정보처리산업기사 실기 기출문제

[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

[2022년 1회] 정보처리산업기사 실기 기출문제

[2022년 2회] 정보처리산업기사 실기 기출문제

[2022년 3회] 정보처리산업기사 실기 기출문제

「23년 1회」정보처리산업기사 실기 기출문제

「23년 2회」정보처리산업기사 실기 기출문제


1. 운영체제 운용 기법을 <보기>에서 고르시오

① 하나의 주기억장치에 여러 개의 프로그램을 동시에 처리하는 방식
② 자료나 정보 단위들이 발생할 때마다 즉각적으로 처리하는 것이 아니라 일정량 또는 일정 기간 동안 모아 두었다가 한꺼번에 처리하는 방식
③ CPU의 전체 사용 시간을 작은 작업 시간량으로 나누어서 그 시간량 동안만 번갈아가면서 CPU를 할당하여 각 작업을 처리하는 방식
④ 컴퓨터 시스템에 여러 개의 프로세스(CPU)를 사용하여 처리하는 방식
<보기>
ㄱ. 일괄 처리시스템
ㄴ. 다중 프로그래밍 시스템
ㄷ. 시분할 시스템
ㄹ. 다중 처리 시스템
더보기

① ㄴ

② ㄱ

③ ㄷ

④ ㄹ


2. 개체와 관계를 아래 E-R모델에서 찾아 쓰시오

더보기

1. 개체 : 고객, 책, 출판사

2. 관계 : 구매, 공급


3. 내부에서 사설 IP 주소를 사용하고 외부 네트워크로 나가는 주소는 공인 IP 주소를 사용하도록 하는 IP 주소 변환 방식으로 사설 IP 주소를 공인 IP 주소로 바꿔주는데 사용하는 통신망의 주소 변환 기술


4. 다음 코드에서 (가)에 들어갈 것을 쓰시오.

#include<stdio.h>
#define LEN 10
void swap(int arr[], int i, int j) {
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}
int partition(int arr[], int left, int right) {
	int pivot = arr[(left + right) / (가)];
	while(left <= right) {
		while(arr[left] < pivot)
			left++;
		while(arr[right] > pivot) 
			right--;
		if(left <= right) {
			swap(arr, left, right);
			left++;
			right--;
		}
	}
	return left;
}
void sort(int arr[], int left, int right) {
	if(left >= right)
		return;
	int center = partition(arr, left, right);
	sort(arr, left, center-1);
	sort(arr, center, right);
}
void quick_sort(int arr[]) {
	sort(arr, 0, LEN-1);
}
int main(void) {
	int data[LEN] = {5, 8, 3, 12, 9, 25, 15, 21, 1, 19};
	quick_sort(data);
	for(int i=0;i<LEN;i++){
		printf("%d\n", data[i]);
	}
}
더보기

2

 

퀵 정렬 문제


5. 다음 코드에서 (가)에 들어갈 것을 쓰시오.

#include<stdio.h>
int SumNTo1(int n) {
	if(n <= 1)
		return 1;
	else
		return n + (가);
}
int main() {
	int result = SumNTo1(100);
	printf("%d", result);
}
더보기

 SumNTo1(n-1)


6. 다음 설명에 해당하는 것이 뭔지 쓰시오.

1. 트랜잭션이정상적으로 수행하여 변경된 내용을 실제 물맂거 디스크에 저장할 때 사용하는 연산
2. 트랜잭션의 실행이 비정상적임을 알리는 연산자로 트랜잭션이 수행한 결과를 원래의 상태로 원상 복귀 시키는 연산
더보기

1. commit

2. rollback


7. 관계 대수 연산자를 <보기>에서 고르시오.

1. 한 릴레이션에서 조건에 만족하는 튜플들의 부분 집합을 구한다
2. 한 릴레이션의 속성들의 부분집합을 구한다
3. 두 릴레이션 모두에 속한 튜플들로 이루어진 릴레이션을 생성한다
4. 두 릴레이션 중 하나의 릴레이션에는 속하지만 다른 하나의 릴레이션에는 속하지 않는 튜플들로 이루어진 릴레이션을 생성한다.
<보기>
ㄱ. select
ㄴ. project
ㄷ. intersection
ㄹ. difference
더보기

1. ㄱ

2. ㄴ

3. ㄷ

4. ㄹ


8. 다음 설명에 해당하는 용어를 쓰시오

IP 프로토콜 위에서 연결형 서비스를 지원하는 프로토콜로 데이터를 세그먼트라는 블록 단위로 분할해 전송하며 전이중 방식의 양방향 가상 회선을 제공하기 때문에 신뢰성 있는 데이터 전송을 보장하며 흐름 제어 기능과 혼잡 제어 기능을 지원하여 네트워크에서의 데이터 전달 통제가 가능한 프로토콜

9. 다음은 Ipv4 헤더이다. Header Length와 Destination Ip Address 크기를 구하시오

더보기

Header Length : 4

Destination Ip address : 32


10. SRT 방식으로 스케줄링 할 경우, 입력된 작업이 다음과 같을 때 평균 반환시간과 평균 대기시간을 구하시오

더보기

평균 반환 시간 : 6.75

평균 대기 시간 : 3.25

 

 

SRT(Shortest Remaining Time)
SJF방식을 선점 스케줄링 방식으로 변경한 기법
최단 잔여시간을 우선으로 하는 스케줄링이다
진행 중인 프로세스가 있어도, 최단 잔여시간인 프로세스를 위해 sleep 시키고 짧은 프로세스를 먼저 할당한다.


11. 단위 테스트가 끝난 모듈을 통합하는 과정에서 발생할 수 있는 오류를 찾는 테스트가 통합 테스트(integration test)이다. 이때 단위 테스트가 끝난 모듈을 한꺼번에 결합하여 수행하는 방식을 뭐라고 하는지 쓰시오.

(원래 문제는 보기 있는 문제)

더보기

빅뱅(bigbang) 테스트


12. 다음 코드의 출력결과를 쓰시오

public class Main {
	public static void main(String[] args) {   // true, false
		int x = 1;
		System.out.println(!(x>0));
		System.out.println((x!=0) || (x>0));
		System.out.println(x << 2);
		System.out.println(x & 2);
		System.out.println(x %= 3);
	}
}
더보기

false
true
4
0
1


13. IP 주소가 191.168.25.0이고 서브넷 마스크가 255.255.252.0일 때, 네트워크 주소와 브로드캐스트 주소를 쓰시오

더보기

1. 네트워크 주소 : 191.168.24.0

2. 브로드캐스트 주소 : 191.168.27.255


14. 데이터 링크 계층 기능 중 옳은 것을 모두고르시오

<보기>
ㄱ. 주소 지정
ㄴ. 순서 제어
ㄷ. 흐름 제어
ㄹ. 오류 처리
ㅁ. 동기화
더보기

ㄴ,ㄷ, ㄹ, ㅁ


15. 다음은 교착상태 필요충분조건중 하나이다. 설명에 해당하는 것을 쓰시오.

1. 프로세스들이 필요로 하는 자웡네 대해 배타적인 통제권을 요구한다
2. 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.
더보기

1. 상호 배제

2. 순환 대기


16. 다음 코드에서 (가)에 들어갈 것을 쓰시오.

#include<stdio.h>
int recursive(int n) {
	if(n <= 1) 
		return 1;
	else 
		return n*n+recursive((가));
}
int main() {
	int i;
	scanf("%d", &i);
	printf("%d ", recursive(i));
}

17. 다음은 데이터 베이스 질의 처리기에 대한 설명이다. <보기>에서 고르시오

1. 데이터 조작어(삽입, 삭제, 수정, 검색) 요청을 분석하여 런타임 데이터베이스 처리기가 이해할 수 있도로 해석한다
2. 데이터베이스에 접근하는 과정에서 사용자의 접근 권한이 유효한지 검사하고 데이터베이스 무결성을 유지하기 위한 제약조건 위반 여부를 확인한다. 회복이나 병행 수행과 관련된 작업도 한다.
<보기>
ㄱ. DDL 컴파일러
ㄴ. DML 프리컴파일러
ㄷ. DML 컴파일러
ㄹ. 런타임 데이터베이스 처리기
ㅁ. 트랜잭션 관리자
더보기

1. ㄷ

2. ㅁ


18. 문장 커버리지 수행 순서를 쓰시오

#include<stdio.h>
int main() {
	int i = 1;
	while(i<=1) {
		if(i%2==1)
			printf("%d", i);
		i++;
	}
	return 0;
}

사진 출처 : 기사퍼스트 유튜브 채널

<테스트 케이스>
1->(     ) - > (      ) ->(     ) - > (      ) ->(     ) - > (      )
더보기

1234526


19. 다음은 Company 테이블을 생성하는 SQL문이다. company 테이블의 TITLE 속성에는 Intern, Staff, Manager, Director, President 값만 허용할 수 있도록 <SQL문> (가) 와 (나)에 적합한 단어를 쓰시오

CREATE TABLE COMPANY(
           ID INT NOT NULL,
           NAME VARCHAR(20) NOT NULL,
           AGE INT NOT NULL,
           TITLE VARCHAR(20) (가) (TITLE(나) ('Intern','Staff','Manager','Director','President'))
       );
더보기

(가) CHECK

(나) IN


20. 다음 (가)에 무엇이 들어갈지 쓰시오

wallet=['credit','id']
card=True
if('cash'in wallet):
	print('택시')
(가)(card):	
	print('버스')
else:
	print('도보')
지갑안에 신용카드(credit)와 신분증(id)이 있고 카드(card)를 가지고 있다.
대중교통을 이용하는데
지갑 안에 현급(cash)이 있다면 택시를 이용하고
현금이 없는 경우 카드가 있는지 확인하고
카드가 있다면 버스를 이용한다
만약 현금과 카드 둘다 없다면 도보를 이용한다
더보기

elif

 


[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

[2022년 1회] 정보처리산업기사 실기 기출문제

[2022년 2회] 정보처리산업기사 실기 기출문제

[2022년 3회] 정보처리산업기사 실기 기출문제

「23년 1회」정보처리산업기사 실기 기출문제

「23년 2회」정보처리산업기사 실기 기출문제

 

[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)


목차

1. this 예약어

2. static 변수

3. 배열

4. 상속, super 예약어

5. 오버라이딩(overrriding)

6. 추상클래스


1. this 예약어

앞에서도 맛보기로 살짝 봤듯이 this는 자기자신을 가리키는 예약어이다.

 

science.getTitle("안녕")이렇게 메서드를 호출하면 

public void getTitle(String title){}메서드가 호출되는데

this. title= title은 즉 science.getTitle="안녕"과 동일하고

science.getTitle이라는 자기자신을 this라고 표현하는 것이다

 

english.getTitle("안녕안녕")도 마찬가지로 

this.title=title은 english.getTitle="안녕안녕"을 뜻한다

package test;

class Book {
  private String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  public void getTitle(String title){
	  this.title= title;
	  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        science.getTitle("안녕");
        System.out.println(science.getTitle());
        
        Book english = new Book();
        english.getTitle("안녕안녕");
        System.out.println(english.getTitle());
    }
}

 

 

1-1) 생성자에서 다른 생성자를 호출하는 this

아래와 같이 클래스에 생성자가 여러 개 있을 때 this라는 예약어를 통해 이 클래스의 다른 생성자를 호출할 수 있다

 

Book()생성자에서 this("1번째 책")을 사용해 Book(String title) 생성자를 호출한 것이다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public Book(){
	  this("1번째책");
  }
  public Book(String title){
	  this.title= title;
	  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        System.out.println(science.title);
    }
}

 

1-2) 자신의 주소를 반환하는 this도 있는데 이 부분은 생략한다


2. static 변수

static 변수는 C언어에서 봤던 개념과 거의 똑같다.

프로그램이 실행되어 메모리에 올라갔을 때 딱 한번만 메모리 공간이 할당되며 그 값은 모든 인스턴스가 공유한다

 

아래 예문의 결과값을 예상해보자.

package test;

class Book {
  public int a=2;
  static public int b=3;
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
       
        english.a++;
        System.out.println(science.a);
        english.b++;
        System.out.println(science.b);
        science.a++;
        System.out.println(english.a);
        science.b++;
        System.out.println(english.b);
        
    }
}
더보기

2

4

3

5

 

static이 아닌 a는 인스턴스마다 새로 초기화가 된다

static인 b는 맨처음 한번 3으로 초기화되고 이 3을 인스턴스끼리 공유한다

 

english.a++; 

System.out.println(science.a); //science.a의 값은 변동이 없어 2가 된다

english.b++; 

System.out.println(science.b); //b가 static변수이므로 1증가된 4가 된다

science.a++;

System.out.println(english.a); //1번증가됐으므로 1증가된 3이 된다

science.b++;

System.out.println(english.b); //b가 static 변수이므로 4에서 1증가된 5가 된다


3. 배열

배열 역시 C언어에서 봤던 개념과 동일하다

클래스가 여러가지 다른 자료형을 설계하는 도구였다면 배열은 여러가지 같은 자료형을 설계하는 도구이다

배열은 같은 자료형을 여러개 한꺼번에 관리할 수 있다

 

배열은 아래와 같은 형태이다

int[] a=new int[10]
int a[]=new int[10]

2가지 형태가 다 가능하다

 

배열 선언과 동시에 초기화

배열은 선언하면 그와 동시에 각 요소의 값이 초기화 되며 아래와 같이 배열 선언과 동시에 특정 값으로 초기화도 가능하다

int[] a=new int[] {1,2,3};
int[] a={1,2,3};

 

자바의 배열은 배열 길이를 나타내는 length 속성을 가지며 a.length하면 3이 출력된다

package test;


public class Test {
    public static void main(String[] args) {

        int[] a= {1,2,3};
        System.out.println(a.length);
        
    }
}

 

배열의 기본적인 것들은 C언어와 동일하므로 생략한다

C언어에서의 배열 개념만 알면 자바에서 배열은 사실 문제만 풀어보면 된다


4. 상속

상속이라는 말은 익힐 들어봤을 것이다.

부모님의 재산을 물려받는 것을 보통 상속이라고 하는데 거의 똑같이 생각해주면 된다.

B 클래스가 A클래스를 상속받으면 B클래스는 A클래스의 객체 변수와 메서드를 사용할 수 있다

 

기본형태는 아래와 같다. Cat이라는 클래스가 Animal이라는 클래스를 상속받았고

그 표현으로 extends라는 표현을 쓴다. 

package test;

class Animal {
	
}

public class Cat extends Animal{
	
}

 

쓸 수 있는 영역을 extends 확장한다는 것이다

상속을 하는 이유를 생각해보자.

고양이 클래스가 있고 개 클래스가 있고 하마 클래스가 있고 이런식으로 여러개의 동물 클래스가 있다고 치자.

고양이, 개, 하마를 묶어서 한꺼번에 동물이라고 표현할 수 있다

고양이, 개, 하마는 모두 동물이므로 만약 따로 따로 클래스를 만들게되면 공통된 요소들이 많아지게 될 것이다

예를 들면 eat(), sleep() 뭐 이런 것들

따로따로 만들면 기능은 똑같은데 굳이 새로 만들어줘야하므로 효율적이지 않다

그래서 상속이라는 개념을 쓴다

 

또한 자바에서 모든 클래스는 Object 클래스의 자식이자 하위 클래스이다.(Object가 제일 상위 클래스)

extends(상속)을 하면 아래의 그림과 같이 확장된다

 

아래와 같은 예문을 보자. Cat cat1=new  Cat()으로 객체를 생성하며 Cat() 생성자를 호출한다. 

출력결과는 무엇일까

package test;

class Animal {
	public Animal(){
		System.out.println("내가 니 부모다");
	}
}

public class Cat extends Animal{
	public Cat(){
	System.out.println("부모님 안녕하세요");
	}
	
	 public static void main(String[] args) {
	  Cat cat1=new Cat(); //cat1 객체 생성
	 }
}
더보기

내가 니 부모다

부모님 안녕하세요

자식 객체를 만들었는데 부모 클래스의 생성자까지 같이 호출되는 것을 확인할 수 있다

즉, 하위 클래스에서 객체가 만들어질 때는 그 객체가 만들어지기 전에 부모가 먼저 만들어지고 그 다음 자식이 만들어진다는 것이다. (생각해보면 부모가 있어야 자식이 있는 것이 당연하다)

상위 클래스의 생성자가 호출된 후 상위 클래스의 객체 변수가 메모리에 생성된다

그 후 하위 클래스의 생성자가 호출된다

 

1) Cat cat1= new Cat(); 실행

2) Object 생성자 호출

3) Animal 생성자 호출

4) Cat 생성자 호출

 

이게 가능한 이유는 원래 super()라는 예약어가 있는데 그게 생략돼있는 것이다.

super()라는 것을 생략해도 컴파일러가 자동으로 넣어준다

super 예약어는 하위 클래스에서 상위 클래스로 접근할 때 사용하며 상위 클래스의 생성자를 호출하는데도 사용한다

 

만약에 매개변수가 있는 상위 클래스의 생성자를 호출해야한다면 super(매개변수); 이런 형태를 쓰면 된다


5. 오버라이딩(overrriding)

 

아래의 출력결과를 예상해보자.

package test;

class Animal {
	
	public void eat() {
		System.out.println("동물이 밥을 먹다");
	}
}

public class Cat extends Animal{
	
	public void eat() {
		System.out.println("고양이가 밥을 먹다");
	}
	
	 public static void main(String[] args) {
	  Cat cat1=new Cat();
	  cat1.eat();
	 }
}

 

더보기

고양이가 밥을 먹다

 

객체를 생성한 후 객체의 메서드를 호출했다. 그런데 아까 배웠듯이 객체가 생성될때 부모의 생성자가 먼저 호출되며 부모가 먼저 만들어진다고 했는데 어떻게 "고양이가 밥을 먹다"가 출력 된 걸까?

이처럼 상위클래스에서 eat()메서드가 이미 정의돼있다.

그런데 상위 클래스에서 정의한 메서드가 하위 클래스에 구현할 내용과 차이가 있을 때는 하위 클래스에서 메서드를 재정의할 수 있는데 이를 메서드 오버라이딩이라고 한다

부모 메서드와 자식 메서드가 동일한 형태로 공존하지만 부모 메서드는 무시되고 자식 메서드만 실행되는 것이다

 

오버라이딩을 하려면 반환형, 메서드 이름, 매개 변수 개수, 매개변수 자료형이 다 같아야 한다

 

 

그렇다면 아래의 출력결과도 예상해보자.

package test;

class Animal {
	
	public void eat() {
		System.out.println("동물이 밥을 먹다");
	}
}

public class Cat extends Animal{
	
	public void eat() {
		System.out.println("고양이가 밥을 먹다");
	}
	
	 public static void main(String[] args) {
	  Animal cat1=new Cat();
	  cat1.eat();
	 }
}
더보기

고양이가 밥을 먹다

 

이번에는 특이하게 객체를 생성하는데 객체를 생성하는 자료형과 생성자가 다르다

Animal cat1= new Cat();

 

객체를 생성하는 자료형은 부모 클래스인 Animal이고 생성자는 자식의 생성자이다.

부모 클래스의 객체를 생성하는 것인데 이렇게 아래 그림처럼 Animal 자료형인 cat1이 Animal만 접근하는 줄 알았는데

부모 클래스는 항상 자식 클래스에서 자신의 메서드를 재정의했는지 확인하기 때문에 Animal 객체를 생성했지만 Animal의 eat()메서드가 아니라 자식의 eat()메서드가 실행된다


 

6. 추상클래스(Abstract class)

 

아래의 예문을 보자.

오버라이딩이 되면서 "동물이 밥을 먹다"는 절대로 실행될 일이 없다

그렇다면 굳이 적을 필요가 있을까?

package test;

class Animal {
	
	public void eat() {
		System.out.println("동물이 밥을 먹다");
	}
}

public class Cat extends Animal{
	
	public void eat() {
		System.out.println("고양이가 밥을 먹다");
	}
	
	 public static void main(String[] args) {
	  Animal cat1=new Cat();
	  cat1.eat();
	 }
}

이런 생각에서 나온 것이 바로 추상 메서드이다.

 

메서드에서 반환타입 메서드 이름등 이런 부분을 선언부라고 하고 안에 중괄호{} 부분을 구현부라고 하는데

아래와 같이 추상메서드는 선언부(메서드 원형)만 존재한다. 

출처  : [Java의 정석]Chapter6.객체지향 프로그래밍(14~17) (velog.io)

 

 

추상메서드는 구현부가 없으므로 반드시 오버라이딩이 된다. 

그리고 구현메서드도 있는데 예를 들어 Animal 클래스를 상속받은 클래스가 고양이, 개 ,하마 정도가 있다고 하면 고양이, 개, 하마는 모두 공통적으로 잠을 자므로 굳이 재정의를 하지 않고 부모 클래스의 sleep()을 그대로 쓴다.

 

이렇게 추상클래스는 추상메서드와 구현메서드가 있고 서로 기능이 비슷한 클래스를 말한다

 

이에 대비되는 개념으로는 서로 기능이 다른 클래스를 인터페이스라고 한다

인터페이스는 구현메서드가 없고 100% 추상메서드로만 구성되어있다 

package test;

abstract class Animal {
	
	public abstract void eat();  //추상메서드
	
	public void sleep() {  //구현메서드
		System.out.println("밤에는 잔다");  
	}
}



public class Cat extends Animal{
	
	public void eat() {
		System.out.println("고양이가 밥을 먹다");
	}
	
	 public static void main(String[] args) {
	  Animal cat1=new Cat();
	  cat1.eat();
	  cat1.sleep();
	 }
}

 

자바는 어렵게 출제가 되지 않으므로 이정도로 마무리하도록 하겠다.

이정도 공부했으면 기출문제를 풀고 개념을 다시 확인해보면 될 것이다


[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)

 

[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)


목차

1. 객체 생성

2. 객체 생성시 메모리 구조(heap 영역)

3. 생성자

4. 접근제어자


*이 게시글에서는 속성=필드=객체변수=인스턴스 변수=멤버변수라고 불리는 것을 객체 변수라고 통일하겠다.

 

1. 객체 생성

앞선 2탄에서 클래스, 객체, 메서드, 메모리 구조에 대해 살펴 보았다. 

클래스는 책을 예를 들어 책이라는 자료형을 만들기 위해 구성요소(제목, 가격, 출판사, 저자등)를 하나로 합쳐놓은 것이다. 

책이라는 객체의 구성요소를 사용하기 위해 책이라는 자료형을 클래스로 만들었다면 그 구성요소를 이용해서 다양한 책(객체)을 만들어야 하지 않겠는가

자바에서는 Book science = new Book(); 이런 형태로 객체를 만들 수 있다.

이렇게 클래스를 이용해서 만든 객체 여기서는 science를 인스턴스라고 한다.

 

클래스는 붕어빵 틀, 객체는 붕어빵1,2 ... 이라고 생각하면 된다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
    }
}

science앞에 붙은 Book은 int, String처럼 Book이라는 자료형이라는 표시이므로

Book자료형 science를 선언한다는 의미이다.

Book science는 int a와 동일한 형태이다

뒤에 붙은 new Book()에서 new는 새로만들어진다는 예약어이고 뒤에 나오는 Book()은 생성자(Constructor)라고 불리는 녀석이다. 

Book science = new Book()은 즉 science라는 책 객체를 만든다는 의미인 것이다.

생성자얘기는 나중에 하고 우선 객체를 생성할 때 메모리에 어떻게 동작되는지 알아보자.


2. 객체 생성시 메모리 구조(heap영역)

살짝 복습하면 static이라고 붙은 메서드를 로딩하는데 거기서 제일 먼저 로딩되는 것이 main메서드이다. 위의 코드를 예를 들어 Test class의 main메서드가 제일 먼저 메모리에 로드돼서 호출된다.

호출되면 stack 영역에 들어가는데 이 메인메서드 안에는 Book science라는 변수가 선언돼있다. 

이때 science라는 변수를 참조변수라고 한다.(참조변수이긴 하지만 동시에 지역변수이기도 하다)

참조변수는 주소값을 저장한다.

C언어의 포인터 생각하면 된다.

출처 : [Java] 참조 타입과 참조 변수 :: 불곰 (tistory.com)

 

 

Book science를 선언하고 new 예약어와 함께 Book()이라는 생성자를 호출하면 Heap영역이라는 메모리 공간에 science라는 객체가 하나 생성된다. 

science라는 참조변수는 Heap 영역에 있는 science객체의 주소를 가리킨다.

 

science 객체 안에는 이런식으로 객체가 만들어져있고 science라는 참조변수는 Book객체(science)의 주소를 가리킨다.

여기서 getTitle()이라는 메서드는 실제 위치는 method 영역에 들어있지만 getName() 메서드의 주소로 메서드 영역의 getTitle()과 연결돼있다.

최종적으로 정리하면 Book science = new Book()이라고 하면 heap영역에 science객체(인스턴스)가 생성되고 science라는 참조변수는 heap영역의 science 객체(인스턴스)의 주소를 가리킨다

 

이렇게 객체를 생성하고 나면 그 객체의 이름인 참조변수를 이용해 객체 변수와 메서드를 사용할 수 있다

 

위의 예문 처럼 science.title 이렇게 도트 연산자를 이용해  각 객체의 객체변수와 메서드에 접근할 수 있게 된다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
        science.title="개미와배짱이";
        System.out.println(science.title);  //개미와배짱이 출력
        System.out.println(science.getTitle()); //개미와배짱이 출력
    }
}

 

앞에서 봤던 아래 예문도 객체를 이용하면 hello메서드를 static 예약어 없이 호출가능하다

 

*static 포함한 경우

package test;

public class Test {

	public static void main(String[] args) {
		int a=3;
		System.out.println(hello(a));
		System.out.println(a);
	

	}
	public static int hello(int a) {
		a=7;
		return a;
	}
}

 

*static을 사용하지 않은 경우

package test;

public class Test {

	public static void main(String[] args) {
		int a=3;
		Test test1 = new Test();
		System.out.println(test1.hello(a));
		System.out.println(a);
	

	}
	public int hello(int a) {
		a=7;
		return a;
	}
}

3. 생성자(Constructor)

Book science = new Book();에서

new 예약어 뒤에 붙은 Book()을 생성자라고 한다

 

생성자가 하는 일은 객체(인스턴스)를 heap영역에 생성하고 클래스 안에 Book() 생성자의 {}중괄호를 호출하는 역할을 하는데 객체가 생성될 때 객체 변수 값들을 초기화하는 역할도 한다

즉, science의 title과 english의 title은 다르게 설정된다는 것이다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  
  public Book() {} //기본 생성자

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
    }
}

 

생성자는 객체를 생성할 때만 호출되는데 생성자 이름은 클래스 이름과 같고 반환값이 없다

생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만들어주는데 이렇게 자동으로 생성되는 생성자를 기본 생성자(default constructor)이라고 한다

 

개발자가 매개변수가 있는 생성자를 따로 만들면 자동으로 기본 생성자가 생성이 되지 않아 기본생성자를 만들어줘야 한다

아래에 public Book(String title){}이 바로 매개변수가 있는 생성자이다

 

이렇게 클래스에 생성자가 두 개 이상 제공되는 경우를 생성자 오버로딩이라고 한다

 

자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있는데 이를 오버로딩이라고 한다

 

아래에 나오는 this라는 예약어는 객체 자신을 가리키는 예약어인데 우선 이런게 있다고 알고 넘어가자.

 

아무튼 자바의 한 클래스내에 생성자가 두 개 이상이 있으면 인스턴스를 생성할 때 원하는 생성자를 골라서 만들 수 있다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  
  public Book() {} //기본 생성자
  public Book(String title) {
  this.title=title;
  } 

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
    }
}

4. 접근제어자(access modifier)

자바에서는 예약어를 사용해서 클래스 내부의 변수, 메서드, 생성자에 대한 접근 권한을 지정할 수 있다.

이런 예약어를 접근 제어자라고 한다

접근제어자에는 private, protected, default, public 이렇게 4종류가 있다

 

다른 건 그냥 넘어가고 private만 살펴보자

출처  : 19편. 제어자(Modifiers) (hexabrain.net)

 

 

위 코드의 객체 변수 String title에 접근 제어자를 private으로 바꾸면 동일한 클래스를 제외하고는 이 변수에 직접적으로 접근할 수 없다

그래서 이를 접근하기 위해서는 메서드를 만들면 된다.

 

직접적으로 접근을 할 수 없으니 Book 제목을 받아오거나 지정할 수 있도록 메서드를 사용한다. 

package test;

class Book {
  private String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  public void getTitle(String title){
	  this.title= title;
	  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        //science.title="바보"; //오류발생 //접근 불가
        science.getTitle("안녕");
        System.out.println(science.getTitle());
    }
}

 

정보처리기사 실기에서는 어차피 거의 대부분이 동일한 클래스로 나오므로 사실 잘 몰라도 상관없다

위의 코드는 getTitle이라는 메서드가 오버로딩돼있는 것인데

getTitle을 호출할 때 매개변수가 없으면 public String getTitle()을 호출하는 것이고

매개변수가 있으면 public String getTitle(String title)을 호출하는 것이다

 


[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)

+ Recent posts