1 minute read

출처: AI 생성 이미지

객체지향 프로그래밍이란?

객체 지향 프로그래밍은 영어로 OOP(Object-Oriented Programming)라고 한다. 즉 객체(Object)에서 비롯된(Oriented) 프로그래밍 패러다임이다. 객체란 “서로 관련된 데이터와 메서드를 결집시킨 데이터 구조”이다. OOP 프로그래밍 언어(Java) 뿐 아니라, C와 같이 OOP가 아닌 프로그래밍 언어에서도 객체를 사용할 수 있다!

// Person 객체의 구조 예시
struct Person {
    // 객체의 데이터(필드)
    char name[50];
    int age;
    
    // 함수 포인터로서의 메서드
    Person_greet greet;
};



Java는 구조적으로 OOP이다

Javs는 언어 자체의 구조로 인해 OOP가 아니도록 만들 수 없다.

  • 기본 자료형이 아닌 모든 것들이 객체이다.
  • 모든 코드들이 반드시 클래스 내부에 있어야 한다.
  • 모든 객체들은 반드시 Object를 상속받는다.
  • 기본적인 캡슐화 구문(private, public 등)이 있다.

그러나… Java만 쓴다고, 객체만 쓴다고 좋은 OOP일까?

  • Java에서 의도적으로 4가지 원칙을 위배할 수 있다. (예시: 클래스의 필드를 public으로 설정 - 캡슐화 위배)
  • 그럼에도 OOP는 맞다! 다만, “문법이 엉망진창인 영어도 어쨌든 영어”인 것 처럼, “나사 빠진 OOP”가 된다.


OOP를 만드는 4가지 원칙

OOP의 4가지 원칙은 OOP의 가이드라인 또는 지향점이다. 즉 OOP를 따르는 프로그램이 OOP에 잘 부합하는 프로그램이라고 할 수 있겠다. 아래의 원칙들은 A PIE라고 기억하면 쉬울 것이다.

  1. 추상화(Abstraction)
    • 객체가 구현체의 세부 로직을 숨기고 필요한 부분만 드러내도록 하는 방식이다.
    • 클래스가 추상화에 의존하면 구현체의 로직이 달라져도 클래스의 코드를 변경할 필요가 없다. 즉 유지보수성이 좋아진다.
    • 실제 코드에서는 주로 인터페이스(interface)로 적용된다.
    • 추상 클래스도 사용할 수 있으나 클래스는 하나만 상속받을 수 있는데 인터페이스는 구현의 제약이 없는 점, 현대 프레임워크들이 추상 클래스보다 인터페이스와 더 원활하게 통합되는 점 등을 이유로 거의 사용되지 않는다.
  2. 다형성(Polymorphism)
    • 자식 클래스들이 하나의 부모 클래스로 처리되도록 하여 같은 메서드를 실행해도 여러가지 응답을 받도록 하는 방식이다.
    • 컴파일 타임 다형성: 컴파일 때 처리되는 다형성으로, 메서드 오버로딩이 대표적인 예시이다.
    • 런타임 다형성: 런타임 때 처리되는 다형성으로, 메서드 오버라이딩이 그 예시이다.
  3. 상속(Inheritance)
    • 자식 클래스가 부모 클래스의 프로퍼티와 메서드를 가져다 사용하는 방식이다.
    • 실제 코드에서 extends 키워드를 사용하여 적용된다.
    • 자식 클래스는 부모 클래스와 is a kind of 관계여야 한다. (예시: 사과 is a kind of 과일)
  4. 캡슐화(Encapsulation)
    • 데이터와 메서드를 하나의 클래스 내에 배치하여 외부에서 직접적으로 접근하지 못하도록 하는 방식.
    • 외부에서 클래스 내부로 접근할 때 제한을 두거나 외부에서 주는 입력값을 검증하여 객체를 항상 유효한 상태로 유지한다.
    • 실제 코드에서 클래스의 필드를 private으로 설정하는 것으로, 접근 자 메서드인 public 메서드(대표적으로 getter)를 추가하는 것으로 적용된다.

Categories:

Updated: