본 페이지는 면접 준비를 위해 다양한 블로그를 참고했습니다.

객체지향 프로그래밍 언어

객체지향 프로그래밍이란 현실 세계의 개체 모델을 바탕으로 프로그램을 구조화하고 개발하는 기법이다. 함수와 메서드가 비슷하다. 객체 간의 메시지 교환을 이용한 모델이다. 상속, 추상화, 캡슐화 등의 특징을 활용한다. 구조적이고 재활용 가능한 모듈화로 생산성과 유지보수 효율성을 높인다. 대표적인 언어로는 SmallTalk, C++, C#, .NET, 자바, 파이썬 등이 있다.

객체와 클래스

객체

객체(Object)는 ‘사물’을 의미한다. 사물은 속성(Attribute)과 행위(Behavior)로 설명할 수 있다.

클래스와 인스턴스

클래스(Class)는 속성이 같은 객체들을 대표하는 개념이다. 예를 들어, 소나무는 클래스가 된다. 각각의 소나무들은 소나무 클래스의 인스턴스(객체)이다.

  1. 클래스는 객체를 정의하는 틀이다. 필드(속성)와 메서드(행위)로 구성된다.
  2. 인스턴스는 클래스에서 생성한 객체다. 고유한 상태가 있다. 동일한 클래스에서 생성된 객체라도 필드 값과 메서드는 다를 수 있다.

상속

상속은 기존 클래스를 물려받아 새로운 부분만 추가하거나 수정하는 개념이다. 상속을 이용하면 슈퍼 클래스의 구성 요소(필드, 메서드)를 물려받는다. 자신만의 필드나 메서드를 추가하여 구체화할 수 있다. 상속은 extends 키워드를 사용하여 정의한다.

객체지향 프로그래밍의 주요 특징

캡슐화

객체의 메서드와 필드를 외부에 숨기는 특성이다.

상속

클래스는 추상화된 슈퍼 클래스와 구체화된 서브 클래스로 구성된다. 슈퍼 클래스와 서브 클래스의 관계를 상속이라고 한다. 자바에서는 다중 상속을 지원하지 않는다.

다형성

슈퍼 클래스가 같은 서브 클래스들이 동일한 요청을 다르게 처리하는 특성이다. 메서드 오버라이딩을 통해 구현한다.

자바 클래스의 기본 구조

  1. 패키지: 자바 클래스를 묶어서 관리하는 디렉터리 개념이다. 역 도메인(Reverse Domain) 방식으로 이름을 부여한다.
  2. 클래스: 자바 프로그램은 클래스를 만드는 것에서 시작한다. 클래스는 자바 프로그램의 기본 단위다. 프로그램 실행을 위한 main() 메서드를 반드시 포함할 필요는 없다.
  3. 인스턴스: 클래스는 바로 사용할 수 없다. 인스턴스로 사용해야 한다. main() 메서드에서 클래스의 인스턴스를 만들고, 이를 이용해 메서드를 호출한다.
  4. 참조 변수: 자바 클래스의 인스턴스를 참조하는 변수다. 일반적인 변수와 유사하지만, 참조 변수에는 데이터가 없고 클래스 인스턴스를 가리킨다.
  5. 생성자: 클래스를 생성할 때 제일 먼저 실행되는 메서드다. 리턴값이 없고, 메서드 이름은 반드시 클래스 이름과 일치해야 한다. 여러 생성자를 정의할 수 있다(메서드 오버로딩). 기본 생성자는 특별한 경우가 없으면 굳이 구현할 필요가 없다. 하지만 생성자를 여러 개 정의할 때는 기본 생성자를 명시해야 한다.

접근 한정자

한정자 클래스 내부 동일 패키지 하위 클래스 그 외의 영역
public O O O O
protected O O O X
default O O X X
private O X X X
  • public: 접근 제한이 없다.
  • protected: 같은 패키지 내에서 접근 가능하다. 다른 패키지에서 상속받은 자손 클래스에서도 접근 가능하다.
  • default: 같은 패키지 내에서만 접근 가능하다.
  • private: 같은 클래스 내에서만 접근 가능하다.

일반 한정자

  1. static: 클래스 메서드와 변수를 선언할 때 사용한다. 정적 영역에 할당되는 리소스를 선언하는 데 사용된다. 동일 가상머신에서 실행 중인 모든 클래스에서 공유한다. 인스턴스를 생성하지 않고도 클래스의 메서드나 멤버에 접근할 수 있다.
  2. final: 더 이상 변경할 수 없도록 선언하는 한정자다. 클래스에 사용할 때는 서브 클래스를 만들 수 없다. 메서드에 사용할 때는 오버라이딩할 수 없다. 변수에 사용하면 상수의 역할을 한다.
  3. abstract: 추상 클래스를 선언하는 한정자다.
  4. synchronized/volatile: 스레드 프로그래밍에서 데이터 동기화를 처리하는 한정자다.

인스턴스 변수와 클래스 변수

  1. 인스턴스 변수: 클래스의 인스턴스로만 접근 가능한 변수다. 일반적인 멤버 변수가 이에 속한다. 클래스 외부에서 접근을 차단하려고 private 키워드를 사용한다.
  2. 동일 클래스의 인스턴스라도 각 인스턴스 변수의 값은 다르고 서로에 영향을 주지 않는다.
  3. 클래스 변수: 모든 클래스의 인스턴스로 공유되는 변수다. static 키워드를 사용하여 선언한다. 클래스가 인스턴스화되기 전에 접근할 수 없다.

자바 가상머신의 메모리 구조:

  • Method 영역: 클래스(static) 변수, 메서드 바이트코드.
  • Heap 영역: 자바 객체, 인스턴스 변수.
  • Stack 영역: 메서드 파라미터, 지역 변수.

추상 클래스와 인터페이스

추상 클래스와 인터페이스는 객체지향 개념을 쉽게 적용하고 유연한 설계를 지원한다. 일반 클래스보다 추상적인 관점에서 접근한다. 기본적인 속성과 필요한 메서드의 형태만 기술하고, 세부적인 구현은 구현하는 클래스에서 담당한다.

추상 클래스

추상 메서드(구현되지 않고 정의만 한 메서드)를 하나 이상 포함한다. 추상 메서드가 포함된 클래스는 추상 클래스로 정의해야 한다. 추상 클래스는 일반 클래스와 같이 멤버 변수 및 메서드를 포함할 수 있다. 추상 클래스는 인스턴스화할 수 없다. 추상 클래스를 상속받는 클래스를 만들어 모든 추상 메서드를 오버라이딩해야 한다.

인터페이스

인터페이스는 일반 메서드를 포함할 수 없다. 모든 메서드는 추상 메서드(public abstract)로만 구성한다. 일반 멤버 필드는 없고, public, static, final로 선언한 상수만 있다. 인터페이스는 직접 객체를 생성할 수 없다. 다른 클래스로 구현할 때는 implements 키워드를 사용한다. 자바에서 다중 상속의 개념을 지원하는 형태로 사용할 수 있다.

메서드 오버로딩과 메서드 오버라이딩

  1. 메서드 오버로딩: 메서드 이름은 같지만 파라미터가 다른 여러 메서드를 만드는 것을 말한다.
    • 메서드 이름이 같아야 한다.
    • 파라미터의 개수 또는 타입이 달라야 한다.
    • 파라미터가 같고 리턴 타입이 다르면 오버로딩이 성립되지 않는다.
  2. 메서드 오버라이딩: 슈퍼 클래스에서 정의한 메서드를 서브 클래스에서 재정의하는 것을 말한다.
    • 오버라이딩하는 메서드는 슈퍼 클래스의 메서드와 메서드 구성 요소 모두가 동일해야 한다.
    • 이름, 파라미터, 리턴 타입이 모두 같아야 한다.

JAVA의 특징

  1. 자바가상머신(JVM)만 설치하면 운영체제에 상관없이 작동한다.
  2. 기본 자료형을 제외한 모든 요소들이 객체로 표현된다.
  3. 객체지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어다.
  4. Garbage Collector를 통한 자동적인 메모리 관리.
  5. 멀티쓰레드(Multi-thread)를 지원한다.

OOP(객체지향 프로그래밍)

OOP(Object-Oriented Programming)는 객체지향 프로그래밍을 의미한다. 데이터를 객체로 취급하여 프로그램에 반영한다. 객체와 객체의 상호작용을 통해 프로그램이 동작한다.

OOP 특징:

  1. 코드의 재사용성이 높다.
  2. 코드의 변경이 용이하다.
  3. 직관적인 코드 분석이 가능하다.
  4. 개발 속도가 향상된다.
  5. 상속을 통해 장점을 극대화할 수 있다.

Servlet과 JSP

  1. Servlet: Container가 이해할 수 있게 구성된 순수 자바 코드로 이루어진다 (Html in JAVA).
  2. JSP(Java Server Page): HTML 기반에 자바 코드를 블록화하여 삽입한다 (Java in HTML).

JDBC

JDBC(Java Data Base Connection)는 자바 언어를 통해 데이터베이스에 접근할 수 있는 프로그래밍을 의미한다.

인터페이스와 추상 클래스의 비교

공통점

  • new 연산자로 인스턴스 생성이 불가능하다.
  • 프로토타입만 있는 메서드를 갖는다.
  • 하위 클래스에서 확장/구현해야 사용 가능하다.

차이점

  • 사용하는 키워드가 다르다.
  • 추상 클래스는 일반 메서드를 가질 수 있다. 인터페이스는 메서드 선언만 가능하다.

Call by Reference와 Call by Value

  1. Call by Reference: 매개 변수의 원래 주소에 값을 저장하는 방식. 클래스 객체를 인수로 전달할 경우.
  2. Call by Value: 인수로 기본 데이터형을 사용. 주어진 값을 복사하여 처리하는 방식. 메서드 내의 처리 결과는 메서드 밖의 변수에 영향을 미치지 않는다.

static의 의미

  • 클래스가 로딩될 때 메모리 공간을 할당한다. 처음 설정된 메모리 공간이 변하지 않음을 의미한다.
  • 객체를 많이 만들어도 해당 변수는 하나만 존재한다. 객체와 무관한 키워드다.

Primitive type과 Reference type

Primitive type: 변수에 값 자체를 저장한다.

  • 정수형: byte, short, int, long.
  • 실수형: float, double.
  • 문자형: char.
  • 논리형: boolean.

Primitive type은 Wrapper Class를 통해 객체로 변형할 수 있다.

  • 예: int → Integer, char → Character (int와 char를 제외한 Primitive type의 다른 자료형들은 맨 앞 알파벳을 대문자로 바꾼다. float → Float).

Reference type: 메모리상에 객체가 있는 위치를 저장한다.

  • 종류: Class, Interface, Array 등.

Wrapper Class

Primitive type으로 표현할 수 있는 간단한 데이터를 객체로 만들어야 할 경우, 이를 지원하는 클래스다.