0. 도입
그 전에, Swift가 어떤 특징을 갖는 언어인지 알아야 된다.
- ARC (따로 공부하자!)
- Compile 언어
- 빌드 전 컴파일 시점에 타입을 결정짓는 정적언어 → 그래서 타입 오류나면 빨간오류 뜸
- 덕분에 안전성이 높고, 대규모 프로그램 개발에 적합
- 함수형 프로그래밍 언어
- 함수를 일급객체로 보기 때문에, 함수 자체를 매개변수나 반환타입으로 사용 가능
- 프로토콜형 프로그래밍 언어
- 값타입의 구조체와 열거형, 프로토콜을
- 객체지향 프로그래밍 언어
1. 객체지향 프로그래밍
객체와 객체간의 관계를 설계하는 프로그래밍
객체지향 프로그래밍에서 중요한 키워드는
클래스, 객체, 프로퍼티(상태, 속성, 데이터), 메소드(행위, 동작, 메시지)
- 클래스는 객체를 구성하기 위한 틀이다. like, 붕어빵틀 - 팥붕어빵/슈붕/초붕
- 객체는 이름, 상태(프로퍼티), 행위(메소드)를 갖는다.
- 객체는 클래스의 인스턴스이고, 클래스를 실사화한 것이다.
- 객체는 하나의 역할을 수행하는 데이터와 메소드의 묶음, 메시지를 전달받을 수 있는 대상swift에서는 struct, class, enum이 객체가 될 수 있다.
ex). 손님/바리스타/커피 - 객체에는 데이터와 메소드가 있는데, 코드로 보면 이해하기 쉽다.
- 클래스를 메모리에 올리면 객체화가 되고, 객체들의 속성과 명령어가 실행되면서 프로그램이 실행된다.
class SomeClassName {
var someVariable1 = "1"
var someVariable2 = 2
func someFunction1() {
}
func someFunction2() {
}
}
- someVariable1/2는 데이터에 속하고, someFunction1/2는 메소드에 속한다.
2. 객체지향 프로그래밍의 5가지 특징
1. 추상화
객체의 공통적인 기능과 특성을 추출해 정의하는 것. 즉, 불필요한 것을 지우고 핵심만 남긴다.
복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것
구체적이지 않기 때문에 ‘추상’화라고 하는 것
ex). 토끼, 사자, 호랑이, 사람, 기린, 곰, 코뿔소 → 포유류
ex). 삼성전자, NAVER, LG화학, 현대차, SK하이닉스 → 코스피200
class 삼성전자 {
var name = "삼성전자"
func 매수하기() { print("삼성전자 매수하기" }
func 매도하기() { print("삼성전자 매도하기" }
}
class LG화학 {
var name = "LG화학"
func 매수하기() { print("LG화학 매수하기" }
func 매도하기() { print("LG화학 매도하기" }
}
class 코스피200 {
var name: String = "종목이름"
func 매수하기() { print("\\(name) 매수하기" }
func 매도하기() { print("\\(name) 매도하기" }
}
→ 코스피200의 공통적인 속성과 특징을 클래스를 통해 정의한 것
2. 캡슐화 & 3. 정보의 은닉화
객체의 속성과 행위를 하나로 묶어 내부적으로만 필요한 연산, 변수, 메소드를 외부로부터 감추는 것이다.
(은닉화는 캡슐화를 통해 얻어지는 효과이다. 실제 구현 내용 일부를 외부로부터 감추는 효과)
- 외부에서 내부 정보를 직접 접근해 변경하는 것을 막아서 오류 범위 최소화시킨다.
- 객체 내 정보 손상, 오용방지
- 객체에게 메시지를 던지는 방식으로 속성 변경을 요청할 수 있다.
- 데이터가 변경되어도 다른 객체에 영향을 주지 않는 독립성을 갖고 있다.
- 데이터는 공개하지 않고, 메소드만 일부 외부에 공개한다.
- 은닉화는 접근제어자를 통해 가능
ex). 접근제어자를 사용해 은닉화
class Person {
private var location = "서울"
func goToGwangju() {
location = "광주"
}
}
let ruhee = Person()
ruhee.goToGwangju()
- 여기서 location이라는 데이터가 private 제한자로 외부에서 접근을 막았기 때문에, 해당 속성을 변경하기 위해서는 Person 클래스의 객체인 ruhee의 goToGwangju()라는 메소드(메시지)를 통한 응답으로 변경시킬 수 있다.
🔎 객체의 행위와 속성을 묶으면 응집도가 올라가 자율적인 객체가 된다는 장점이 있다.
🔎 그런데, 은닉화가 이뤄지지 않으면 객체 외부에서 속성을 꺼내 수정하게 되고, 그러면 높은 결합도와 낮은 응집도를 지닌 수동적인 객체가 된다.
4. 상속성
상위의 것을 하위의 것이 물려받는다. 즉, 서브클래싱이라고 볼 수 있다.
이를 통해 기능의 확장이 가능하고, 재사용을 통해 코드의 길이를 줄여 가독성을 높일 수 있다.
5. 다형성
상속과 연관되어 있는데, 한 부모에서 다른 자식들이 나온다는 것으로 이해하면 된다. 즉, 다양한 형태로 나타날 수 있는 형태.
동일한 요청에 대해 각각 다른 방식으로 응답할 수 있도록 만드는 것
override : 재정의→ sayName()이라는 동일한 요청에 객체마다 다른 응답 - 루희 / 찬미 다름
class Person {
func sayName() { print("이름") }
}
class Ruhee: Person {
override func sayName() { print("루희") }
}
class ChanMi: Person {
override func sayName() { print("찬미") }
}
overload : 함수의 이름은 같지만 매개변수와 반환값이 다른 것→ 매개변수에 따라 다른 응답
func myFunction() { ~ }
func myFunction(param: Int) { ~ }
func myFunction(param: String) { ~ }
참고자료
'⭐️ 개발' 카테고리의 다른 글
[질문정리] 클래스와 구조체(feat. 메모리영역, COW, Method Dispatch) (0) | 2023.02.06 |
---|---|
Xcode Cloud 맛보기 (1차 해결-ci_scripts) (5) | 2023.01.30 |
[개발용어] 터미널 명령어 : cd, pip (0) | 2020.07.06 |