{
  "title": "프로그래밍 개념 심화 O/X",
  "description": "언어·패러다임·개발 원리",
  "languageCode": "ko",
  "cards": [
    {
      "type": "ox",
      "prompt": "객체지향 프로그래밍의 캡슐화는 데이터와 그 데이터를 다루는 메서드를 하나의 단위로 묶는 개념이다.",
      "answer": true,
      "explanation": "캡슐화는 상태와 동작을 객체로 묶고 내부 구현을 감춰 접근을 통제하는 개념입니다."
    },
    {
      "type": "ox",
      "prompt": "재귀 함수는 자기 자신을 호출하는 함수로, 종료 조건이 없으면 무한히 호출될 수 있다.",
      "answer": true,
      "explanation": "재귀는 자기 호출로 문제를 푸는 방식이며, 기저(종료) 조건이 없으면 스택 오버플로가 날 수 있습니다."
    },
    {
      "type": "ox",
      "prompt": "변수의 유효 범위(스코프)는 그 변수가 접근 가능한 코드 영역을 의미한다.",
      "answer": true,
      "explanation": "스코프는 변수·식별자가 참조될 수 있는 프로그램 영역을 규정합니다."
    },
    {
      "type": "ox",
      "prompt": "컴파일 언어는 실행 전에 기계어로 번역되고, 인터프리터 언어는 실행 시점에 한 줄씩 해석된다.",
      "answer": true,
      "explanation": "컴파일 방식은 사전 번역, 인터프리터 방식은 실행 중 해석이라는 차이가 있습니다."
    },
    {
      "type": "ox",
      "prompt": "함수형 프로그래밍에서 '순수 함수'는 같은 입력에 항상 같은 출력을 내고 부작용이 없다.",
      "answer": true,
      "explanation": "순수 함수는 입력이 같으면 출력이 같고 외부 상태를 바꾸지 않는 함수입니다."
    },
    {
      "type": "ox",
      "prompt": "Git에서 커밋(commit)은 변경 사항을 저장소 이력에 기록하는 작업이다.",
      "answer": true,
      "explanation": "커밋은 스테이징된 변경을 하나의 스냅샷으로 저장소 이력에 기록합니다."
    },
    {
      "type": "ox",
      "prompt": "상속(inheritance)은 두 클래스가 서로 아무런 관계 없이 완전히 독립적으로 정의되는 것을 의미한다.",
      "answer": false,
      "explanation": "상속은 부모 클래스의 속성과 동작을 자식 클래스가 물려받아 재사용·확장하는 관계입니다."
    },
    {
      "type": "ox",
      "prompt": "C, 자바, 파이썬 등 대부분의 언어에서 배열의 첫 번째 원소 인덱스는 1이다.",
      "answer": false,
      "explanation": "이들 언어에서 배열 인덱스는 0부터 시작하므로 첫 원소의 인덱스는 1이 아니라 0입니다."
    },
    {
      "type": "choice",
      "prompt": "변수, 반복문, 조건문 등 프로그램의 논리를 사람이 이해하기 쉽게 서술한 것을 무엇이라 하나요?",
      "choices": [
        "의사코드(슈도코드)",
        "기계어",
        "바이너리",
        "어셈블리"
      ],
      "answer": 1,
      "explanation": "의사코드는 특정 언어 문법에 얽매이지 않고 알고리즘 논리를 표현한 것입니다."
    },
    {
      "type": "choice",
      "prompt": "다음 중 객체지향의 4대 특징에 해당하지 않는 것은?",
      "choices": [
        "재귀",
        "캡슐화",
        "상속",
        "다형성"
      ],
      "answer": 1,
      "explanation": "객체지향의 4대 특징은 캡슐화, 상속, 다형성, 추상화이며 재귀는 포함되지 않습니다."
    },
    {
      "type": "text",
      "prompt": "프로그램의 오류나 결함을 뜻하며, 이를 찾아 고치는 과정을 '디버깅'이라 부르게 한 용어는?",
      "answers": [
        "버그",
        "bug",
        "결함"
      ],
      "explanation": "버그는 프로그램의 오류를 뜻하며, 이를 제거하는 작업을 디버깅이라고 합니다."
    },
    {
      "type": "text",
      "prompt": "여러 개발자가 코드 변경 이력을 관리하고 협업하도록 돕는 분산 버전 관리 시스템으로, 깃허브의 기반이 되는 것은?",
      "answers": [
        "git",
        "깃",
        "Git"
      ],
      "explanation": "Git은 리누스 토르발스가 개발한 분산 버전 관리 시스템으로 협업과 이력 관리에 널리 쓰입니다."
    },
    {
      "type": "ox",
      "prompt": "다형성(polymorphism)은 같은 이름의 메서드가 객체에 따라 다르게 동작할 수 있음을 뜻한다.",
      "answer": true,
      "explanation": "다형성은 동일한 인터페이스(메서드 이름)로 객체마다 다른 동작을 수행하게 하는 객체지향의 핵심 특징입니다."
    },
    {
      "type": "ox",
      "prompt": "주석(comment)은 프로그램의 실행 결과에 직접 영향을 준다.",
      "answer": false,
      "explanation": "주석은 실행 시 무시되며, 코드를 읽는 사람을 위한 설명입니다. 실행 결과에는 영향을 주지 않습니다."
    },
    {
      "type": "choice",
      "prompt": "다음 중 반복을 수행하는 구문이 아닌 것은?",
      "choices": [
        "for",
        "while",
        "if",
        "do-while"
      ],
      "answer": 3,
      "explanation": "if는 조건에 따라 실행 여부를 나누는 조건문이고, for·while·do-while은 반복문입니다."
    },
    {
      "type": "ox",
      "prompt": "무한 루프는 종료 조건이 충족되지 않아 반복이 끝나지 않는 상태를 말한다.",
      "answer": true,
      "explanation": "반복문의 종료 조건이 영원히 거짓이 되지 않으면 무한 루프에 빠져 프로그램이 멈추지 않습니다."
    },
    {
      "type": "ox",
      "prompt": "라이브러리는 한 번 쓰고 버리는 일회용 코드 모음이라 재사용할 수 없다.",
      "answer": false,
      "explanation": "라이브러리는 여러 프로그램에서 재사용하도록 미리 만들어 둔 코드 모음입니다. 재사용이 핵심 목적입니다."
    },
    {
      "type": "text",
      "prompt": "'같은 코드를 반복해서 작성하지 말라'는 프로그래밍 원칙으로, Don't Repeat Yourself의 약자는?",
      "answers": [
        "DRY",
        "dry",
        "드라이"
      ],
      "explanation": "DRY 원칙은 중복 코드를 피하고 하나의 지식은 한 곳에만 표현하라는 소프트웨어 설계 원칙입니다."
    },
    {
      "type": "ox",
      "prompt": "API는 프로그램들이 서로 기능을 주고받을 수 있도록 정해 둔 인터페이스다.",
      "answer": true,
      "explanation": "API(Application Programming Interface)는 프로그램이 다른 프로그램의 기능을 정해진 방식으로 사용할 수 있게 하는 약속입니다."
    },
    {
      "type": "ox",
      "prompt": "형변환(type casting)은 변수의 이름을 다른 이름으로 바꾸는 작업이다.",
      "answer": false,
      "explanation": "형변환은 값의 자료형을 다른 자료형으로 바꾸는 것입니다. 예를 들어 문자열 \"10\"을 숫자 10으로 바꾸는 것이 형변환입니다."
    },
    {
      "type": "choice",
      "prompt": "함수가 작업을 마친 뒤 호출한 곳으로 값을 돌려줄 때 사용하는 키워드는?",
      "choices": [
        "return",
        "break",
        "continue",
        "import"
      ],
      "answer": 1,
      "explanation": "return은 함수의 실행을 끝내고 결과값을 호출한 곳으로 반환하는 키워드입니다."
    },
    {
      "type": "ox",
      "prompt": "단위 테스트(unit test)는 함수나 모듈 같은 작은 단위가 올바르게 동작하는지 검증하는 테스트다.",
      "answer": true,
      "explanation": "단위 테스트는 프로그램을 작은 단위로 나누어 각각 기대대로 동작하는지 자동으로 검증하는 방법입니다."
    },
    {
      "type": "ox",
      "prompt": "하드코딩은 설정값을 나중에 쉽게 바꿀 수 있도록 코드 밖으로 분리하는 좋은 습관이다.",
      "answer": false,
      "explanation": "하드코딩은 값을 코드에 직접 박아 넣는 것으로, 수정과 유지보수를 어렵게 합니다. 설정값은 분리하는 것이 좋은 습관입니다."
    },
    {
      "type": "text",
      "prompt": "변수 이름을 'userName'처럼 첫 단어는 소문자로 쓰고 이어지는 단어의 첫 글자만 대문자로 쓰는 표기법은? (낙타 등 모양에 비유)",
      "answers": [
        "카멜 케이스",
        "카멜케이스",
        "camelCase",
        "camelcase",
        "camel case",
        "카멜 표기법"
      ],
      "explanation": "카멜 케이스(camelCase)는 대문자가 낙타의 혹처럼 솟아 보인다고 해서 붙은 이름으로, 변수·함수 이름에 널리 쓰입니다."
    },
    {
      "type": "ox",
      "prompt": "리팩터링은 프로그램의 동작은 그대로 유지하면서 코드 구조를 개선하는 작업이다.",
      "answer": true,
      "explanation": "리팩터링은 기능 변경 없이 중복 제거·이름 개선 등으로 코드를 읽기 쉽고 고치기 쉽게 다듬는 작업입니다."
    },
    {
      "type": "ox",
      "prompt": "논리 오류(logic error)는 문법이 틀려서 프로그램이 아예 실행되지 않는 오류다.",
      "answer": false,
      "explanation": "논리 오류는 프로그램이 실행은 되지만 잘못된 결과를 내는 오류입니다. 실행 자체를 막는 것은 문법(구문) 오류입니다."
    },
    {
      "type": "choice",
      "prompt": "여러 개발자가 서로의 코드를 검토하며 결함을 찾고 품질을 높이는 활동은?",
      "choices": [
        "컴파일",
        "배포",
        "백업",
        "코드 리뷰"
      ],
      "answer": 4,
      "explanation": "코드 리뷰는 동료가 작성한 코드를 함께 검토해 버그를 조기에 찾고 코드 품질과 지식 공유를 높이는 활동입니다."
    },
    {
      "type": "ox",
      "prompt": "배열(array)은 같은 형식의 여러 값을 순서대로 담는 자료형이다.",
      "answer": true,
      "explanation": "배열은 같은 타입의 값들을 연속된 순서(인덱스)로 저장해 하나의 이름으로 다루게 해 줍니다."
    },
    {
      "type": "ox",
      "prompt": "객체지향에서 인스턴스(instance)는 클래스를 만들기 위한 설계도다.",
      "answer": false,
      "explanation": "반대입니다. 클래스가 설계도이고, 인스턴스는 그 설계도로 만들어진 실제 객체입니다."
    },
    {
      "type": "text",
      "prompt": "프로그램이 더 이상 사용하지 않는 메모리를 자동으로 찾아 회수하는 기능은? (영어 약자 GC)",
      "answers": [
        "가비지 컬렉션",
        "가비지컬렉션",
        "가비지 콜렉션",
        "garbage collection",
        "쓰레기 수집"
      ],
      "explanation": "가비지 컬렉션(garbage collection)은 쓰이지 않는 메모리를 런타임이 자동 회수하는 기능으로, 자바·파이썬 등이 지원합니다."
    },
    {
      "type": "ox",
      "prompt": "버전 관리 시스템에서 브랜치(branch)는 저장소를 완전히 삭제하는 기능이다.",
      "answer": false,
      "explanation": "브랜치는 기존 이력에서 갈라져 나와 독립적으로 작업할 수 있게 하는 분기 기능입니다. 삭제와는 무관합니다."
    },
    {
      "type": "ox",
      "prompt": "매개변수(parameter)는 함수가 호출될 때 전달받는 값을 담는 변수다.",
      "answer": true,
      "explanation": "매개변수는 함수 정의부에서 입력값을 받는 변수이며, 호출 시 넘기는 실제 값은 인자(argument)라고 합니다."
    },
    {
      "type": "choice",
      "prompt": "프로그램을 한 줄씩 멈춰 가며 실행 흐름과 변수 값을 확인할 수 있는 개발 도구는?",
      "choices": [
        "컴파일러",
        "디버거",
        "링커",
        "프로파일러"
      ],
      "answer": 2,
      "explanation": "디버거는 중단점을 걸어 실행을 멈추고 변수 값과 흐름을 관찰하며 오류의 원인을 찾는 도구입니다."
    },
    {
      "type": "ox",
      "prompt": "코드 줄 수가 짧을수록 프로그램의 실행 속도도 항상 더 빠르다.",
      "answer": false,
      "explanation": "실행 속도는 알고리즘의 효율(시간복잡도)에 좌우됩니다. 짧은 코드라도 비효율적인 알고리즘이면 느릴 수 있습니다."
    },
    {
      "type": "ox",
      "prompt": "예외 처리(exception handling)를 사용하면 오류가 발생해도 프로그램이 갑자기 종료되는 것을 막을 수 있다.",
      "answer": true,
      "explanation": "try-catch 같은 예외 처리 구문은 실행 중 발생한 오류를 붙잡아 대처하게 해 프로그램의 비정상 종료를 막습니다."
    },
    {
      "type": "text",
      "prompt": "프로그래밍을 처음 배울 때 가장 먼저 출력해 보는 고전적인 첫 예제 문구는 '___, World!'다. 빈칸에 들어갈 영어 단어는?",
      "answers": [
        "Hello",
        "hello",
        "헬로",
        "헬로우"
      ],
      "explanation": "'Hello, World!'는 1978년 C 언어 교재에서 유래한 전통적인 첫 프로그램 예제입니다."
    }
  ]
}
