객체지향 프로그래밍이 무엇인가요?
현실 세계의 사물을 추상화시켜서 상태와 행위를 가진 객체로 만들고, 그 객체들 간의 상호작용을 통해 로직을 구성하는 소프트웨어 개발 방법론이다.
- 객체지향 프로그래밍의 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의 동작 과정은?
- 자바 컴파일러가 .java 파일을 컴파일하고 .class 라는 자바 바이트코드로 변환한다.
- 자바 바이트코드를 JVM의 클래스로더(Class Loader)에 올린다.
- 클래스로더는 필요한 클래스들을 동적로딩으로 불러오고, 바이트코드를 JVM 메모리 영역(Runtime Data Areas)에 올린다.
- 실행엔진(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이 포함되어 있다.