오늘의 CS 질문 키워드 - 1주차

jjuny7712·2024년 1월 25일
0

객체지향 프로그래밍이 무엇인가요?

현실 세계의 사물을 추상화시켜서 상태와 행위를 가진 객체로 만들고, 그 객체들 간의 상호작용을 통해 로직을 구성하는 소프트웨어 개발 방법론이다.

  • 객체지향 프로그래밍의 4가지 특징을 설명해주세요
    • 캡슐화
      • 객체의 내부에 접근하지 못하도록 숨기는 것을 말한다.
    • 상속
      • 클래스로 부터 속성과 메서드를 물려받는 것을 말한다.
    • 추상화
      • 공통의 속성이나 기능을 묶어 이름을 붙이는 것으로 객체 지향적 관점에서 클래스를 정의하는 것을 추상화라고한다.
    • 다형성
      • 같은 이름의 메서드가 다양한 객체에서 다르게 구현될 수 있는 것
  • 객체지향 프로그래밍의 5가지 설계 원칙을 설명해주세요
    • 단일 책임 원칙
      • 클래스는 하나의 책임만을 가져야 한다는 원칙
    • 개방 폐쇄 원칙
      • 변경에는 닫혀있고 확장에는 열려있어야 한다는 원칙
    • 리스코프 치환 원칙
      • 상위 타입의 객체를 하위 타입의 객체로 바꿔도 문제없이 동작해야 한다는 원칙
    • 인터페이스 분리 원칙
      • 객체는 자신이 사용하는 메서드에만 의존해야 한다는 원칙으로, 인터페이스를 상속받을때 사용하지 않는 메서드가 존재한다면 인터페이스를 더 잘게 분리해야 한다는 의미이다.
    • 의존 역전 원칙
      • 객체는 구체적인 객체가 아니라 인터페이스나 추상 클래스같은 추상화에 의존해야 한다는 원칙
  • 오버로딩과 오버라이딩의 차이는?
    • 오버로딩은 메서드의 시그니처를 다르게 하면 동일한 이름을 가진 메서드를 여러개 선언할 수 있는데 이것을 오버로딩이라고 한다.
    • 오버라이딩은 부모클래스의 메서드를 자식클래스에서 재정의해서 사용하는 것을 말한다.
  • 객체지향 프로그래밍의 장단점은 뭐가 있나요?
    • 장점
      • 다른 클래스를 가져와 사용하거나 상속을 통해 코드의 재사용성이 증가된다.
      • 자주 사용되는 로직을 라이브러리로 만들어두면 계속해서 사용할 수 있어서 신뢰성을 확보할 수 있다.
      • 클래스 단위로 모듈화가 가능하기 때문에 대형 프로젝트에 적합하다.
      • 객체 단위로 코드가 나눠서 작성되기 때문에 디버깅이 쉽고 유지보수가 용이하다.
    • 단점
      • 처리 속도가 상대적으로 느리다.
      • 객체가 많으면 용량이 커지기 때문에 많은 메모리를 사용한다.
      • 설계할 때 시간과 노력이 많이 든다.
  • 클래스와 객체, 인스턴스의 차이는?
    • 클래스는 설계도인데, 현실 세계 사물의 상태와 행위를 변수와 메서드로 정의한 것
    • 객체는 클래스를 구체화 해놓은 것
    • 인스턴스는 객체를 실체화 시킨 것
  • getter와 setter를 사용하는 이유는?
    • 메서드를 통해 필드에 접근하기 때문에 추가적인 작업이 가능함.
  • 클래스가 있는 언어는 반드시 객체지향 언어일까?
    • 반드시는 아니다. 파이썬에서는 객체지향 프로그래밍과 절차지향 프로그래밍 모두 가능하지만, 개발자가 객체지향 스타일로 코드를 작성하면 객체지향 언어이고, 절차지향 스타일로 코드를 작성하면 절차지향 언어가 될 수 있다.

인터페이스와 추상 클래스의 차이에 대해 설명해주세요

  • 인터페이스
    • 상수와 추상 메서드만을 가질 수 있다.
    • 다중 상속이 가능하다.
    • 일반 변수를 선언하면 public static final 키워드가 생략되어 상수로 선언된다.
    • 하위 클래스에게 일종의 설계도를 제공하기 위한 목적
  • 추상 클래스는
    • 상수와 추상 메서드뿐만 아니라 일반 메서드와 변수를 선언할 수 있다.
    • 다중 상속이 불가능하다.
    • final 키워드를 사용할 수 없다.
    • 상속받은 클래스의 기능을 이용하고 확장하기 위한 목적
  • 왜 클래스는 다중 상속이 불가능할까?
    • 두 개의 부모 클래스가 가진 동일한 이름의 메서드를 자식 클래스에서 사용할 때 어떤 메서드를 호출해야 할지 모르기 때문에

데이터베이스 Lock에 대해서 설명해주세요

하나의 트랜잭션이 실행되는 동안 특정 데이터에 대해서 다른 트랜잭션이 동시에 접근하지 못하도록 막는 방법을 말한다.

  • Lock의 종류는?
    • 공유락
      • 데이터를 읽을때 사용하는 Lock으로 하나의 데이터에 대해 여러개의 공유락이 가능하다.
      • 공유락이 걸린 데이터에 대해서는 읽기 연산만 가능하다.
    • 베타락
      • 데이터를 변경할때 사용하는 Lock으로 하나의 데이터에 대해 하나의 베타락만 가능하다.
      • 베타락이 걸린 데이터에 대해서는 다른 트랜잭션이 읽기, 쓰기 연산이 불가능하다. 단, 베타락을 가진 트랜잭션은 데이터에 읽기, 쓰기가 모두 가능하다.
  • Lock 설정 범위는?
    • 데이터베이스(잘안씀)
    • 파일(잘안씀)
    • 테이블
    • 레코드
    • 컬럼
  • 블로킹이란?
    • 베타락이 걸렸을때 다른 트랜잭션이 읽기나 쓰기 연산을 하면 대기하는 것(베타 - 베타, 베타 - 공유)
    • 공유락이 걸렸을때 다른 트랜잭션이 쓰기 연산하면 대기하는 것(공유 - 베타)
  • 2단계 잠금 규약(2Phase Lock, 2PL)이 무엇인지?
    • 단순 잠금 기법은 직렬 가능한 스케줄을 보장하지 못하고, 데드락이 발생할 수 있기 때문에 2PL 기법을 사용한다.
    • 확장단계에서 시작하여 축소단계로 끝나는 잠금 규약을 말한다. 확장단계는 트랜잭션이 lock 연산만 수행할 수 있고 unlock연산은 수행할 수 없는 단계이고, 축소단계는 트랜잭션이 unlock 연산만 수행할 수 있고 lock연산은 수행할 수 없는 단계이다.
    • 2PL에서도 데드락이 발생할 수 있기 때문에 트랜잭션을 시작하기 전에 모든 필요한 잠금을 동시에 설정하면 해결된다.
    • 단, 연쇄 복귀 문제가 발생할 수 있다. 이때는 엄격한 2단계 잠금 규약을 사용한다. 연쇄 복귀 문제는 정상적인 트랜잭션도 롤백시키는 것이다.
  • 엄격한 2단계 잠금 규약(strict 2PL)은?
    • 모든 X-lock에 대한 unlock 연산을 트랜잭션이 완전히 완료된 후에 실행하는 것을 말한다.

JVM이 무엇인가요?

JVM은 자바를 실행할 수 있는 가상 머신이다. 자바의 바이트 코드를 운영체제에 맞게 해석해주는 역할을 합니다.

  • JVM의 동작 과정은?
    1. 자바 컴파일러가 .java 파일을 컴파일하고 .class 라는 자바 바이트코드로 변환한다.
    2. 자바 바이트코드를 JVM의 클래스로더(Class Loader)에 올린다.
    3. 클래스로더는 필요한 클래스들을 동적로딩으로 불러오고, 바이트코드를 JVM 메모리 영역(Runtime Data Areas)에 올린다.
    4. 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트코드를 명령어 단위로 하나씩 실행한다.
  • JVM 메모리 구조는?
    • PC Register, JVM Stack, Native Method Stack
      • 스레드마다 하나씩 존재한다.
      • PC Register는 다음에 실행할 명령어의 주소가 담겨있다.
      • JVM Stack은 지역변수, 파라미터 등이 할당된다.
      • Native Method Stack은 Java외에 다른 언어로 작성된 네이티브 코드를 위한 스택이다.
    • Heap
      • GC의 대상이 된다.
      • 인스턴스 또는 객체를 저장하는 공간
    • Method Area
      • JVM이 읽어들인 클래스와 인터페이스의 런타임 상수 풀, 필드와 메서드, static 변수, 메서드의 바이트 코드, 전역변수 등을 저장
      • Runtime Constant Pool
  • JVM 실행엔진은 인터프리터 방식인지, JIT 방식인지?
    • 둘다 사용한다.
    • 인터프리터 방식은 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다. JVM은 기본적으로 인터프리터 방식으로 동작함
    • JIT(Just In Time) 방식은 바이트 코드 전체를 컴파일해서 네이티브 코드로 변경해서 실행하는 방식
  • 언제 인터프리터 방식이 사용되고, 언제 JIT 방식이 사용되는지?
    • JVM은 내부적으로 해당 메서드가 얼마나 자주 호출되고 실행이 되는지 체크하고, 일정 기준을 넘었을 때에만 JIT 컴파일러를 통해 네이티브 코드로 컴파일한다.
  • JDK, JRE의 차이는?
    • Java로 프로그램을 직접 개발하려면 JDK가 필요하고, Java로 만들어진 프로그램을 실행시키려면 JRE가 필요합니다. JDK안에 JRE가 포함되어 있다.
    • JDK는 개발을 위한 라이브러리, javac 등이 포함되어 있고 JRE는 실행을 위한 라이브러리, JVM이 포함되어 있다.
profile
차곡차곡

0개의 댓글