📍 객체 지향 프로그래밍이란?
프로그래밍에서 필요한 데이터를 추상화시켜, 상태와 행위를 가진 객체로 만들고 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍 패러다임을 의미
여러 독립적인 부품들의 조합
객체 지향 프로그래밍의 장점
- 유연하고 변경이 용이
- 레고 블럭 조립하듯이 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법
- 각 컴포넌트들이 독립적인 역할을 가지기에 코드의 변경을 최소화하고 유지보수하는 데 유리
- 코드의 재사용을 통해 반복적인 코드 최소화하고 간결히 표현
- 인간 친화적이고 직관적인 코드 작성에 용이
📍 객체 (Object)
객체 지향 프로그래밍의 가장 기본적인 단위이자 시작점
객체란, 모든 실재하는 대상 / 우리가 보고 느끼는 인지할 수 있는 모든 것을 의미
객체를 추상화시켜 속성(state)와 기능(behavior)으로 분류하여 각각 변수(variable)와 함수(function)으로 정의
📍 객체 지향 프로그래밍 4가지 특징
☑️ 추상화 (Abstraction)
공통적인 부분만을 추출하여 표현하는 것
예시를 보면 자동차와 오토바이는 모두 이동 수단이며 전진과 후진을 할 수 있다는 공통점이 존재한다.
자동차와 오토바이라는 하위 클래스(sub-class)들의 공통적인 기능(전진, 후진)을 추출하여 이동 수단이라는 상위 클래스(super class)에 정의한다.
자바에서 추상화를 구현할 수 있는 문법 요소로는 추상 클래스와 인터페이스가 있다.
[Vehicle 인터페이스]
자동차와 오토바이의 공통적인 부분을 추출해서 이동 수단 인터페이스에 정의
객체 지향 설계에서 인터페이스는 어떤 객체의 역할만을 정의하여 객체들 간의 관계를 보다 유연하게 연결하는 역할 담당
즉, 객체가 수행해야 하는 핵심적인 역할만 규정해두고 실제적인 구현은 해당 인터페이스를 구현하는 각각의 객체들이 하도록 설계하는 것을 의미한다.
[Car, MotoBike class]
Car와 MotorBike 클래스에서 Vehicle 인터페이스에서 정의한 역할을 각각의 클래스에 맞게 구현하고 있다.
이를 객체 지향 프로그래밍에서는 역할과 구현의 분리하고 한다.
☑️ 상속 (Inheritance)
기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소이다.
클래스 간 공유될 수 있는 속성과 기능들을 상위 클래스로 추상화시켜 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용할 수 있도록 한다.
[Vehicle 클래스 (상위 클래스)]
[Car, MotoBike class]
extends 키워드를 통해서 각 하위 클래스로 속성과 기능을 확장하였다. 이를 통해서 공통적인 코드의 변경이 있는 경우 상위 클래스에서 단 한 번의 수정으로 모든 클래스에 변경 사항이 반영될 수 있다.
또한, MotorBike에서 상위 클래스의 기능과 속성들을 그대로 사용할 수 있지만 각각의 클래스의 맥락에 맞게 메서드 오버라이딩(Overriding)을 사용하여 내용을 재정의할 수 있다.
추상화(인터페이스) vs 상속
상위 클래스 - 하위 클래스 관계를 전제로 공통적인 속성과 기능을 공유할 수 있다는 공통점이 존재
BUT
인터페이스를 통한 구현은 반드시 인터페이스에 정의된 추상 메서드의 내용이 하위 클래스에 정의되어야 하며
상속의 경우 상위 클래스의 속성과 기능을 하위 클래스에서 그대로 받아 사용하거나 오버라이딩을 통해 선택적으로 재정의하여 사용할 수 있다는 차이점이 존재한다.
☑️ 다형성 (Polymorphism)
어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미
- 메서드 오버라이딩, 메서드 오버로딩
- 역할과 구현을 분리
- 역할 = 인터페이스
- 구현 = 인터페이스를 구현한 클래스, 구현 객체
- 객체를 설계할 때 역할과 구현을 명확히 분리
- 객체 설계시 역할을 먼저 부여, 그 역할을 수행하는 구현 객체 만들기
메서드 오버라이딩
- 상속 관계에 있는 두 클래스에서 같은 이름, 같은 매개변수를 가지는 메서드를 재정의하는 것.
- 즉, 자식 클래스에서 부모 클래스의 메서드를 재정의해서 자신만의 기능을 구현하는 것
메서드 오버로딩
- 하나의 클래스 안에서 같은 이름의 메서드를 여러 개 정의하는 것
- 단, 매개변수의 개수나 타입이 달라야 한다
- 같은 이름의 메서드를 다양한 매개변수를 통해 호출할 수 있도록 하는 것
☑️ 캡슐화 (Encapsulation)
서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것을 의미
캡슐화를 하는 이유
- 데이터 보호 - 외부로부터 클래스에 정의된 속성과 기능들을 보호
- 데이터 은닉 - 내부의 동작을 감추고 외부에는 필요한 부분만 노출
이를 통해서 각 객체의 고유한 독립성과 책임 영역을 안전하게 지키고자 하는 목적이 있다.
자바 OOP에서 캡슐화를 구현하는 방법
- 접근제어자 활용 (클래스나 멤버들을 외부에서 접근하지 못하도록 접근을 제어하는 역할)
접근 제어자 | 클래스 내 | 패키지 내 | 다른 패키지의 하위 클래스 | 패키지 외 | 설명 |
private | O | X | X | X | 동일 클래스 내에서만 접근 가능 |
default | O | O | X | X | 동일 패키지 내에서만 접근 가능 |
protected | O | O | O | X | |
public | O | O | O | O | 접근 제한 없음 |
- getter/setter 메서드 사용
참고: https://github.com/devSquad-study/2023-CS-Study/blob/main/java/java_object_oriented.md
'CS > Java' 카테고리의 다른 글
Call by Value & Call by Reference (0) | 2025.03.24 |
---|---|
Xms, Xmx (0) | 2025.03.21 |
JDK / JRE (0) | 2025.03.21 |
JVM (Java Virtual Machine) (1) | 2025.03.13 |
Java Build Tool - Gradle/Maven (1) | 2025.03.11 |