🧱 객체 지향 프로그래밍(OOP) 완전 정복 가이드
객체지향이 뭔지 모르겠다면?
이 글 하나로 개념, 예시, 핵심 특징까지 싹 정리해드립니다.
📌 1. 객체 지향 프로그래밍(OOP)란?
OOP(Object-Oriented Programming)는 소프트웨어를 “객체”라는 단위로 구조화하고 조립하는 방식입니다.
💡 왜 OOP가 필요할까?
생산성 향상: 복잡한 소프트웨어를 더 효율적으로 개발할 수 있음
재사용성: 이미 만든 객체를 재활용하여 시간과 비용 절약
분업화: 객체를 독립적으로 개발하고 조합 가능
🧩 2. 객체(Object)란?
객체란 현실 세계나 개념적인 존재를 소프트웨어로 표현한 것입니다.
예시
현실 객체: 자동차, 집, 자전거, 고양이
개념 객체: 학과, 강의, 주문 등
객체 구성 요소
속성 (필드): 이름, 나이, 색깔 등 정보
동작 (메서드): 웃다, 걷다, 달리다 등 기능
예: 사람 객체
속성 → 이름, 나이
동작 → 웃다, 먹다
🔑 3. 객체지향의 핵심 요소
(1) 현실 세계와 소프트웨어의 연결
현실 세계의 개체(사람, 자동차 등)를 소프트웨어 안에 객체로 모델링
(2) 메서드 호출을 통한 상호작용
객체들은 메서드를 통해 서로 상호작용합니다.
예: 사람 객체가 계산기 객체에 더하기 요청 → 결과 반환
(3) 필드와 메서드의 협력
객체는 속성(필드)과 동작(메서드)으로 구성되어 내부 데이터를 처리하고 행동을 수행
예:
int result = add(10, 20);
→ 계산기 객체의 add 메서드 호출 → 결과 저장
🎯 쉽게 이해하는 비유
사람 객체는 “웃기”, “먹기” 같은 기능이 있음
자동차는 “달리기”, “멈추기” 등 동작을 가짐
→ OOP는 이런 객체들을 만들고 이들의 상호작용으로 소프트웨어를 설계함
⭐ 4. 객체지향의 3대 특징
1️⃣ 캡슐화 (Encapsulation)
정의: 객체의 속성(필드)과 행동(메서드)를 하나로 묶고, 외부에서 직접 접근하지 못하게 보호
외부는 공개된 메서드를 통해서만 접근 가능
접근 제한자로 보호 (private, public, protected)
📦 쉽게 이해하기
비유: 약이 들어 있는 캡슐
→ 데이터(속성)를 감싸서 보호하고, 필요한 경우에만 꺼내서 사용
✅ 장점
데이터 보호
유지보수 쉬움 (내부 변경 시 외부 영향 최소화)
💻 코드 예시
class BankAccount {
private int balance; // 캡슐화된 속성
public void deposit(int amount) {
balance += amount;
}
public int getBalance() {
return balance;
}
}
2️⃣ 상속 (Inheritance)
정의: 부모 클래스의 속성과 메서드를 자식 클래스가 물려받는 것
기존 기능을 재사용하고, 추가 기능을 확장할 수 있음
👨👩👧 쉽게 이해하기
비유: 부모 → 자식
자식은 부모의 특성(숨쉬기, 먹기 등)을 물려받고, 자신만의 특성(야옹, 멍멍 등)을 가짐
✅ 장점
코드 재사용성 증가
기능 확장 용이
💻 코드 예시
class Animal {
void eat() {
System.out.println("먹는다");
}
}
class Dog extends Animal {
void bark() {
System.out.println("멍멍");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 부모 메서드
dog.bark(); // 자식 메서드
}
}
3️⃣ 다형성 (Polymorphism)
정의: 같은 이름의 메서드가 다양한 방식으로 동작하는 것
🔁 쉽게 이해하기
비유: 엘리베이터의 “닫기 버튼”
→ 같은 버튼이지만 층에 따라 다르게 작동
동물 클래스의 sound()는 고양이는 “야옹”, 개는 “멍멍”
다형성의 두 가지 유형
오버로딩 (Overloading)
→ 같은 이름의 메서드, 다른 매개변수
오버라이딩 (Overriding)
→ 부모 클래스의 메서드를 자식 클래스에서 재정의
✅ 장점
코드의 유연성과 확장성 증가
💻 오버로딩 예시
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
}```
💻 오버라이딩 예시
class Animal {
void sound() {
System.out.println("소리를 낸다");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("야옹");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍");
}
}
public class Main {
public static void main(String[] args) {
Animal animal1 = new Cat();
Animal animal2 = new Dog();
animal1.sound(); // 야옹
animal2.sound(); // 멍멍
}
}