내가 공부하고 있는 Swift는 여러 가지 프로그래밍 패러다임을 차용한 다중 패러다임 프로그래밍 언어이다.
크게 보면 명령형, 객체지향, 그래밍, 함수형, 프로토콜 지향 프로그래밍 패러다임을 차용했고
정확하게는! 함수형 프로그래밍 패러다임과 프로토콜 지향 프로그래밍 패러다임을 지향한다고 한다...
사실 하나만 제대로 학습해도 좋은 성과라고 생각하기에 처음 듣는 단어들이 나올지라도 당황하지 말자..!
어쨌든 결과적으로 Swift에서 가장 강조하는 부분은 함수형 프로그래밍 패러다임과 프로토콜 지향 프로그래밍 패러다임이다.
그럼 나는 왜 Swift를 공부하며 객체 지향 프로그램을 알아야 할까?
-> 기존의 C 언어는 명령형 프로그래밍 패러다임을 차용했으며, C++, JAVA 등의 언어는 명령형, 객체지향 프로그래밍 패러다임을 동시에 차용한 다중 프로그래밍 패러다임 언어이다.
우리의 Swift는 여기에 함수형, 프로토콜 지향 프로그래밍 패러다임을 더한 언어라고 생각하면 된다!
또한 오늘날 대부분의 프로그래밍 언어에서 차용함으로써 알아두면 정말 좋다고 생각한다:)
객체지향
C언어를 조금이라도 해봤으면 알 수 있는 명령형(절차적) 프로그래밍은 "무엇을 어떤 절차로 할 것인가"가 핵심이 된다.
즉, 어떤 기능을 어떤 순서로 처리하는가에 초점을 맞춘 반면,
객체 지향 프로그래밍(Object-Oriented Promgramming, 이하 OOP)은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나
여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하여, 객체 간의 상호작용으로 프로그램의 동작을 구현하고자 하는 것이다.
OOP의 장점
- OOP는 프로그램을 유연하고 쉽게 변경할 수 있도록 작성할 수 있어서 대규모 소프트웨어 개발에 많이 사용된다.
- 또한 객체라는 개념만 잘 이해하면 프로그래밍을 더 쉽게 배울 수 있으며, 소프트웨어 개발과 유지보수에 용이하고, 직관적으로 코드를 분석할 수 있다는 장점이 있다.
- 소프트웨어 공학의 관점에서 소프트웨어의 질의 향상을 위한 강한 응집력(Strong Cohesion)과 약한 결합력(Weak Coupling)을 지향한다.
응집력, 결합력이란?
응집력: 프로그램의 한 요소가 해당 기능을 수행하기 위해 얼마만큼의 연관된 책임과 아이디어가 뭉쳐있는지를
나타내는 정도.
지나치게 많은 일을 하지 않으면 그것을 응집력이 강하다고 표현하고 응집력이 강하면 프로그램을 쉽게 이해할 수 있으므로 유지보수성이 높아진다.
응집력이 약할 시 문제점
1. 이해하기 힘들다.
2. 재사용하기 힘들다.
3. 유지보수가 힘들다.
4. 다른 클래스의 변화에 민감하다. (현재 내가 만들고 있는 공학용 계산기 프로젝트의 문제점...ㅠ)
결합력: 소프트웨어 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지, 또한 얼마나 의존적인지를 나타내는 정도이다.
프로그램의 요소가 결합력이 약하다는 것은 그것이 다른 요소들과 관계를 그다지 맺지 않은 상태를 의미한다.
결합력이 강할 시 문제점
1. 연관된 다른 클래스가 변경되면 더불어 변경해야 한다.
2. 수정하려는 클래스를 이해하기 위해 연관된 다른 클래스를 함께 이해해야 한다.
3. 나중에 다른 프로그램에서 클래스를 재사용하기 힘들다.
객체지향 프로그래밍은 클래스에 하나의 문제 해결을 위한 데이터와 메서드를 모아놓은 방식으로 응집력을 강화한다.
또한, 각 클래스는 독립적이 되도록 디자인해 결합력을 약화한다.
그러나, 실제 세계의 모습을 프로그램 안에 구현하고자 했던 OOP지만, 지나친 프로그램의 객체화 경향 때문에 오히려 실제 세계의 모습을 그대로 반영하기 어렵다는 비판도 있다.
OOP의 특징
주요 특징으로는 자료 추상화, 상속, 다형성, 캡슐화 등이 있다.
- 자료 추상화(Abstraction): 객체들의 공통적인 property와 method를 뽑아내는 작업. 객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다. (JavaScript처럼 클래스가 없는 객체지향 언어도 존재한다.)
ex) 자동차를 추상화했을 때
-> 전진(), 후진() method는 모든 자동차의 공통 method가 되지만, 뚜껑 오픈()과 같은 method는 모든 자동차에 해당되는 공통된 기능이 아니므로 추상화 작업 시에 배제해야 한다.
- 상속(Inheritance): 물려받는다 라는 의미로 추상화에서 예시로 든 자동차를 다시 예로 들면, 모든 자동차는 바퀴가 있고, 핸들이 있는 특징 등 공통적인 정보들을 갖고 있어야 한다. 기존 코드를 재활용하여 사용함으로써 객체지향의 중요한 기능 중 하나에 속한다.
- 다형성(Polymorphism): 다형성이란 하나의 메서드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다.
키보드의 키를 통해서 비유를 들어보겠다. 키보드의 키를 사용하는 방법은 '누른다'이다. 하지만 똑같은 동작 방법의 키라고 하더라도 ESC는 취소를 ENTER는 실행의 목적을 가지고 있다. 다형성이란 동일한 조작방법으로 동작시키지만 동작방법은 다른 것을 의미한다.
정리하자면, 동일한 명령(누른다)의 해석을 연결된 객체(ESC, ENTER)에 의존하는 것이다. - 캡슐화(Encapsulation): 객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것이다.
실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있고(보안성 향상), 데이터를 보이지 않고 외부와 상호작용을 할 때는 method를 이용하여 통신을 한다. 보통 라이브러리로 업그레이드해 사용할 수 있다.
OOP의 단점
OOP는 캡슐화와 격리 구조 때문에 절차 지향 프로그래밍과 비교하면 실행 속도가 느리다.
또한, OOP에서는 모든 것을 객체로 취급하기 때문에 추가적인 포인터 크기의 메모리와 연산에 대한 비용이 들어가게 된다.
단점을 세 가지로 정리하자면,
- 느린 개발 속도: 모든 객체의 역할과 기능을 이해해야 하기 때문에 프로그래밍에 많은 시간이 소요됨.
- 느린 실행 속도: 위 그림처럼 OOP의 처리 속도는 절차 지향 언어보다 느림.
- 높은 난이도: 다중 상속이 지원되는 언어 같은 경우에 복잡해질 수 있어서 개발의 난이도가 상승함.
객체지향은 정말 매력적인 패러다임이라고 생각하며 내 경험을 통해 느낀 것은 설계과정이 가장 중요하다고 생각한다.
다만, 캡슐화를 통한 직관적인 코드를 통한 유지보수나 생산성이 설계에서 많은 부분이 꼬여버리면 오히려 개발을 하는데에 있어서 어려움으로 다가올 수도 있다.
현재 내가 만들고 있는 공학용 계산기에서 느낀 문제이다..ㅠ
앱 개발 포스팅이 요즘 뜸한 이유는 개발을 하지 않아서가 아니라 생각보다 많은 시간이 소요된다. 특히! 계산기에서 예외 처리할게 끝도 없이 나오는 느낌이다.
그래서 조금 느리더라도 나에게 보이는 예외사항들은 처리를 하고 프로젝트를 완료하고 싶다. 😁
참고 자료
https://debugdaldal.tistory.com/149
http://www.incodom.kr/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5
https://blog.naver.com/gitacademy01/222394033958
참고문헌: 야곰의 스위프트5: 42p ~ 44p
'Swift' 카테고리의 다른 글
Swift) ch7.함수 (0) | 2022.06.27 |
---|---|
Swift) ch6.흐름 제어 (0) | 2022.06.24 |
Swift) ch5.연산자 (0) | 2022.06.22 |
Swift) ch4.데이터 타입 고급 (0) | 2022.06.19 |
Swift) ch3.스위프트 처음 시작하기 (0) | 2022.06.15 |
댓글