1. 객체지향 프로그래밍이란? (다른 프로그래밍 패러다임과의 차이, 장단점, 사용 이유)
프로그래밍 패러다임(programming paradigm)
- 프로그래밍의 패러다임 형태
- 프로그래머에게 프로그래밍의 관점을 갖게 해주고, 결정하는 역할을 한다.
ex)
객체지향 프로그래밍: 프로그램을 상호작용하는 객체들의 집합으로 파악
함수형 프로그래밍: 상태값을 지니지 않는 함수값들의 연속
다른 프로그래밍 패러다임
1. 비구조적 프로그래밍 (= 순차적 프로그래밍(Sequencial Programming))
- 하나의 연속된 덩어리에 모든 코드를 넣는 프로그래밍 패러다임
- 코드의 특정 부분으로 건너뛰는
GOTO
문과 같은 흐름 제어문에 의존하게 된다.
- 프로그램 구조는 항상 조건문과
GOTO
문을 조합해 구현할 수 있으므로, 구조가 모든 언어에서 필요한 것은 아니다.
- 어셈블리어는 대체로 비구조적 언어인데, 기본이 되는 기계어 코드가 구조적이지 않기 때문이다.
2. 절차적 프로그래밍(Procedure Programming)
- 순차적 프로그래밍에서는 중복 코드가 발생하게 되는데, 이 중복된 기능이나 관련없는 기능들을 따로 분리해 구조를 만든 프로그래밍 패러다임
- 이때 분리된 단위를 프로시저라고 하며, 보통 함수를 말한다.
- 구조적 프로그래밍(Structured Programming)
- 절차적 프로그래밍의 하위 개념
- 프로그램의 논리적 구조와 체계적인 제어흐름을 강조
goto
문을 if/then/else
와 do/while/util
로 대체
3. 객체지향 프로그래밍(Object-Oriented Programming)
절차적/구조적 프로그래밍은 인간이 기계를 이해하려는 노력에서 벗어나지 않는다.
특히 포인터 개념은 기계 수준으로 눈높이를 낮추지 않으면 이해하기 매우 어려운 부분이다.
객체지향 프로그래밍은 이러한 기계 종속적 개발에서 벗어나, 현실 세계처럼 프로그래밍 하려는 고민에서 탄생했다.
사람이 인지할 때, 사물을 분류(class)해서 이해한다.
따라서, 객체 단위로 사물을 인지 및 사고할 수 있도록 지원하는 객체지향 프로그래밍 패러다임은 개발자에게 더 직관적이다.
장단점
장점
- 의미있는 단위로 코드가 모듈화되어 있다.
- 팀 협업이 수월하다.
- 상속을 통해서 코드를 재활용할 수 있어 개발 효율성이 높다.
- 독립된 객체 단위로 개발 되어서 테스트가 용이하다.
- 개발 생산성
- 의미있는 단위로 코드가 나뉘어져 있어 가독성이 높다.
- 현실 세계를 모델링하듯 자연스럽게 프로그래밍이 가능하다.
단점
- 개발 과정의 어려움
- 객체들의 역할과 기능을 정확히 이해해야 하므로 설계에 많은 시간이 소요된다.
- 배우기가 어렵고 학습 곡선이 높다.
- 성능 관련 이슈
- 절차지향 언어에 비해 실행속도가 상대적으로 느림
- 객체 생성과 관리로 인한 메모리 사용량 증가
- 작은 규모의 프로그램에서는 비효율적일 수 있음
사용이유
- 코드 관리의 용이성
- 잘 모듈화 되어 있어, 유지보수가 용이하고 이해하기가 쉽다.
- 개발 생산성 향상
- 코드를 재사용할 수 있어서 개발 시간과 비용이 절감 가능하다.
- 특히 대규모 프로젝트에 적합
- 팀단위 협업 개발에 유리
- 많은 데이터를 다뤄야 하는 프로그램에 적절
사용하면 안되는 경우
극도로 빠른 실행속도가 필요한 경우 (리소스가 메우 제한적인 경우)
규모가 작은 프로젝트의 경우, 오버헤드 발생 가능
2. 추상화/상속/다형성/캡슐화
추상화
- 불필요한 정보를 제거하고 문제 해결에 필요한 핵심만 남기는 작업
- 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
- 자바에서는 추상클래스와 인터페이스를 통해 추상화를 구현할 수 있다.
상속
- 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법요소
- 하위클래스가 상위 클래스를 확장하여 상위클래스의 속성과 기능을 간편하게 사용할 수 있다.
다형성(polymorphism)
- 많은 형태를 가질 수 있는 능력
- 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질
- 하나의 추상 인터페이스에 대해 코드를 작성하고, 이 추상 인터페이스에 대해 서로 다른 구현을 연결할 수 있는 능력

캡슐화
- 서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것
객체의 내부 상태를 외부로부터 숨김
private 접근 제어자를 통해, 직접 접근을 제한
외부의 잘못된 접근으로부터 객체의 상태를 보호
내부 구현이 외부에 노출되지 않아서,
3. 자바 컴파일 과정에 대해 설명 하시오 (키워드: class loader, jvm, compiler/interpreter, 등)

- 컴파일 Compile
- 사람이 읽을 수 있는 코드로 작성된 소스코드를 컴퓨터가 이해하고 실행할 수 있는 기계어(바이너리 코드)로 변환하는 과정
- 소스코드의 문법 오류를 찾아내고, 실행 가능한 프로그램을 생성하는 역할을 수행한다
클래스 로더
클래스를 메모리에 올리는 동적 클래스 로딩 기능 담당
자바 클래스가 한번에 메모리에 올라가는 것이 아니라, 애플리케이션이 요구될 때 메모리에 올라간다.
즉, 런타임에 동적으로 클래스를 로드하며 클래스를 처음으로 참조할 때 해당 클래스를 로드하고 링크하는 것.
- Load
- java 프로그램 실행에 필요한 클래스를 JVM에 로드
- Link
- 우리가 클래스파일에 부여한 변수 이름을 실제 메모리 주소로 변환하는 작업을 실행합니다.
- Initialize
- 개발자가 지정한 값으로 static 변수가 설정되고, 이후 main 메서드가 실행됩니다.
JVM
Java는 Java Virtual Machine 위에서 작동한다.
JVM: OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터
자바의 실행과정

- 자바 소스 코드(.java) → 자바 컴파일러 → 클래스 파일(.class)
- 클래스 파일 → JVM 클래스 로더 → JVM 메모리에 로드
- 로드된 바이트코드 → JIT 컴파일러 → 기계어(바이너리 코드)
- 기계어 → CPU에서 직접 실행
Reference