[Introduction to Kotlin] 객체 지향 프로그래밍, OOP
If you are a programmer, you may have heard about OOP.
객체 지향 프로그래밍이란?
객체 지향 프로그래밍(OOP, Object-oriented Programming)은 객체(object)라는 개념을 기반으로 프로그램의 기능을 수행하는 프로그래밍 패러다임이다.
각 객체는 상태(state)와 행동(behavior)으로 정의될 수 있으며, 객체의 현재 상태는 필드(fields)로 표현되며 객체의 행동은 메서드(method)로 표현된다.
OOP의 기본 원칙
OOP에는 4가지 주요한 원칙이 있다.
- 캡슐화(encapsulation)
- 추상화(abstraction)
- 상속(inheritance)
- 다형성(polymorphism)
위의 원칙은 OOP의 핵심이나, 객체 지향 언어(ex, python, kotlin, java, …)마다 개념을 구현하는 방식은 다르다. 그렇지만, 근본적인 원칙은 동일하다.
캡슐화(Encapsulation)
캡슐화는 데이터를 보호하고, 해당 데이터를 조작하는 메서드를 하나의 단위로 묶는 것을 의미한다.
또한 객체가 자신의 내부 속성과 메서드를 숨기는 기능을 제공한다.
이를 통해 외부에서 직접적으로 객체 내부의 데이터를 수정하는 것을 방지 할 수 있다.
추상화(Abstraction)
추상화는 객체가 불필요한 내부 구현을 숨기고, 필요한 정보만 제공하도록 하는 개념이다.
사용자는 객체의 내부 동작 방식까지 알 필요 없이, 객체가 제공하는 기능만 이용하면 된다.
즉, 객체의 가장 중요한 특징만을 표현하는 것이 추상화의 핵심이다.
상속(Inheritance)
상속은 부모-자식(parent-child) 관계를 정의하는 메커니즘으로, 기존 클래스를 기반으로 새로운 클래스를 생성할 수 있도록 한다.
객체들이 서로 비슷한 점이 많을 경우, 상속을 활용하면 공통된 기능을 재사용 하면서도 새로운 기능을 추가할 수 있다.
다형성(Polymorphism)
다형성이란 여러 가지 형태를 가질 수 있음을 의미한다.
이는 상속과 연관된 개념으로, 동일한 메서드 이름을 가지지만 각 클래스마다 다르게 동작할 수 있도록 한다.
그 예시로 웹사이트에서 게시되는 콘텐츠에는 뉴스, 공지사항, 기사 등이 있을 수 있다. 이 게시글들은 모두 제목, 본문, 작성 날짜를 가진다는 공통점이 있지만, 뉴스는 출처, 기사는 저자, 공지사항은 유효기간 등의 고유한 특징을 가지고 있다.
위와 같이 공통된 속성을 추상 클래스에 정의하고, 각 타입별 고유한 특징을 자식 클래스에서 구현하면 중복코드를 줄일 수 있다.
객체
OOP에서 가장 중요한 개념은 객체이다.
현실 세계에서는 고유의 속성(attributes)을 가진 수많은 객체가 존재한다. 예시
- 건물
- 속성
- 층 수
- 건축 연도
- 면적
- …
- 속성
- 비행기
- 속성
- 모델 이름
- 승객 수용량
- 속도
- …
- 속성
이러한 속성과 행동(methods)들을 정리하여 프로그래밍에서 객체로 표현할 수 있다.
클래스
비슷한 속성을 가진 객체들은 동일한 유형(type)이나, 클래스(class)에 속한다고 할 수 있다.
클래스는 비슷한 객체들의 공통적인 구조(속성과 메서드)를 정의하는 청사진 또는 템플릿 역할을 한다.
즉, 클래스는 객체를 생성하기 위한 설계도이며, 객체는 클래스의 인스턴스(instance)이다.
캡슐화와 클래스
클래스는 하나의 블랙 박스처럼 다루어진다.
즉, 사용자가 클래스가 제공하는 메서드만 알면 되고, 내부 구현은 알 필요 없다.
예시 1: 건물 클래스(Building Class)
건물은 아래와 같은 속성을 가질 수 있다.
- 층 수(정수)
- 면적(실수, 제곱미터)
- 건축 연도(정수)
각 건물 객체는 동일한 속성을 가지지만, 값은 다를 수 있다.
예시
1
2
3
4
5
6
7
8
9
- 건물 1
층 수 = 4
면적 = 2400.16m^2
건축 연도 = 2023
- 건물 2
층 수 = 6
면적 = 3200.54m^2
건축 연도 = 1990
예시 2: 비행기 클래스(Plane Class)
비행기는 아래와 같은 속성을 가질 수 있다.
- 모델명(문자열)
- 승객 수용량(정수)
- 표준 속도(정수)
- 현재 좌표(위치 정보를 위한 속성, 위도와 경도)
비행기는 승객을 두 지점 사이에서 이동시키는 행동(메서드)을 가진다. 이 행동을 수정하면 비행기의 현재 좌표가 변경된다.
예시
1
2
3
4
5
6
- 비행기 1
모델명 = "Boeing 777"
승객 수용량 = 1,000
표준 속도 = 500
현재 좌표 = 서울(37.5665° N, 126.9780° E)
비행시작(출발지 = 서울, 도착치 = LA(34.0522° N, 118.2437° W)
객체와 클래스의 관계
OOP에서는 프로그램을 다양한 객체들의 조합으로 구성할 수 있다.
객체의 상태(state)와 행동(behavior)은 보통 함께 다루지만, 항상 그런 것은 아니다.
그 예시로 인터페이스(interface)는 객체의 사용 방법을 정의하지만, 자체적인 상태나 동작을 가지지 않는다.
또한, C++의 경우 구조체(struct)처럼 데이터 저장을 위한 객체도 존재한다.
OOP 정리
OOP는 건축 설계와 비슷하다.
설계도(클래스)를 만들고, 이를 기반으로 개별적인 건물(객체)을 건설한다.
건물(객체)의 거주자(사용자)는 내부 구조를 몰라도 제공되는 기능을 사용할 수 있다.
이러한 개념을 캡슐화라고 한다.
OOP는 C++, C#, Java, Kotlin, Python 등의 여러 프로그래밍 언어에서 중요한 역할을 한다.
객체 지향 프로그래밍을 익히면 깔끔하고 유지보수가 쉬운 코드를 작성할 수 있으며, 이는 모든 프로그래머가 가져야할 역량이다.
마치며,,
Kotlin 강의에서 객체 지향 프로그래밍에 대해 간단하게 다루어 주었다.
사실 객체 지향 프로그래밍에 대해 설명하기는 어렵지만 추상적으로 알고 있었는데, 간단하게 잘 설명되어 있어 머릿 속으로 쉽게 정리 되었다.
그런데, 객체 지향 프로그래밍이라는 것이 여러가지 함정도 있고 이 내용만으로 여러 권의 책을 섭렵해야하는 것으로 알고 있는데,
추후 객체 지향 프로그래밍 관련 서적을 공부하여 저 자세히 공부해보면 좋을 것 같다.