절차적 프로그래밍 (Procedural Programming)과 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)은 소프트웨어 개발의 두 가지 대표적인 패러다임이다.
| 구분 | 절차적 프로그래밍 | 객체 지향 프로그래밍 |
|---|---|---|
| 기본 개념 | 순차적으로 명령어를 실행하여 문제 해결 | 객체라는 단위로 데이터를 추상화하고, 그 객체 간 상호작용으로 문제 해결 |
| 구조 | 함수 중심 (Function-based) | 클래스와 객체 중심 (Class-based) |
| 데이터 처리 | 데이터를 함수 외부에서 처리 | 데이터를 객체 내부에서 캡슐화하여 처리 |
| 재사용성 | 함수 재사용에 초점 | 클래스/객체 단위로 재사용 및 상속 |
| 보안/은닉성 | 데이터 보호 기능 부족 (전역 변수 사용 가능성 높음) | 정보 은닉 (Encapsulation) 제공 |
| 유지보수성 | 복잡한 프로그램에서 유지보수 어려움 | 캡슐화, 상속, 다형성으로 유지보수 용이 |
| 주요 개념 | 순차, 조건, 반복 | 캡슐화, 상속, 다형성, 추상화 |
| 대표 언어 | C, Pascal, Fortran, etc. | Java, C++, Python, C#, etc. |
| 실행 흐름 | 위에서 아래로 순차적으로 흐름 제어 | 객체 간 메시지 전달을 통해 흐름 제어 |
| 예제 | main() 함수에서 순차적으로 함수 호출 | 클래스 생성 → 객체 생성 → 메서드 호출 |
객체를 만들기 위한 설계도로, 속성과 동작을 정의한다.
클래스를 기반으로 생성된 실체로, 어떤 클래스의 인스턴스이다. 속성과 메서드를 갖는 메모리 상의 실제 존재다.
클래스 내부에 선언된 변수로, 객체의 상태나 정보를 저장한다. 객체가 생성될 때 메모리에 할당되며, 각 객체는 독립적인 자신의 필드값을 가진다.
객체가 수행하는 동작을 정의하는 함수다. 아래와 같은 형식으로 작성한다.
[접근제어자] [반환형] [메서드 이름](매개변수 목록) {
// 메서드 본문
return 값; // 반환형이 void가 아닌 경우
}
public, private, protected,(default))객체 생성 시 수행되는 초기화 메서드로, 클래스 이름과 동일하다.
객체의 속성을 외부에서 직접 접근하지 못하도록 숨기고, 공개된 메서드를 통해서만 간접적으로 접근하도록 한다.
private으로 선언한다.getter/setter를 통해 제공한다.setter에 유효성 검사를 추가한다.✏️ 필드 공개 vs 캡슐화
항목 public 필드 직접 접근 private + getter/setter (캡슐화) 접근 방식 stock.price = 10000; stock.setPrice(10000); 간결성 간단하고 빠름 코드가 약간 길어짐 유효성 검사 불가능 (값 제한 못함) setter에 검사 로직 가능 데이터 보호 불안전 (외부에서 자유롭게 변경 가능) 안전 (변경 제어 가능) 유지보수 변경 시 외부 코드 모두 영향 받음 내부 변경 시 외부 영향 최소화 기능 확장성 어려움 (로직 삽입 불가) 쉬움 (getter/setter에 로직 추가 가능) OOP 원칙 준수 객체지향 위반 정보 은닉 원칙 충실 테스트 및 디버깅 예기치 않은 변경 가능성 존재 추적과 제어 쉬움
기존 (부모) 클래스의 속성과 메서드를 새로운 (자식) 클래스가 물려받아 사용하는 개념이다. extends 키워드를 사용하며, 코드 재사용성 향상과 유지보수 편의성을 제공한다.
하나의 타입으로 여러 형태의 동작을 표현할 수 있는 능력을 의미한다. 같은 메서드 호출이라도 객체의 실제 타입에 따라 다르게 동작하게 만드는 개념이다.
복잡한 시스템에서 핵심적인 개념만을 추출하고, 불필요한 세부사항은 숨기는 것을 의미한다. abstract class 또는 interface를 사용하여 구현한다.
✏️
abstract classvsinterface
항목 추상 클래스 (abstract class) 인터페이스 (interface) 용도 상태와 일부 공통 구현을 자식들과 공유하기 위한 설계 도구 구현 없이 동작 규약만 선언하여,
다양한 객체들이 동일한 역할을 수행할 수 있게 함다중 상속 불가능 가능 필드 인스턴스 변수, 생성자 포함 가능 상수만 가능 (public static final) 메서드 일부 구현 가능 default, static 메서드 구현 가능
✏️ 패키지 (Package)?
관련 있는 클래스들을 논리적으로 묶는 단위. 일종의 폴더 구조이며, 클래스 간의 이름 충돌 방지, 접근 범위 관리, 재사용성 향상 등을 제공한다.
package com.company.project.model.user와 같이 소스 코드 상단에 패키지를 선언한다. 이 경우com/company/project/model폴더에 해당 클래스 파일이 실제로 존재한다.
✏️ 접근 제어자
클래스, 메서드, 필드, 생성자 등에 대해 외부에서의 접근 가능 범위를 제시하는 키워드로, OOP에서 정보 은닉을 구현하는 데 중요한 역할을 한다.
접근 제어자 같은 클래스 같은 패키지 자식 클래스 외부 클래스 publicO O O O protectedO O O X ( default)O O X X privateO X X X
defulat는 접근 제어자를 명시하지 않은 상태를 의미한다.
protected는 같은 패키지 또는 상속받은 클래스에서 접근 가능하다.