복잡한 시스템을 단순화하여 중요한 부분을 강조하고 불필요한 부분을 숨기는 것을 의미
객체의 상태와 행동을 하나로 묶고, 외부에서의 접근을 제한하여 객체 내부의 세부 구현을 숨기는 것을 의미한다. 이를 통해 객체간의 의존성을 줄이고 코드를 보호하여 유지보수성을 높인다.
상속은 기존 클래스에서 정의된 속성과 메서드를 다른 클래스에서 재사용하는 것
class Person {
func laugh() {print("ha ha")}
}
class Ally: Person {
var name : String = "ally"
}
동일한 인터페이스를 가진 다른 클래스들이 각가의 방식으로 동작할 수 있는 능력을 말한다.
//overriding
class Person {
func laugh() {print("ha ha")}
}
class Ally: Person {
override func laugh() {print("ho ho")}
}
class Ben: Person {
override func laugh(){
super.laugh()
print("ho ho")
}
}
//overloading
class Person(){
var name: String
var age: Int
init(){
self.name = "noname"
self.age = 0
}
init(name: String){
self.name = name
self.age = 0
}
init(name: String, age: Int){
self.name = name
self.age = age
}
}
타입은 데이터와 기능을 용도에 맞게 묶어 구조화해놓은 것으로 객체라고 부르기도 한다. Swift에서 타입의 종류는 크게 3가지로 열거형, 구조체, 클래스가 있다. 타입과 연관된 값들을 속성이라고 부르며, 타입과 연관된 함수를 메소드라고 부른다.
타입을 통해 만들 실체이다.
struct Person {
var name: String = String()
let isPerson : Bool = true
func sayHello() {
print("Hello")
}
}
위의 person 타입에 대해 인스턴스를 생성하는 방법은 다음과 같다.
var ally : Person = Person()
Person 타입의 인스턴스를 생성하며 이는 Person.init()이라는 코드의 축약표현이다.
스위프트의 모든 인스턴스는 초기화와 동시에 모든 프로퍼티에 유효한 값이 할당되어 있어야 한다. 프로퍼티에 미리 기본값을 할당해두면 인스턴스가 생성됨과 동시에 초기값을 지니게 된다. 프로퍼티 기본값을 지정하기 어려운 경우, 이니셜라이저(init)를 통해 인스턴스가 가져야할 초기값을 전달할 수 있다.**
struct Person {
var name: String
var age: Int
init(name: String, age: Int, nickName: String) {
self.name = name
self.age = age
}
}
let ally : Person = Person(name: "ally", age: 20)
위의 코드에서 self는 지금 현재의 인스턴스를 나타내는 키워드이다. 프로퍼티의 초기값이 꼭 필요없을때는 옵셔널을 사용하면
struct Person {
var name: String
var age: Int
var email: String?
init(name: String, age: Int) {
self.name = name
self.age = age
}
init(name: String, age: Int, email: String) {
self.name = name
self.age = age
self.email = email
}
}
let ally : Person = Person(name: "ally", age: 20, email: "abc@abc")
이니셜라이저 매개변수로 전달되는 초기값이 잘못된 경우 인스턴스 생성에 실패할 수 있다. 인스턴스 생성에 실패하면 nil을 반환하고 실패가능한 이니셜라이저의 반환타입은 옵셔널 타입이다.
struct Person {
var name: String
var age: Int
init?(name: String, age: Int) {
if name.count == 0 {
return nil
}
self.name = name
self.age = age
}
}
let ally : Person = Person(name: "", age: 20)
print(ally) //nil
초기화 해제는 클래스 인스턴스가 할당 해제되기 직전에 호출된다. 초기화 해제는 deinit키워드로 작성한다. 초기화 해제는 클래스 타입에서만 사용가능하다.
deinit {
// perform the deinitialization
}
초기화 해제 구문은 파라미터가 없고 소괄호 없이 작성된다. 초기화 해제 구문을 직접적으로 호출할 수 없음을 말한다. 상위클래스 초기화 해제 구문은 하위클래스로 상속되고 하위 클래스가 해제될 대 자동으로 호출된다.
struct Person {
var name: String
var age: Int
init(name: String, age: Int, nickName: String) {
self.name = name
self.age = age
}
deinit {
print("\(name) deinit")
}
}
이 person 인스턴스의 자동참조카운팅이 0이 되면 할당 해재 되기 전에 자동으로 초기화 해제 구문이 호출된다.