남궁성님의 Java의 정석(3rd Edition)을 보고 정리한 글입니다.
1. 객체지향 프로그래밍(OOP, Object-Oriented Programing)
객체지향 프로그래밍이란 프로그래밍에 필요한 데이터와 행위를 가진 객체를 만들고, 객체에게 적당한 책임을 할당하고 그 객체들 간의 유기적인 상호작용을 통해 논리적인 흐름(로직) 구성하는 프로그래밍 방법이다.
객체지향 프로그래밍을 한미디로 정리하면 객체들 간의 상호작용을 통해 프로그래밍하는 방법이다. 그럼 객체지향에서 말하는 객체가 무엇일까?
2. 클래스 / 객체 / 인스턴스
a. 클래스(Class)란?
- 객체를 정의하고 만들어 내기 위한 설계도를 의미한다.
- 속성(필드) + 행위(메서드)로 구성된다.
- 사용자 정의 타입이라고도 하며, 서로 관련된 값을 묶어서 하나의 타입으로 정의한다.
b. 객체(Object)란
- 자신 고유의 속성을 가지는 물리적, 추상적인 모든 대상을 일컫는다.
- 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있다.
c. 인스턴스(Instance)란
- 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 한다.
- 클래스를 사용하여 JVM 메모리의 힙 영역(Heap Area)에 새로운 인스턴스를 생성한다.
- 객체 하나하나를 구체적인 의미로 인스턴스라 부르며 객체와 인스턴스는 혼영해서 표현한다.
실생활 예시
붕어빵을 만드는 상황에 빗대어 보자.
여기서 클래스는 붕어빵 틀이 되고, 객체는 붕어빵이다. 그리고 인스턴스는 실제 붕어빵 틀어 찍어낸 각각의 붕어빵이다. 팥붕어빵과 슈크림 붕어빵은 같은 타입의 객체이지만, 인스턴스 관점에서 보았을 때는 다르다.
인스턴스는 실제 메모리 상에 존재하는 각각의 객체라고 정리할 수 있다.
3. 객체지향의 특징과 설계원칙
a. 객체지향 4가지 특징
- 추상화(Abstraction): 객체의 공통적인 속성과 기능을 추출하여 정의한 것(복잡성↓)
- 다형성(Polymorphism): 하나의 타입에 여러 객체를 대입할 수 있는 성질(유지보수 ↑)
- 캡슐화(Encapsulation): 객체 내부의 세부사항 외부로부터 감추는 것
- 상속(Inheritance): 상위 클래스 기능을 하위 클래스가 사용할 수 있는 개념(재사용 용이)
b. 객체지향의 5가지 설계 원칙(SOLID)
- SRP(단일 책임의 원칙): 하나의 책임을 가진다.
- OCP(개방 폐쇄의 원칙): 기존 코드를 변경하지 않고 기능을 추가할 수 있어야 함.
- LSP(리스코프 치환의 원칙): 상위타입의 객체를 하위타입의 객체로 치환해도 정상적으로 동작해야 한다.
- ISP(인터페이스 분리의 원칙): 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- DIP(의존성 역전의 원칙): 클라이언트가 구현체에 의존하지 않고, 인터페이스에 의존해야 한다.
4. 객체지향 프로그래밍의 장단점
a. 장점
- 유지보수가 쉬움 ⇒ 높은 응집도와 낮은 결합도로 인해 변경이 편리
- 코드 재사용 용이 ⇒ 미리 만들어진 클래스를 가져와서 이용할 수 있고, 상속을 통해 확장해서 사용 가능
b. 단점
- 설계 시 많이 시간과 노력 요구 ⇒ 객체가 처리할 책임에 대한 이해가 필요하기에 설계가 중요
- 처리 속도가 상대적으로 느림 ⇒ 캡슐화와 격리구조로 인해 절차지향에 비해 속도가 느림
5. 정리
객체지향 프로그래밍은 객체간의 유기적으로 상호작용하며 논리적으로 프로그래밍 하는 방식이다.
객체지향의 SOLID 원칙을 준수하면 프로그램을 설계하면 코드의 중복을 줄이며 유지보수에 많은 이점을 가져다 준다.
'Programming > Java' 카테고리의 다른 글
[Java] 매개변수를 전달하는 방법(기본타입, 참조타입) (0) | 2023.10.13 |
---|---|
[Java] JVM 구조 (0) | 2023.10.13 |
[Java] 배열(Array) (0) | 2023.10.09 |
[Java] 조건문과 반복문 (1) | 2023.10.09 |
[Java] 변수(Variable) (0) | 2023.10.09 |