쉴새없이 달려온 프로그래밍 패러다임,,
마침내, 프로그래밍을 조금이라도 맛본 개발자들이라면
오다가다 자주 마주치는 '객제지향' 에 대해 다뤄보는 시간을 가져볼까 합니다.
'객체(Object)' 란 개념에 대해 미리 선행하였으나,
기억이 가물가물하다면 아래 포스팅을 참고해 주시길 바랍니다.
객체(Object)가 무엇인가요?
객체지향 프로그래밍 패러다임의 시작
데이터의 구조화, 객체(Object)간의 상호작용을 통한 문제해결 제시
객체지향 프로그래밍은
초기 프로그래밍 방식인 절차적 프로그래밍의 한계점을 보완하고자 등장하게 되었습니다.
한계점이라 함은,
프로시저(Procedural, 함수) 를 구성함으로서 구조적 방식을 제안하고자 하였으나,
겉으로 보기에만 그럴듯 하고, 데이터 그 자체로서는 구조화가 되지 못했기 때문입니다.
다시 말해 기존 절차적 프로그래밍의 경우
프로시저 ➟ 구조화를 구현하였을 뿐,
결국엔 순차적 프로그래밍 방식의 한계점으로 귀결되었습니다.
절차적 프로그래밍의 개념
객체지향 프로그래밍이란?
- 객체지향 프로그래밍(Object-Oriented Programming)은 객체간의 상호작용을 중시합니다.
- 문제의 해결을 위해 객체(Object)를 생성한 후, 그들 간의 조합을 통해 해결법을 찾습니다.
- 해당 객체는, 속성(State) 과 행위(Behave) 가 결합된 형태의 데이터입니다.
- 한 사람이 자판기에서 음료를 구매하는 방식(해결법)을 중심으로 예를 들어보겠습니다.
- 절차적 프로그래밍은?
- 전역변수(Global Data)를 조합한 프로시저(함수)를 만들어 순차적으로 해결합니다.
- 명시적인 순서에 따라 프로시저를 나열하여 해결하는 하향식(Top-Down) 방식입니다.
- 객체지향 프로그래밍은?
- 데이터(State, 상태)와 행위(behave)의 구조화를 통해 하나의 객체를 생성합니다.
- 객체간의 조합을 토대로, 문제를 해결하는 상향식(Bottom-up) 방식입니다.
- 절차적 프로그래밍은?
코드를 통해 살펴보는 객체지향 프로그래밍
객체를 만드는 틀, 클래스의 생성에서 시작하는 객체지향 프로그래밍
앞서 살펴보면 객체지향 프로그램에 대해, 간략하게 정리하자면 다음과 같습니다.
"데이터(State)와 행위(Behave)가 담긴 객체(Object)간의 관계를 통해 문제를 해결하는 방식"
그렇다면,
객체(Object)는 어떻게 생성할 수 있을까요?
객체를 만드는 틀, 클래스(Class)
- 클래스(Class)란, 개발자가 객체를 생성하기 위한 일종의 '틀'입니다.
- 클래스는, 동일한 유형 혹은 문제를 해결하기 위해 데이터와 행위를 정의하고 있습니다.
- 또한, 사용자 정의에 의하여 이름이 부여된, 명명된 타입(Named Type)입니다.
Type의 종류 (명명된 타입, 복합타입)
- 즉, 객체란 클래스(Class)란 틀을 이용한 '실체화' 과정을 거쳐 탄생합니다.
- 실체화 과정을 통해, 객체는 '인스턴스(instance)'란 이름으로 재 탄생합니다.
- Swift에서는 객체란 용어가 아닌, '클래스의 인스턴스'란 표현을 주로 사용합니다.
- 클래스가 정의하고 있는 데이터(State)와 행위(Behave)의 용어는 다음과 같이 변경됩니다.
- 데이터(State, 상태) ➟ 프로퍼티(Property, 속성)
- 행위(Behave) ➟ 메서드(Method)
클래스(Class)를 통해 인스턴스를 만드는 과정
- 실제 코드를 통해 클래스의 생성부터 인스턴스화 과정을 살펴보도록 하겠습니다.
- 아래 그림과 같이 Guitar란 이름의 클래스(틀)가 있으며,
- 3개의 속성(Properties)과 2개의 메서드(Method), 행위를 가지고 있습니다.
- Guitar 클래스를 Swift 언어를 활용하여 코드로 작성한다면, 다음과 같습니다.
- 3개의 속성(bodyColor, bodyShape, soundHole)을 선언합니다.
- 추후에 생성할 인스턴스의 속성값은 알 수 없으니 클래스 내부에 init(초기화) 과정을 거칩니다.
- 2개의 메서드(playGuitar, connetToAmp) 또한 내부에 선언합니다.
class Guitar {
// 3개의 프로퍼티(속성)
var bodyColor: String
var bodyShape: String
var soundHole: Bool
// 인스턴스(클래스의 객체)를 생성하기 위해, 프로퍼티의 초기값을 설정
init(bodyColor: String, bodyShape: String, soundHole: Bool) {
self.bodyColor = bodyColor
self.bodyShape = bodyShape
self.soundHole = soundHole
}
// 메서드 1
func playGuitar () {}
// 메서드 2
func ConnectToAmp () {}
}
- 클래스가 완성되었으니, 실체화(객체화)를 통해 인스턴스를 생성할 수 있습니다.
- 인스턴스의 타입은?
- 클래스의 이름(명명된 타입)으로 선언합니다.
- 인스턴스에 할당되는 속성(property)은?
- 클래스 내부에서 미리 초기화(init) 된 프로퍼티(속성)의 값을 직접 작성해야 합니다.
- 할당 연산자(=) 뒤 클래스 이름 을 호출한 후, 속성 값을 작성합니다.
- 인스턴스의 메서드(Method)는?
- 클래스에서 정의한 메서드(Method) 또한 점 문법(.) 을 통해 호출할 수 있습니다.
- 인스턴스의 타입은?
let acoustic: Guitar = Guitar(bodyColor: "Maple", bodyShape: "D-Body", soundHole: true)
acoustic.playGuitar()
acoustic.connectToAmp()
let electric: Guitar = Guitar(bodyColor: "Pink", bodyShape: "Super-Strat", soundHole: false)
electric.playGuitar()
electric.ConnectToAmp()
객체지향 프로그램의 전반적인 개념과
클래스(Class)란 틀을 활용해 인스턴스(클래스의 객체)를 생성하는 방식까지 알아보았습니다.
다음 포스팅에서는,
객체지향 프로그래밍의 특징과 설계 원칙에 대해 다루도록 하겠습니다.
'CS > Computer Basic' 카테고리의 다른 글
[CS/Basic] 메모리 구조는 어떻게 구성되어있을까? (0) | 2023.02.12 |
---|---|
[CS/Basic] 객체지향 프로그래밍의 특징과 설계원칙(SOLID) (2) | 2023.02.01 |
[CS/Basic] 절차적 프로그래밍은 '절차지향'이 아니다! (0) | 2023.01.05 |
[CS/Basic] 그래서, 객체(Object)가 무엇인가요? (0) | 2022.12.29 |
[CS/Basic] 좀 더 나은 프로그램을 위해, 프로그래밍 패러다임 (2) | 2022.12.26 |
댓글