객체 지향 프로그래밍이란?
객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그래밍 언어에서 "객체"를 활용하여 소프트에어를 구조화하는 패러다임이다. 함수나 로직에 집중하는 대신, 조작하고자 하는 객체 자체에 집중하여 프로그래밍을 설계한다. OOP의 목표는 상속, 다형성, 캡슐화와 같은 실세계의 개념을 프로그래밍에 도입하여 코드의 조직력, 효율성, 유지보수성을 높이는 것이다. 데이터를 함수와 함께 묶어 외부에서 직접 접근하지 못하도록 제한함으로써 데이터 보호와 코드 관리가 용이해진다.
OOP의 핵심 개념
- Class
- Objects
- Data Abstraction
- Encapsulation
- Inheritance
- Polymorphism
- Dynamic Binding
- Message Passing
객체 지향 프로그래밍의 구조
Class(클래스)
클래스는 데이터 멤버(속성)와 멤버 함수(메서드)로 구성된 사용자 정의 데이터 구조이다. 이는 객체를 생성하기 위한 청사진으로서, 동일한 유형의 모든 객체가 공유할 수 있는 특성을 정의한다. 예를 들어, `자동차` 클래스는 `바퀴`, `속도 제한`, `연비`와 같은 속성을 가질 수 있다. 이 클래스에서 생성된 각 자동차 객체는 이러한 속성을 공유하며, 각자의 구체적인 값을 가진다.
Object(객체)
객체는 각 클래스에서 파생된 실세계의 엔티티로, 고유한 정체성, 상태, 행동을 나타낸다. 객체는 메모리를 차지하며 데이터를 포함하고 데이터를 조작하는 메서드를 갖는다. 예를 들어, `강아지` 객체는 `색`, `품종`과 같은 속성과 `짖기`, `잠자기`와 같은 행동을 가질 수 있다. 객체 간 상호작용에서는 객체의 내부 데이터가 노출되지 않고 인터페이스만 알면 상호작용할 수 있어 정보 은닉을 가능하게 한다.
Method(메서드)
메서드는 객체의 행동을 정의하는 함수로서, 클래스 내부에 정의되어 객체의 동작을 설명한다. 메서드는 객체의 속성을 변경하거나 특정 기능을 수행하도록 도와준다. 예를 들어, `자동차` 클래스의 메서드로 `가속하기`, `브레이크`같은 것이 있으며, 이 메서드는 해당 객체의 속성인 `속도`를 변경할 수 있다.
메서드는 주로 다음과 같은 유형으로 구분될 수 있다.
- 생성자: 객체를 초기화할 때 호출되는 특수 메서드
- 접근자: 객체의 속성을 읽기 위한 메서드 (getter)
- 변경자: 객체의 속성을 변경하기 위한 메서드 (setter)
- 일반 메서드: 객체가 수행하는 특정 작업을 나타내는 메서드
Attribute(속성)
객체의 상태를 나타내는 변수로, 클래스에 정의되어 객체의 고유한 데이터를 가진다. 예를 들어, `자동차` 클래스의 속성으로 `색상`, `속도`, `연비` 등이 있을 수 있다. 속성은 다음과 같은 특성을 가진다.
- 인스턴스 속성: 객체마다 고유한 값을 가지는 속성. 예를 들어, 각 자동차 객체의 `색상`은 서로 다를 수 있다.
- 클래스 속성: 모든 객체가 공유하는 속성. 예를 들어, 자동차의 기본 속도 제한을 나타내는 `speed_limit`이 클래스 속성으로 정의될 수 있다.
속성은 외부에서 직접 접근하기보다는, 메서드를 통해 간접적으로 접근하도록 설계되는 경우가 많아, 데이터의 무결성을 유지하고 정보 은닉을 달성할 수 있다.
객체 지향 프로그래밍의 주요 원칙
Abstraction(추상화)
세상에 있는 것을 본따 클래스로 만들고 그 클래스의 상태와 행동을 부여한 객체로 만드는데 세상에 모든 것을 다 클래스에 담고 객체를 만드는 것을 불가능하다. 그래서 추상적으로 생각해 일단 큰 틀의 클래스를 구현하고 거기에 최소 이러한 공통적인 요소나 필수적인 요소는 들어갔으면 하는 바램에서 만든 것이 `추상 클래스`이다.
추상화는 불필요한 세부 사항은 숨기고, 필수 정보만을 외부에 노출하는 것을 말한다. 공통적인 요소나 특징을 추출하는 과정이 추상화다.
예를 들어, 운전자는 가속 페달을 밟으면 차 속도가 증가한다는 것만 알지, 내부의 복잡한 작동 원리는 모른다. 이와 같이 OOP에서 추상화는 복잡한 구현을 숨겨 개발자가 더 높은 수준에서 작업할 수 있도록 돕는다.
Encapsulation(캡슐화)
캡슐화는 하나의 객체에 대해 그 객체가 특정한 목적을 위해 필요한 변수나 메소드를 하나로 묶는 것을 의미하며, 클래스 내부의 변수에 외부 접근을 제한해 데이터 보호 기능을 제공한다.
예를 들어, 회사의 금융 부서와 영업 부서는 각각의 데이터를 관리한다. 금융 부서 직원은 직접 영업 데이터를 볼 수 없으며, 영업 부서의 승인이 필요하다. 이러한 방식으로 캡슐화는 데이터 접근을 제어하고 데이터 무결성을 유지한다.
정보은닉
캡슐화를 하는 중요한 목적은 바로 정보은닉이다. 유저 정보를 가지고 있는 `User`라는 객체에서 유저의 정보가 `public`으로 선언되어 있다면, 누구든 접근해서 유저 정보를 변경할 수 있다. 그렇기 때문에 `private`로 해서 데터를 보호해서 접근을 제어해야 한다.
이렇게 보호된 변수는 getter나 setter 등의 메서드를 통해서만 간접적으로 접근이 가능하도록 하는 것이 캡슐화의 중요한 목적이다(setter도 아무 생각없이 만들면 안된다).
Inheritance(상속)
상속은 한 클래스가 다른 클래스의 속성과 메서드를 물려받을 수 있는 기능으로, 코드 재사용성과 중복 제거에 기여한다. 예를 들어 `차량` 클래스가 `자동차` 클래스에 상속되어 `자동차`의 기본 속성을 물려받고, 이 속성에 특정 기능을 추가할 수 있다.
Polymorphism(다형성)
다형성은 하나의 개체가 여러 형태를 가질 수 있는 기능으로, 동일한 함수가 상황에 따라 다른 방식으로 동작할 수 있게 한다(동일한 메서드 호출에 대해 객체의 특성에 맞게 다른 동작을 수행하게 한다). 예를 들어, 사람은 상황에 따라 부모, 직원, 친구 등 다양한 역할을 수행할 수 있다. 이러한 유연성 덕분에 OOP에서는 같은 인터페이스를 통해 다양한 작업을 처리할 수 있다.
크게 자바 프로그래밍 객체 지향에서 다형성의 개념을 녹여내는 방법은 두 가지인데, 오버라이딩(Overriding)과 오버로딩(Overloading)이다.
간단하게 설명하자면, 오버라이딩은 부모 클래스에서 상속받은 서브 클래스(자식 클래스)에서 부모클래스(상위클래스)에서 만들어진 메서드를 자신의 입맛대로 다시 재창조해서 사용하는 것을 말한다.
오버로딩은 하나의 클래스 안에서 같은 이름의 메서드를 사용하지만 각 메서드마다 다른 용도로 사용되며 그 결과물도 다르게 구현할 수 있게 만드는 개념인데 오버로딩이 가능하려면 메서드끼리 이름은 같지만 매개변수의 갯수나 데이터 타입이 다르면 오버로딩이 적용되어 메서드 이름이 같아도 문법 에러가 나지 않는다.
다시 정리하면 같은 행위를 하지만, 용도와 목적에 부합하여 다양한 기능 수행과 처리, 결과를 낳을 수 있는 것이다.
Dynamic Binding(동적 바인딩)
동적 바인딩은 함수 호출에 대한 실행 코드를 런타임 시점에 결정하는 것을 말한다. 이 방법은 유연성을 제공하며, 상속을 통해 파생된 클래스 객체가 필요에 따라 기본 클래스처럼 동작할 수 있게 한다.
Message Passing(메세지 전달)
메시지 전달은 객체가 서로 정보를 주고받는 통신 방법이다. 각 메시지는 객체의 이름, 함수 이름, 관련 데이터로 구성되어, 메시지를 받은 객체가 해당 작업을 수행한다. 이러한 상호작용은 객체 간 협업과 모듈화된 프로그래밍을 가능하게 한다.
OOP의 장점
- 모듈성: 코드의 독립성과 자가 포함성을 높여 유지보수와 협업 개발을 용이하게 한다.
- 재사용성: 상속을 통해 코드 재사용이 가능하여 코드 중복을 줄인다.
- 생산성: 다수의 라이브러리와 재사용 가능한 코드를 활용하여 신속한 프로그래밍 개발이 가능하다.
- 보안성: 캡슐화와 추상화를 통해 데이터 보호와 코드 안전성을 유지한다.
- 유연성: 다형성을 통해 동일한 인터페이스를 사용해도 다양한 기능을 구현할 수 있어 코드 유지보수가 용이하다.
하지만 OOP는 데이터 구성에 중점을 두다 보니 알고리즘 구현에 비중을 두지 않는다는 비판을 받기도 한다. 또한, 상속은 때로 불안정안 기본 클래스를 낳을 수 있으며, 객체가 독립적으로는 명확하지만 실제 프로그램 내에서는 이해하기 어려운 경우가 있다.
참조
https://www.geeksforgeeks.org/introduction-of-object-oriented-programming/
https://www.techtarget.com/searchapparchitecture/definition/object-oriented-programming-OOP
https://limkydev.tistory.com/30
'Java' 카테고리의 다른 글
[AssertJ] Custom Exception (0) | 2024.10.31 |
---|---|
[AssertJ] Exception Assertions (0) | 2024.10.31 |
[JUnit] @Parameterized Test (0) | 2024.10.26 |
Google Java Style Guide (2) | 2024.10.25 |
[Java/김영한] 패키지 (1) | 2024.09.08 |