스위프트의 언어적 특성
- Safe 안전성
- Fast 신속성
- Expressive 더 나은 표현성
스위프트를 공부하면 공부할수록 해당 언어에 대해 매력을 느끼곤 한다.
대표적으로 Optional. 프로그래머가 할 수 있는 실수를 엄격한 문법을 적용함으로써 미연에 방지하고자 고안한 것이다.
또한 스위프트는 다른 프로그래밍 언어들을 참고하여 더 나은 문법을 구현하려 노력하였다. 지금도 계속해서 더욱 보기 좋고 쓰기 좋은 언어로 발전하고 있다.
스위프트는 '함수형 프로그래밍'과 '프로토콜 지향 프로그래밍' 패러다임을 차용하고 있는 언어이다.
구체적으로 말하면, 명령형과 객체 지향 프로그래밍 패러다임을 기반으로 한 함수형 프로그래밍 + 프로토콜 지향 프로그래밍 패러다임을 지향한다.
본 글에서는 본격적으로 스위프트를 공부하기 전에, 객체지향 프로그래밍과 함수형 프로그래밍에 대해서 공부하면서 정리하였다.
이후에 추가적으로 공부한 내용이 있다면 계속해서 업데이트 할 것이다.
객체 지향 프로그래밍?
(2024.04.05)
객체지향 프로그래밍이란 무엇일까? ChatGPT 에게 물어보았다.
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나로, 프로그램을 객체라는 기본 단위로 구성하는 방식을 말합니다. 객체지향 프로그래밍은 데이터(속성)와 그 데이터를 처리하는 데 필요한 프로시저(메서드)를 객체로 묶어서 관리합니다.
그렇다면, 객체 지향 프로그래밍을 사용하는 이유는?
- 모듈성
- 재사용성
- 확장성
Swift 와 같은 객체지향 프로그래밍 언어에서는 독립적인 객체(Object)들로 구성되어 있다. 각 객체는 자신만의 데이터와 기능을 가지고 있기에, 만약 문제가 발생한다면 어떤 객체에서 문제가 일어났는지 쉽게 파악할 수 있을 것이다. - 모듈성
'상속'을 통해 한 클래스의 필드와 메서드를 다른 클래스가 물려받을 수 있다. 이렇게 코드 재사용성을 촉진하고 중복을 줄임으로써, 개발 시간을 크게 단축 시킬 수 있다. - 재사용성
또한 소프트웨어의 확장성과 유지보수를 용이하게 할 수 있다. 새로운 기능이 필요할 때, 기존 코드를 수정하지 않고도 새로운 객체를 추가함으로써 기능을 확장시킬 수 있기 때문이다. - 확장성
객체 지향 프로그래밍에서 주로 다루는 용어
크게 세 가지가 있다.
클래스 Class, 객체 Object, 메서드 Method
클래스
- 객체를 생성하기 위한 '설계도' 로서, 객체의 기본 구조를 정의하고 있다. 여기에는 객체가 가지고 있어야 할 데이터와 그 데이터를 조작할 수 있는 기능(메서드)이 포함된다.
- 다시 말해 클래스란, 실제 세계의 개념이나 사물을 추상화한 것으로, 예를 들어 '동물', '차', '사람' 과 같은 카테고리를 클래스로 표현할 수 있다.
- 클래스는 다른 클래스 또는 외부 요소와 '독립적으로 디자인' 되어야 한다.
객체?
- 클래스의 인스턴스.
- 클래스가 실제로 메모리 상에 할당되어 동작할 때, 그것을 객체라고 할 수 있다.
- Person 클래스의 '홍길동'이 바로 객체.
객체와 인스턴스는 동의어가 아니다. 인스턴스는 클래스, 구조체, 열거형에도 있기 때문에 정확하게 말해서, 객체란 '클래스의 인스턴스'이다. ('객체 != 인스턴스'. '객체 == 클래스의 인스턴스')
메서드
- 객체가 클래스에 정의된 행위를 실질적으로 하는 함수. 즉, 클래스 내에서 정의된 함수.
- 메서드를 통해 객체에 명령을 전달할 수 있다.
- Person 클래스의 '말하기', '걷기' 등이 바로 메서드.
간단한 코드 예제
class SomeClass {
var someProperty: Any = 1
func someMethod() {
// some task ...
}
}
let myInstance: SomeClass = SomeClass()
// SomeClass 클래스의 이니셜라이저 호출하여, myInstance 상수에 할당.
// 클래스의 이니셜라이저 통해 메모리에 할당되고 초기화한 객체가 바로 '인스턴스'
myInstance.someProperty = 100 // 인스턴스의 프로퍼티에 값 할당
print(myInstance.someProperty)
myInstance.someMethod()
함수형 프로그래밍?
가장 큰 장점은, 대규모 병렬처리가 쉽다는 것.
함수형 프로그래밍 패러다임은 프로그램이 상태의 변화 없이 데이터 처리를 수학적 함수 계산으로 취급하고자 하는 패러다임이다.
순수하게 함수에 전달된 인자 값만 결과에 영향을 준다. -> 객체의 상태 값(포인터 등)을 갖지 않고 순수하게 함수만으로 동작한다. 따라서 어떤 상황에서 프로그램을 실행하더라도 일정하게 같은 결과를 도출할 수 있다. 그렇기에 병렬 처리 시 부작용이 거의 없다.
주요 개념과 특징
- 순수 함수(Pure Functions): 동일한 입력에 대해 항상 동일한 출력을 반환하며, 부작용이 없는 함수. (함수를 쉽게 예측할 수 있기에 테스트 등이 용이함)
- 일급 객체(First-Class Citizens)로서의 함수: 함수를 다른 데이터 타입처럼 변수에 할당하거나, 다른 함수의 인자로 전달하거나, 함수로부터 반환될 수 있다.
- 고차 함수(Higher-Order Functions): 다른 함수를 인자로 받거나 함수를 결과로 반환하는 함수.
이 외에 데이터 불변성, 여러 함수를 하나로 합성할 수 있는 특징이 있다.
따라서 함수형 프로그래밍은 병렬 처리와 비동기 처리가 중요한 대규모 및 분산 시스템, 웹 앱 개발 등에 유용한 것이다!
...
이 중 '일급 객체' 에 대해서 좀 더 알아보자면,
우선 일급 객체가 되기 위해서는 아래 조건을 모두 충족해야 한다.
- 전달인자(Argument)로 전달할 수 있다.
- 동적 프로퍼티 할당이 가능하다.
- 변수나 데이터 구조 안에 담을 수 있다.
- 반환 값으로 사용할 수 있다.
- 할당할 때 사용된 이름과 관계없이 고유한 객체로 구별할 수 있다.
스위프트의 함수는 이 조건을 모두 충족하기에, 일급 객체로 취급한다.
함수가 일급 객체가 된다 -> 다양한 종류의 함수를 호출하고, 전달하고, 반환하는 동작만으로 프로그램 구현 가능하다!
함수형 프로그래밍을 사용하는 이유 정리
- 여러 가지 연산 처리 작업이 동시에 일어나는 프로그램을 만들기 쉽다
- 멀티 코어, 여러 개 연산 프로세서를 사용하는 시스템에서 효율적인 프로그램을 만들기 쉽다
- 상태변화에 따른 부작용에서 자유로워지므로 순수하게 기능 구현에 초점을 맞추어 설계할 수 있다
프로토콜 지향
스위프트에서는 구조체, 열거형에 기존의 클래스에서 구현할 수 있었던 캘슐화, 추상화, 접근 제어를 모두 구현할 수 있다.
프로토콜에 익스텐션을 활용할 수 있기에, 이는 참조 타입의 참조 문제에서 조금 더 자유로울 수 있고, 다중 상속이 불가능한 한계를 뛰어넘을 수 있으며, 더 나은 추상화 메커니즘을 구현할 수 있다.
앞으로 더 공부할 내용
1. 객체지향 프로그래밍과 스위프트
- 클래스와 구조체
- 프로퍼티와 메서드
- 인스턴스 생성 및 소멸
- 접근 제어
2. 함수형 프로그래밍과 스위프트
- 클로저
- 옵셔널 체이닝과 빠른 종료
- 맵, 필터, 리듀스
- 모나드
3. 프로토콜 지향 프로그래밍
레퍼런스
스위프트 프로그래밍 - 야곰