객체 지향

허성재's avatar
Aug 14, 2024
객체 지향
객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어 개발에서 널리 사용되는 프로그래밍 패러다임으로, 프로그램을 객체(object)라는 단위로 구성하고 이들 객체 간의 상호작용을 통해 문제를 해결하는 방식입니다. 객체 지향 프로그래밍의 핵심 개념과 특징을 자세히 살펴보겠습니다.

1. 객체(Object)

객체는 상태(state)와 동작(behavior)을 가지는 실체입니다. 객체는 데이터와 이를 처리하는 메서드(함수)로 구성됩니다. 객체는 현실 세계의 개념이나 실체를 모델링하는 데 사용됩니다.
  • 상태(State): 객체의 데이터 또는 속성. 예를 들어, 자동차 객체의 상태는 색상, 모델, 속도 등입니다.
  • 동작(Behavior): 객체가 수행할 수 있는 기능. 예를 들어, 자동차 객체의 동작은 주행, 정지, 방향 전환 등이 될 수 있습니다.

2. 클래스(Class)

클래스는 객체를 생성하기 위한 템플릿입니다. 클래스는 객체의 상태와 동작을 정의합니다. 즉, 클래스는 객체의 설계도를 제공합니다.
  • 속성(Attributes): 객체가 가질 수 있는 데이터나 상태. 클래스에서 정의된 변수들.
  • 메서드(Methods): 객체가 수행할 수 있는 동작. 클래스에서 정의된 함수들.
// 자바에서 클래스 정의 예제 public class Car { // 속성 String color; String model; int speed; // 메서드 void drive() { System.out.println("Car is driving."); } void stop() { System.out.println("Car has stopped."); } }

3. 인스턴스(Instance)

인스턴스는 클래스를 기반으로 생성된 객체입니다. 클래스는 템플릿일 뿐 실제 메모리에 존재하지는 않으며, 인스턴스가 메모리에 생성되면서 실제 동작을 수행합니다.
// Car 클래스의 인스턴스 생성 Car myCar = new Car(); myCar.color = "Red"; myCar.model = "Toyota"; myCar.drive(); // "Car is driving." 출력

4. 상속(Inheritance)

상속은 기존 클래스의 속성과 메서드를 새로운 클래스가 재사용할 수 있게 하는 기능입니다. 상속을 통해 코드의 재사용성을 높이고, 클래스 간의 계층 구조를 형성할 수 있습니다.
  • 부모 클래스(Parent Class): 상속을 제공하는 클래스.
  • 자식 클래스(Child Class): 부모 클래스의 속성과 메서드를 상속받는 클래스.
// 상속을 통한 클래스 정의 예제 public class ElectricCar extends Car { // 추가 속성 int batteryLife; // 추가 메서드 void charge() { System.out.println("Charging the battery."); } }

5. 다형성(Polymorphism)

다형성은 동일한 메서드 호출이 서로 다른 클래스에서 다르게 동작할 수 있게 하는 개념입니다. 이는 메서드 오버로딩과 메서드 오버라이딩을 통해 구현됩니다.
  • 메서드 오버로딩(Method Overloading): 동일한 이름의 메서드를 매개변수의 타입이나 개수에 따라 여러 번 정의하는 것.
    • public class Printer { void print(int num) { System.out.println(num); } void print(String text) { System.out.println(text); } }
  • 메서드 오버라이딩(Method Overriding): 자식 클래스에서 부모 클래스의 메서드를 재정의하여 새로운 동작을 정의하는 것.
    • public class Car { void start() { System.out.println("Car is starting."); } } public class ElectricCar extends Car { @Override void start() { System.out.println("Electric Car is starting silently."); } }

6. 캡슐화(Encapsulation)

캡슐화는 객체의 속성과 메서드를 하나의 단위로 묶고, 외부에서 객체의 내부 구현을 숨기는 것입니다. 이를 통해 데이터의 보호와 코드를 더 안전하게 관리할 수 있습니다.
  • 접근 제어자(Access Modifiers): private, protected, public 등을 사용하여 클래스의 속성과 메서드에 대한 접근을 제어합니다.
public class Person { // private 속성 private String name; // public 메서드 public String getName() { return name; } public void setName(String name) { this.name = name; } }

7. 추상화(Abstraction)

추상화는 객체의 복잡한 내부 구현을 숨기고, 중요한 특성만을 외부에 노출시키는 것입니다. 이는 인터페이스와 추상 클래스를 통해 구현됩니다.
  • 추상 클래스(Abstract Class): 인스턴스를 생성할 수 없는 클래스이며, 서브클래스에서 구현해야 하는 추상 메서드를 정의할 수 있습니다.
    • abstract class Animal { abstract void makeSound(); } class Dog extends Animal { @Override void makeSound() { System.out.println("Woof"); } }
  • 인터페이스(Interface): 클래스가 구현해야 하는 메서드의 집합을 정의하며, 다중 상속을 지원합니다.
    • interface Flyable { void fly(); } class Bird implements Flyable { @Override public void fly() { System.out.println("Bird is flying."); } }

객체 지향의 장점

  1. 재사용성: 코드의 재사용성을 높여주며, 기존 클래스를 상속하거나 조합하여 새로운 기능을 추가할 수 있습니다.
  1. 유지보수 용이: 객체와 클래스가 잘 정의되면, 시스템의 특정 부분만 수정해도 전체 시스템에 영향을 미치지 않으므로 유지보수가 쉬워집니다.
  1. 확장성: 새로운 기능 추가나 시스템 확장이 용이합니다. 기존 코드의 변경 없이 새로운 기능을 추가할 수 있습니다.
  1. 보안: 캡슐화를 통해 데이터와 메서드를 보호하고, 외부에서 직접 접근을 차단할 수 있습니다.
  1. 추상화: 복잡한 시스템을 간단한 인터페이스로 관리할 수 있어 이해하기 쉽고, 코드의 복잡성을 줄여줍니다.
Share article

heo-gom