-
[Swift] 객체 지향 프로그래밍iOS/Swift 2022. 9. 1. 23:55
객체 지향 프로그래밍
[예시]
- 학사 관리 시스템
- 학생의 이름, 전공
- 수강신청 과목
- 수강신청 하기
- 게임
- 캐릭터
- 캐릭터의 능력
- 캐릭터 이동, 공격, 방어 등
객체 지향 프로그래밍 작성 방법
[객체의 속성]
가로, 세로 길이가 10, 20인 사각형
사각형은 객체이고, 가로 세로 길이는 사각형 객체가 가진 속성이다
[객체의 행위]
- 사각형의 넓이 계산
- 사각형은 정사각형인지 판단
사각형을 다루는 애플리케이션
클래스 객체의 타입 정의 프로퍼티 객체의 속성 정의 메소드 객체의 행위 정의 - 클래스에서 객체 생성
- 객체 생성
- 객체에 속성 설정
- 객체 메소드 실행
클래스 정의와 객체 생성
클래스 정의
class Rectangle { }
객체 생성
var rect = Rectangle() // var: 새로운 객체 대입 가능 rect = Rectangler() // let: 새로운 객체 대입 불가 let rect2 = Rectangle() // rect2 = Rectangler() 불가능
프로퍼티
클래스 내에 작성하는 변수
객체의 데이터 저장/계산 프로퍼티 값을 저장하고 읽는 행위 프로퍼티의 종류
저장 프로퍼티 계산 프로퍼티 데이터를 저장하는 용도 데이터 저장하지 않음 데이터의 읽기/쓰기 행위 프로퍼티 읽기/쓰기 코드 작성 객체 생성시 초기화되며, 초기화 방법(이니셜라이저)필요 초기화X 사각형 클래스 프로퍼티 예시
저장 프로퍼티
- 가로, 세로 길이
계산 프로퍼티
- 크기 계산
- 정사각형 여부
저장 프로퍼티
// =========== < 저장 프로퍼티 > =========== class MyClass { // 1.초기값을 설정한 프로퍼티 var intProperty = 0 // 2. 옵셔널 프로퍼티(초기값 없어도 OK) var floatProperty = Float? // 3. 초기값이 없는 프로퍼티(이니셜라이저 구현 필요) var strProperty = String } // =========== < 저장 프로퍼티 사용 > =========== // 인스턴스 생성 var obj = MyClass() // 인스턴스 사용 obj.intProperty = 10 obj.floatProperty = 3.1 let val = obj.floatProperty // Optional(3.1)
계산 프로퍼티
읽고 쓰기 읽기(get) 전용 쓰기(set) 전용 get / set 모두 작성 get만 작성(생략 가능) 구현 불가능 var isSquare: Bool { get { // 선언 생략 가능 return width == height } }
저장 프로퍼티와 계산 프로퍼티
// 1. 클래스 생성 class MyClass { // 저장 프로퍼티 var value1: Int = 0 var value2: String? // 계산 프로퍼티 var value3: Int { get { return 100 } set(nv) { value1 = nv } } // 인스턴스 메서드 func sayHello() { print ("Hello: \(value1)") // 타입 메서드 static func sayGoodBye() { print("Good Bye") } } // 2. 인스턴스 생성 let obj = MyClass() // 3. 인스턴스 사용 obj.value1 = 10 let str = obj.value2 //nil obj.sayHello() // 인스턴스 메서드 -> 객체 MyClass.sayGoodBye() // 타입 메서드 -> 클래스
타입 프로퍼티
계산 프로퍼티, 저장 프로퍼티 둘 다 가능하다
객체를 생성하지 않고 사용
static 키워드로 구현class Rectangle { var width: Int = 0 // 계산 타입 프로퍼티 static var name: String { return "사각형" } // 저장 타입 프로퍼티 static var edge = 4 } // 프로퍼티 사용 방법 // 객체 var obj = Rectangle() obj.width = 10 // 클래스(타입 프로퍼티 접근) Rectangle.edge Rectangle.name
메서드
클래스 내에 작성하는 함수
class Count { var count = 0 func increment() { count++ } func increment(amount: Int) { count += amount } }
self 포인터
객체 자신을 참조하는 포인터
프로퍼티 이름과 매개변수 이름이 겹칠 때 사용
class Counter {
var count = 0
func setCount(count: Int) {
self.count = count
}
}
인스턴스 메서드 vs 타입 메서드
인스턴스 메서드 타입 메서드 객체 생성, 객체에 사용함(ex.obj.method) 객체 생성하지 않고 사용함 객체의 프로퍼티 접근 및 사용 가능 프로퍼티 접근 불가 static 키워드로 구현 obj.method (객체) MyClass.method (클래스)
프로퍼티 변경 감시
이니셜라이저 초기화 때는 동작하지 않고, 프로퍼티 접근 및 사용 시에 동작
willSet didSet 프로퍼티 변경 전 프로퍼티 변경 후 // 프로퍼티 변경 감시 // 음수가 값으로 들어오는지 감지하기 class Rectangle { var height: Int = 0 { willSet { print("사각형 높이 변경 예정: \(newValue)") } didSet { print("사각형 높이 변경 완료: \(oldValue)") } } }
프로퍼티 늦은 초기화: lazy 키워드로 구현
다른 클래스 타입의 프로퍼티 초기화
프로퍼티 초기값으로 객체 생성
class Person { var phone = Phone() } class Phone { var number: String init() { print("Phone 객체 생성") number = "010-1234-5678" } } // 인스턴스 생성 let obj = Person() // Phone 이니셜라이저 구동
프로퍼티를 사용할 때 초기화
class Person { lazy var phone = Phone() } let John = Person() john.phone
'iOS > Swift' 카테고리의 다른 글
[Swift] 익스텐션(extension) (0) 2022.09.03 [Swift] 프로토콜(protocol) (0) 2022.08.31 [Swift] 타입캐스팅(type casting) (0) 2022.08.24 [Swift] 상속 (Inheritance) (0) 2022.08.22 [Swift] 서브스크립트(subscript) (0) 2022.08.20