INFO

  • ⚡ = 벼락치기에서 강조한 내용
  • ❌ = 기출 중에 틀린 개념
  • ✖️ = 최신 기출 중 틀린 개념

참고자료

벼락치기

정보처리기사 실기 50분 벼락치기 특강💚 정보시스템 | 해커스자격증 양문자정보처리기사 합격하고 수강료 300% 환급받기 https://gouk.kr/AOI81i해커스 정보처리기사 전 강좌 무료 배포💻https://gouk.kr/4Xn0CF정보처리기사 교재 무료로 체험하기📕https://gouk.kr/PHI4CY양문자 선생님의 50분 컷 벼락치기 특강...www.youtube.com

총정리

프로그래밍 기초

아스키

문자ASCII 값설명
'\0'0널 문자 (C 문자열 끝 표시)
'A'65대문자 시작
'Z'90대문자 끝
'a'97소문자 시작
'z'122소문자 끝
'0'48숫자 문자 시작
'9'57숫자 문자 끝

정보보안

세션 하이재킹 ⚡

  • 공격자가 정상 사용자의 세션 ID를 탈취하여 이를 재사용함으로써 인증된 사용자로 가장하는 공격이다.
  • TCP 3-Way Handshake 이후 세션 ID를 받는데 공격자가 세션 정보를 중간에서 탈취하는 것이다.
  • 예방 방법
    • HTTPS 사용
    • 쿠키/세션 토큰 보안 설정 (HttpOnly, Secure, SameSite)
    • 세션 관리 강화 (만료, 재발급, 동시접속 제한)
    • 안전한 네트워크 사용 (공용 Wifi 주의, VPN 사용)

스니핑 ⚡❌

  • 몰래 듣는 것
  • 네트워크 패킷을 몰래 도청/수집
  • 수동적 공격

Watering Hole ❌ ✖️

  • 공격 대상이 자주 방문하는 사이트를 감염
  • 대상이 방문하도록 기다렸다가 공격

TCP 하이재킹 ⚡

  • TCP 3-Way Handshake 중간 과정에서 탈취하는 것이다.

해시 함수 ✖️

  • 단방향 함수: 복호화가 불가능합니다.
  • 충돌 저항: 서로 다른 입력에 대해 동일한 해시 값을 생성하지 않습니다.
  • 아무리 큰 숫자를 넣더라도 해시 값은 고정된 길이를 가집니다.

TKIP (Temporal Key Integrity Protocol) ❌

  • 무선 LAN 보안 프로토콜
  • 임시 키 무결성 프로토콜
  • 주요 핵심
    • 키 믹싱: 패킷마다 키를 동적으로 바꿔 WEP처럼 같은 키 흐름이 반복되는 문제를 줄입니다.
    • MIC(Message Integrity Check): 메시지 무결성 검사를 붙여 패킷 위조와 변조를 탐지합니다.

CIA – 정보 보호에서 가장 기본이 되는 3요소 ❌

요소영문의미파괴되었을 때의 예
기밀성Confidentiality인가된 사용자만 정보에 접근외부인이 고객 DB를 훔쳐봄 (유출)
무결성Integrity정보가 변경·손상되지 않음해커가 성적 데이터를 조작 (위변조)
가용성Availability필요할 때 정보에 접근 가능DDoS로 서비스가 다운됨 (차단)

–> CIA 3요소 중 가용성을 운영 차원에서 숫자로 표현한 개념이 RTO(장애 후 복구 시간), RPO(손실 허용 데이터 양)

ISMS (Information Security Management System) ✖️

  • 정보자산을 보호하기 위해 구축·운영하는 정보보호 관리체계
  • 정책 수립 → 실행 → 점검 → 개선 사이클로 운영하는 프레임워크 (단순 기술 도입이 아님)

탐지·대응 보안 솔루션 – SIEM (Security Information Event Management) ✖️

  • 보안 정보 및 이벤트 관리

  • SIEM은 조직 내 모든 보안 장비·서버·애플리케이션의 로그와 이벤트를 한 곳에 모아 상관 분석 하는 솔루션

  • 핵심 기능: 로그 수집 → 정규화 → 상관 분석 → 경고 발생 → 규정 준수 보고서

공격 기법 – 서비스 거부 및 위장 공격 ⚡

  • 스푸핑(Spoofing) : 공격자가 자신을 다른 사람이나 시스템으로 속여서 신뢰를 얻거나 시스템을 접근하는 공격 기법
  • SYN Flooding : TCP 3-way 핸드셰이크를 악용하여 SYN 패킷만 대량 전송해 서버 자원을 고갈시키는 서비스 거부 공격
  • 디도스(DDoS) : 다수의 공격자가 동시에 트래픽을 발생시켜 공격
  • Slowloris : HTTP 연결을 장시간 유지하여 서버의 동시에 발생

공격 기법 – 악성 코드 ⚡

  • 웜: 스스로를 복제하고 다른 네트워크로도 퍼져나감
  • 랜섬웨어: 파일을 암호화 후 금전을 요구
  • 백도어: 공격자가 직접 소프트웨어에 몰래 설치
  • 트로이 목마: 정상적인 프로그램으로 위장하여 사용자가 직접 실행 및 설치를 유도

웹 서비스

웹 서비스 인터페이스

용어키워드
SOAPXML 기반 메시지, 원격 프로시저 호출, 엄격한 규칙, 프로토콜 (메세지 교환 + XML)
RESTURI 자원 식별, HTTP 메서드, 아키텍처 스타일, JSON 데이터 형식
WSDL ❌웹 서비스 명세, XML 형식, 기능/파라미터/데이터타입 기술 (웹 + XML)
UDDI웹 서비스 검색, 등록, 전화번호부 역할, 서비스 디렉토리
JSON가벼운 데이터 형식, 빠른 교환, REST 주요 형식

데이터베이스

데이터 모델 구성요소

용어키워드
Attribute데이터 항목, 데이터 필드
Tuple릴레이션의 행, 레코드, (속성) 중복된 값 포함 가능
Relation Instance특정 시점 실제 데이터, 릴레이션 외연
카디널리티(Cardinality)튜플의 개수
차수(Degree)속성의 개수
Domain속성이 가질 수 있는 값의 범위

관계 대수

관계 대수는 관계형 데이터베이스에서 원하는 데이터를 찾는 방법을 기술하는 절차적 정형 언어입니다. 하나 이상의 릴레이션(테이블)을 입력으로 받아 결과적으로 새로운 릴레이션을 생성하는 연산들의 집합으로 구성됩니다.

연산자기호설명
합집합∪두 릴레이션의 튜플을 모두 포함하는 릴레이션을 반환합니다. (중복 제외)
교집합∩두 릴레이션에 공통으로 존재하는 튜플만으로 구성된 릴레이션을 반환합니다.
차집합-첫 번째 릴레이션에는 속하지만 두 번째 릴레이션에는 속하지 않는 튜플을 반환합니다.
카티션 프로덕트×두 릴레이션의 튜플들을 순서쌍으로 조합하여 만들 수 있는 모든 튜플을 반환합니다.
연산자기호설명
셀렉트 (Select)σ(Sigma)릴레이션에서 주어진 조건을 만족하는 튜플(행)만으로 구성된 수평적 부분집합을 반환합니다.
프로젝트 (Project)π(Pi)릴레이션에서 주어진 애트리뷰트(열)만으로 구성된 수직적 부분집합을 반환합니다. (중복 제외)
조인 (Join)⋈(Bowtie)공통 애트리뷰트를 기준으로 두 릴레이션을 결합하여 새로운 릴레이션을 반환합니다.
디비전 (Division) ❌÷A ÷ B는 B의 모든 튜플에 대해 관계를 맺고 있는 A의 튜플을 반환합니다.

관계 해석 ✖️

관계 해석은 원하는 데이터가 무엇(What) 인지만 기술하고 그것을 얻는 절차는 DBMS에 맡기는 **비절차적 언어**입니다. 수학의 술어 논리(Predicate Calculus) 에 기반을 두며, 관계형 데이터베이스를 제안한 E. F. Codd 가 함께 제시했습니다.

데이터베이스 무결성 종류 요약 ⚡✖️

구분SQL 구현설명
개체 무결성 ⭐PRIMARY KEY기본키는 NULL 값을 가질 수 없으며, 릴레이션 내에서 유일해야 합니다.
참조 무결성 ⭐FOREIGN KEY외래키 값은 참조 릴레이션의 기본키 값이거나 NULL이어야 합니다.
도메인(속성) 무결성 ⭐DOMAIN, CHECK, DEFAULT속성 값은 정의된 도메인(데이터 타입, 범위 등)에 속해야 합니다.
사용자 무결성TRIGGER사용자가 비즈니스 규칙에 맞게 직접 정의하는 무결성 조건입니다.
키 무결성UNIQUE하나의 릴레이션에는 적어도 하나의 키가 존재해야 합니다.

정규화 ✖️

정규형핵심 조건제거 대상
1NF (제1정규형)모든 속성 값은 원자값(Atomic Value) 이어야 한다.다중값 속성
2NF (제2정규형) ✖️1NF를 만족하고, 부분 함수 종속을 제거해야 한다. (완전 함수 종속)부분 함수 종속
3NF (제3정규형) ✖️2NF를 만족하고, 이행 함수 종속을 제거해야 한다.이행 함수 종속
BCNF (보이스-코드 정규형)3NF를 만족하고, 모든 결정자가 후보키여야 한다.후보키가 아닌 결정자
4NF (제4정규형)BCNF를 만족하고, 다치 종속(Multi-valued Dependency) 을 제거해야 한다.다치 종속
5NF (제5정규형)4NF를 만족하고, 조인 종속(Join Dependency) 이 후보키를 통해서만 성립되어야 한다.조인 종속

네트워크

네트워크 전송 방식: 패킷 교환 vs 서킷 교환

용어키워드
가상 회선 (Virtual Circuit)논리적인 통신 경로를 미리 설정, 연결형 교환 방식, 목적지와 미리 연결
데이터그램 (Datagram)비연결형 교환 방식, 순서에 무관하게 독립적으로 전송, 헤더를 붙여 개별 전달
패킷 교환 방식 (Packet Switching)전송단위는 패킷, 네트워크 계층에서 처리, 회선 효율성 높음
서킷 교환 방식 (Circuit Switching)전송단위는 비트 스트림, 전용 회선 설정, 일정한 대역폭 보장

중요도 떨어짐, 해당 링크 참고

HDLC 프레임

  • I = Information = 정보
  • S = Supervisory = 감독
  • U = Unnumbered = 비번호

  • NRM = Normal Response Mode = 정규 응답 모드
  • ABM = Asynchronous Balanced Mode = 비동기 균형 모드
  • ARM = Asynchronous Response Mode = 비동기 응답 모드

IP 계산 문제 ⚡

IP 주소가 192.168.35.10, 서브넷이 255.255.252.0

  • 서브넷을 2진수를 변환
  • 호스트 비트의 개수는? → 0의 개수 세기
    • 호스트 비트의 수가 6이라면, 네트워크에서 사용 가능한 호스트 수는 개이다.
  • 네트워크 주소는? → IP 주소 AND (서브넷 마스크)
  • 브로드캐스트 주소는? → IP 주소 OR (서브넷 마스크의 비트 반전)

소프트웨어 설계

결합도 – 내공외제스자, 내공을 위해 외제를 쓰자 ⚡

  • 낮을수록 좋음, 내용 결합도가 가장 높으며 자료 결합도가 가장 낮음
유형핵심 키워드
내용다른 모듈 내부 변수나 기능 직접 사용
공통전역 변수 참조 및 갱신
외부외부 데이터 형식, 통신 프로토콜 공유, 데이터 포맷
제어제어 요소 전달
스탬프 ⭐자료구조 전달 (배열, 오브젝트, 스트럭처)
자료최소한의 데이터만 파라미터로 주고받음

응집도 – 우논시절통순기, 우리 놀던 시절 통 순수했던 기억 뿐이네 ⚡

  • 높을수록 좋음, 기능적 응집도가 가장 높으며 우연적 응집도가 가장 낮음
응집도 유형핵심 키워드
기능적단일 목적
순차적 ✖️이전 기능의 출력을 다음 기능의 입력으로 사용, 기능간의 의존성
통신적(교환적) ✖️동일한 입력 및 출력 데이터, 처리 순서는 상관 없으나 동일한 자료를 사용
절차적입출력 간 연관성은 없으나 순서에 따라 실행 (단순 줄세우기)
시간적특정 시간에 함께 실행
논리적유사한 성격, 특정 분류
우연적아무런 관련이 없음

디자인 패턴 ⭐

디자인 패턴 – 생성 패턴 ⚡

생성 패턴기출 키워드
싱글톤 패턴(Singleton) ⭐객체 하나만 생성, 어디서든 참조, 특정 클래스의 인스턴스가 오직 하나임을 보장
팩토리 메서드 패턴(Factory Method)상위 클래스 - 인터페이스만 정의, 서브 클래스 - 실제 생성 담당
빌더 패턴(Builder)조립 + 분리, 복잡한 객체를 생성하는 과정을 단게별로 분리
프로토타입 패턴(Prototype)기존 객체를 복제하여 새로운 객체를 생성
앱스트랙트 팩토리 패턴(Abstract Factory) ⭐조합을 만드는 인터페이스(API) 제공, Kit이라고 불림.

디자인 패턴 – 구조 패턴 ⚡

구조 패턴기출 키워드
어댑터 패턴(Adapter) ⭐서로 다른 인터페이스 연결, 기존 클래스 재사용할수 있도록 중간에서 맞춰주는 역할
데코레이터 패턴(Decorator)기능 추가 + 확장
퍼사드 패턴(Facade)복잡한 서브시스템에 대한 간단한 통합 인터페이스 제공, 오류 단위 확인
프록시 패턴(Proxy) ⭐객체의 대리자가 대신 처리
브리지 패턴(Bridge)기능은 클래스로/구현은 클래스 연결, 추상 계층 분리
플라이웨이트 패턴(Flyweight)가상 인스턴스/ 가상화, 많은 수의 객체들을 효율적으로 관리하기 위해 객체의 공유를 통해 메모리 사용량을 줄이기
컴포지트 패턴(Composite)객체들을 트리 구조로 구성하여 ‘부분-전체’ 계층을 표현, 대표 예시: 파일 시스템

디자인 패턴 – 행위 패턴 ⚡

행위 패턴키워드
전략 패턴(Strategy) ⭐알고리즘 동적 교체 (조건문이 많을 때 주로 사용)
옵저버 패턴(Observer) ⭐한 객체 바뀌면 의존하는 다른 객체에 연락 가고 자동 갱신
중재자 패턴(Mediator) ⭐ ❌객체 간 중재자, 객체지향 목표 달성하게 해줌
방문자 패턴(Visitor)메서드가 각 클래스 돌아다님, 새로운 기능(연산)만 따로 추가할때 사용
이터레이터 패턴(Iterator)컬렉션 내 모든 요소 순차 탐색, Cursor
상태 패턴(State)원시코드 수정 취소, 상태 캡슐화
인터프리터 패턴(Interpreter)특정 언어 문법 정의, 그 문법으로 작성된 문장을 해석
메멘토 패턴(Memento)복구, Undo 기능, 객체 정보 저장
커맨드 패턴(Command)요청 그 자체를 객체로 캡슐화, 재사용성, 기능 캡슐화
책임 연쇄 패턴(Chain of Responsibility)하드코딩(기능 처리 연결 변경 불가) -> 연결 변경 가능하게 디자인
요청이 들어오면 체인을 따라 순서대로 처리 기회를 넘기는 패턴
템플릿 메서드 패턴(Template Method)상위 클래스 - 추상 메서드(기능의 골격) , 하위 클래스 - 세부처리 구체화

럼바우 객체 모델링

럼바우(Rumbaugh) 객체 모델링은 OMT(Object Modeling Technique)라고도 불리는 객체 지향 분석 및 설계 방법론으로, 시스템을 3가지 관점에서 모델링합니다.

용어키워드
객체(정보) 모델링(Object Modeling)객체, 관계, ER 다이어그램, 객체 다이어그램
동적 모델링(Dynamic Modeling)시간 흐름, 제어 흐름, 동작 순서, 상태 다이어그램
기능 모델링(Functional Modeling)프로세스, 자료 흐름, 처리 과정, 자료 흐름도(DFD)

소프트웨어 테스트

테스트 커버리지 ⚡

  • 커버리지가 높을수록 테스트 품질이 좋다
  • 구문 < 결정 < 조건 < 조건/결정 < 변경조건/결정
커버리지 종류핵심 키워드
구문(문장) 커버리지 (Statement)모든 명령문, 한 번 이상 실행
결정(분기) 커버리지 (Decision/Branch) ❌각 결정문, 참/거짓, 한 번 이상
조건 커버리지 (Condition) ❌결정문 내 각 개별 조건식, 참/거짓
조건/결정 커버리지조건 + 결정 커버리지 모두 만족
변경 조건/결정 커버리지조건 + 결정 커버리지를 모두 만족, 각 개별 조건식이 다른 조건식과 관계 없이 전체 결정문의 결과에 독립적으로 영향을 미치는 경우

블랙박스 테스트 ❌

블랙박스 테스트(Black-box Test) 는 소프트웨어의 내부 구조나 소스 코드를 보지 않고, 오직 요구사항 명세를 보면서 기능이 올바르게 동작하는지를 검사하는 테스트 방법이다.

  1. 동등 분할 테스트 (Equivalence Partitioning)

    • 입력 데이터를 유효값과 무효값 등의 동등한 그룹으로 나누고, 각 그룹의 대표값을 선택하여 테스트하는 기법이다.
    • 모든 값을 테스트하지 않아도 되므로 테스트 케이스를 효율적으로 줄일 수 있다.
  2. 경곗값 분석 테스트 (Boundary Value Analysis)

    • 오류가 발생할 가능성이 높은 입력값의 경계 부분을 집중적으로 테스트하는 기법이다.
    • 일반적으로 동등 분할 후 각 영역의 최솟값, 최댓값 및 그 주변 값을 테스트한다.
    • 예: 유효 범위가 1~100이라면 0, 1, 2, 99, 100, 101 등을 테스트한다.
  3. 원인-결과 그래프 테스트 (Cause-Effect Graphing)

    • 입력 조건인 원인과 출력 결과인 결과 사이의 논리적 관계를 그래프로 표현하여 테스트 케이스를 도출하는 기법이다.
    • 입력과 출력의 관계가 복잡한 경우 효율적인 테스트 케이스를 만드는 데 사용한다.
  4. 결정 테이블 테스트 (Decision Table Testing)

    • 여러 조건과 그에 따른 행동을 표 형태로 정리하여 테스트하는 기법이다.
    • 복잡한 논리적 조건이나 여러 조건의 조합을 체계적으로 테스트하는 데 적합하다.
  5. 상태 전이 테스트 (State Transition Testing)

    • 시스템의 현재 상태와 이벤트에 따른 상태 변화를 기반으로 테스트하는 기법이다.
    • 상태 전이도 또는 상태 전이표를 이용하여 상태 변화가 올바르게 이루어지는지 검사한다.
  6. 오류 예측 테스트 (Error Guessing)

    • 테스터의 경험과 직관을 바탕으로 오류가 발생할 가능성이 높은 부분을 예측하여 테스트하는 기법이다.
    • 기존 테스트 기법에서 발견하기 어려운 오류를 찾기 위한 보완적인 방법으로 사용한다.
  7. 비교 테스트 (Comparison Testing)

    • 동일한 테스트 데이터를 여러 버전이나 유사한 제품에 입력하고 결과를 비교하는 테스트 기법이다.
    • 서로 다른 시스템의 결과를 대조하여 오류나 차이점을 발견한다.
  8. 페어와이즈 테스트 (Pairwise Testing)

    • 여러 입력 파라미터의 모든 조합을 검사하는 대신 각 파라미터 값의 모든 쌍이 최소 한 번씩 조합되도록 테스트하는 기법이다.
    • 조합 폭발 문제를 줄이면서 테스트 케이스 수를 효과적으로 감소시킬 수 있다.
  9. 분류 트리 테스트 (Classification Tree Testing)

    • 입력 조건을 여러 분류와 클래스로 나누고 이를 트리 구조로 표현하여 테스트 케이스를 도출하는 기법이다.
    • 각 클래스의 조합을 통해 체계적으로 테스트 케이스를 구성한다.
  10. 유스케이스 테스트 (Use Case Testing)

    • 사용자의 목표를 달성하기 위한 유스케이스의 흐름을 기반으로 테스트하는 기법이다.
    • 기본 흐름, 대체 흐름, 예외 흐름과 사전·사후 조건 등을 기준으로 시스템의 동작을 검사한다.

테스트 자동화 구성요소

용어키워드
테스트 하네스(Test Harness)소프트웨어 도구, 프레임워크, 테스트 환경 구축, 구성요소 집합
테스트 드라이버(Test Driver)상향식 테스트, 하위 모듈 테스트, 호출하는 모듈, 상위 모듈 역할
테스트 스텁(Test Stub)하향식 테스트, 상위 모듈 테스트, 호출되는 모듈, 더미 모듈
테스트 슈트(Test Suite)테스트 케이스 집합, 묶어놓은 단위, 특정 기능 테스트
테스트 케이스(Test Case)입력값, 실행 조건, 예상 결과, 테스트 최소 단위, 명세
테스트 시나리오(Test Scenario)동작 흐름, 스토리, 여러 케이스 묶음, 로그인 후 글쓰기
테스트 스크립트(Test Script)자동화, 실행 코드, 테스트 케이스 코드화
목 객체(Mock Object)상태 검증, 행위 검증, 정교한 객체, 호출 횟수 확인

테스트 케이스 구성요소

  • 입력값, 테스트 데이터 ❌
  • 실행 조건, 테스트 조건 ❌
  • 예상 결과 ❌
  • 테스트 최소 단위
  • 명세

운영체제

SRT (Shorteset Remaining Time) ⚡

  • 더 짧은 실행 시간을 가진 새로운 프로세스가 도착하면 즉시 새로운 프로세스에 할당
  • 대기 시간 감소, 잦은 문맥 교환으로 오버헤드 발생 가능

RR 스케줄링 ⚡

  • 문제 풀이시 시간 할당량 주의

데이터 통신

오류 검출 방식 – 패리티 체크 ⚡

  • 데이터 뒤에 1비트를 붙여 1의 개수가 짝수/홀수인지 확인

오류 검출 방식 – 체크섬 ⚡

  • 데이터를 일적 단위로 나눠 모두 더한 값을 전송

오류 검출 방식 – 해밍 코드 ⚡

  • 여러 개의 패리티 비트로 오류 위치까지 계산
  • 어디가 틀렸는지 찾아서 고침

Python

깊은 복사

m = [[x] for x in a] # 이중 리스트롤 변환 arr[5] -> arr[5][0]
b = m[:] # 얕은 복사

얕은 복사이기에 메모리를 서로 공유, b가 수정되면 m이 수정된다.

배열

개념설명예시
리스트 선언대괄호로 값을 나열하여 생성x = [1, 2, 3]
인덱스0부터 시작, 음수 인덱스 지원x[0], x[-1]
append리스트 끝에 요소 하나 추가x.append(4)
extend다른 리스트의 요소를 모두 추가x.extend([5, 6])
pop특정 인덱스의 요소를 꺼내고 제거x.pop(0)
reverse리스트를 제자리에서 뒤집기x.reverse()
enumerate인덱스와 값을 함께 반환for i, v in enumerate(x):
슬라이싱범위 지정으로 부분 리스트 추출x[::2], x[::-1]
얕은 복사바깥 리스트만 새로 만듦, 안쪽은 공유b = m[:]
리스트 컴프리헨션한 줄로 리스트 생성[x*2 for x in lst]
len()리스트의 요소 개수 반환len(x)
sum()리스트 요소의 합 반환sum(x)

문자열

개념설명예시결과
문자열 리터럴홑/쌍/삼중 따옴표 모두 동일하게 str'hi' == "hi"True
인덱싱특정 위치의 문자 한 개를 가져옴"PYTHON"[0]P
슬라이싱부분 문자열을 잘라냄 (끝 인덱스 미포함)"PYTHON"[1:4]YTH
split()구분자 기준으로 문자열을 나눠 리스트로 반환"a b".split(' ')['a', 'b']
join()구분자로 이터러블을 이어 붙여 문자열로 반환' '.join(['a', 'b'])'a b'
strip()/replace()/find()양 끝 자르기·치환·인덱스 찾기" hi ".strip()"hi"
input()사용자 입력을 문자열로 받음input()(키보드 입력)
f-string중괄호 안에 변수를 직접 삽입f"{3+4}"7
% 포맷팅형식 지정자로 값을 삽입"%d점" % 100100점
인접 문자열 자동 결합리터럴 두 개가 나란히 있으면 자동 결합"abc" "def""abcdef"

집합

개념설명예시
집합 생성중복 없는 데이터 저장s = {1, 2, 3}
집합 add요소 하나 추가s.add(4)
집합 remove요소 하나 제거s.remove(2)
집합 update여러 요소를 한 번에 추가s.update([5, 6])
교집합 (&)두 집합에 공통으로 있는 요소a & b
합집합 (|)두 집합의 모든 요소a | b
차집합 (-)한 집합에만 있는 요소a - b

SQL

JOIN

SELECT * 
FROM 사원
JOIN 부서 ON 사원.부서ID = 부서.ID;
SELECT * 
FROM 사원
INNER JOIN 부서 ON 사원.부서ID = 부서.ID;
SELECT * 
FROM 사원, 부서 
WHERE 사원.부서ID = 부서.ID;
SELECT *
FROM A CROSS JOIN B;

OUTER JOIN: 한쪽 테이블의 모든 행을 포함, 반대쪽에 일치하는 행이 없으면 NULL로 채움

SELECT *
FROM 사원 LEFT OUTER JOIN 부서
ON 사원.사원번호 = 부서.사원번호;
SELECT *
FROM 테이블1 RIGHT OUTER JOIN 테이블2
ON 테이블1.컬럼 = 테이블2.컬럼;
-- 양쪽 테이블의 모든 행을 포함한다.  
SELECT *
FROM 테이블1 FULL OUTER JOIN 테이블2
ON 테이블1.컬럼 = 테이블2.컬럼;

SELF JOIN: 같은 테이블을 두번 조인

SELF JOIN은 언제 사용되는걸까?

사원 테이블에 상사번호를 저장하는 방식과 같이 하나의 테이블 안에 서로 연결된 행이 있을 때 주로 사용한다.

조인의 학술적 분류

조인 종류설명
세타 조인 (Theta Join)모든 비교 연산자(=, >, <, >=, <=, !=)를 사용하는 조인. ‘세타(θ)‘는 비교 연산자를 나타내는 수학 기호[6]
동등 조인 (Equi Join)세타 조인 중 등호(=)만 사용하는 조인
자연 조인 (Natural Join)동등 조인에서 중복 컬럼을 제거한 조인
-- 세타 조인: = 이외의 연산자 사용 가능
SELECT * FROM 사원, 부서
WHERE 사원.급여 > 부서.최저급여;
 
-- 동등 조인: = 연산자만 사용
SELECT * FROM 사원, 부서
WHERE 사원.부서번호 = 부서.부서번호;
 
-- 자연 조인: 동등 조인 + 중복 컬럼 자동 제거
SELECT * FROM 사원 NATURAL JOIN 부서;

DDL

외래키 DDL ✖️

  • CONSTRAINT
  • REFERENCE X → REFERENCES O
CREATE TABLE 자식테이블명 {
	자식컬럼명
	CONSTRAINT 제약조건명 FOREIGN KEY (자식컬럼명)
	REFERENCES 부모테이블명 (부모컬럼명) 
}
CREATE TABLE 자식테이블명 {
	자식컬럼명 CONSTRAINT 제약조건명 FOREIGN KEY REFERENCES 부모테이블명 (부모컬럼명) 
}
CREATE TABLE 자식테이블명 {
	자식컬럼명 REFERENCES 부모테이블명 (부모컬럼명) 
}

서브쿼리

상관 서브쿼리

  • 바깥 쿼리의 값을 서브쿼리가 참조하는 형태
  • 상관 서브쿼리는 바깥 쿼리의 각 행마다 실행
SELECT COUNT(*)
FROM A
WHERE x > (
    SELECT AVG(y)
    FROM B
    WHERE B.id IN (
        SELECT A2.id
        FROM A A2
        WHERE A2.x < A.x
    )
);

위와 같은 경우 A의 각 행마다 별개의 서브쿼리가 실행된다.
자세한 풀이 방식은 링크 참고

Java

필드 vs 메서드 호출 기준 비교

메서드 오버라이딩(자식이 부모의 메서드를 재정의하는 것)에서는 실제 객체 타입 기준으로 호출됩니다. 하지만 필드와 static 메서드는 선언 타입 기준입니다.

Parent p = new Child();
구분호출 기준예시
인스턴스 메서드 (오버라이딩)실제 객체 타입 (= 등호 오른쪽)ref.method() → Child의 method()
필드 (하이딩)선언 타입 (= 등호 왼쪽)ref.x → Parent의 x
static 메서드선언 타입 (= 등호 왼쪽)ref.id() → Parent의 id()

CAUTION

인스턴스 메서드의 method() 호출은 사실상 this.method()이며, 오버라이딩된 경우 실제 객체 타입의 메서드가 실행된다. 단, static, private, final, super.method() 등은 예외다.

상속

필드 하이딩

부모 클래스와 자식 클래스에 같은 이름의 필드가 있으면, 자식의 필드가 부모의 필드를 가린다.

class Parent {
	String x = "Parent";
}
 
class Child extends Parent {
	String x = "Child" // 부모의 x를 가림
}

필드와 같은 경우는 선언 타입을 기준으로 가져오기에 선언 타입에 따라 결과가 다르다.

System.out.println(p.name); // Parent  
System.out.println(child.name); // Child
Link to original

class Parent {
    static int total = 0;
    int v = 1;
    public Parent() {
        total += (++v);
        show();
    }
    public void show() {
        total += total;
    }
}
class Child extends Parent {
    int v = 10;
    public Child() {
        v += 2;
        total += v++;
        show();
    }
    @Override
    public void show() {
        total += total * 2;
    }
}
class Gamja {
    public static void main(String[] args) {
        new Child();
        System.out.println(Parent.total);
    }
}

Java에서는 자식 클래스 생성자에 super(…), this(…)를 명시하지 않으면 컴파일러가 첫 줄에 super()를 자동으로 삽입한다.

CAUTION

부모 클래스에 기본 생성자가 있다면 자식 클래스 객체 생성시 super() 호출됨을 명심하자!!

오버라이딩

static 메서드와 인터스턴스 메서드

  • 인스턴스 메서드: 실제 객체 타입의 메서드 실행
  • static 메서드: 선언 타입의 static 메서드 실행 (실제 객체 타입의 static은 보지도 않음)
class Parent {
    int x(int i) { return i + 2; }             // 인스턴스 메서드
    public static String id() { return "P"; }  // static 메서드
}
 
class Child extends Parent {
    int x(int i) { return i + 3; }             // 오버라이딩
    public static String id() { return "C"; }  // static 메서드 (별개의 메서드)
}
 
Parent ref = new Child();
//     ↑ 선언 타입        ↑ 실제 객체 타입
  • 21, 21, 3, 7 = 10 + 42 = 52