인스턴스: 메모리에 올라온 객체
객체: 클래스로부터 만들어짐
C++ 클래스 생성
class Dog {
public:
string name;
int age;
Dog(string n, int a) {
name = n;
age = a;
}
};
Dog myDog("Buddy", 3);
new 연산자 안써도 가능
Java 클래스 생성
class Dog {
String name;
int age;
Dog(String n, int a) {
name = n;
age = a;
}
}
Dog myDog = new Dog("Buddy", 3);
new 연산자 필수
Swift 클래스 생성
class Dog {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let myDog = Dog(name: "Buddy", age: 3)
class 클래스 이름 : 부모 클래스 {
// 프로퍼티 (멤버 변수)
// 인스턴스 메서드
// type (클래스 메서드)
}
type 메서드(static 메서드)
대부분의 언어에서 상속은 : 키워드, swift에서도 상속을 : 키워드로 한다.
스토어드 프로퍼티(멤버 변수)는 초기 값이 있어야함
옵셔널 변수는 nil으로 자동으로 초기화 됨, 초기값을 안줘도 된다.
정리
class Man {
var age : Int = 0
var weight : Double = 0.0
init(){}
func display() {
print("나이: \(age), 몸무게: \(weight)")
}
}
var x : Int
var kim : Man = Man() // Man.init() 생략가능, kim 자료형 추론가능하기 때문에 : Man 생략가능
kim.age = 10
정리
class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
class func cM(){
print("cM은 클래스 메서드입니다.")
}
static func scM(){
print("scM은 클래스 메서드(static)")
}
}
var kim : Man = Man()
kim.display() //인스턴스 메서드는 인스턴스가 호출
Man.cM() //클래스 메서드는 클래스가 호출
Man.scM() //클래스 메서드는 클래스가 호출
// 에러
han.cM()
han.scM()
class 키워드로 만든 메서드는 자식클래스에서 override 가능
class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(yourAge: Int, yourWeight : Double){
age = yourAge
weight = yourWeight
} //designated initializer
}
//var kim : Man = Man() //오류
//init()을 하나라도 직접 만들면 default initializer는 사라짐
var kim : Man = Man(yourAge:10, yourWeight:20.5)
kim.display()
designated initializer: 모든 프로퍼티를 다 초기화 시키는 생성자
class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){
self.age = age
self.weight = weight
} //designated initializer
}
//var kim : Man = Man() //오류
//init()을 하나라도 직접 만들면 default initializer는 사라짐
var kim : Man = Man(age:10, weight:20.5)
kim.display()
self키워드: 현재 클래스 내 메서드나 프로퍼티를 가르킬 때 사용함, 자바, C++ 등 대부분의 언어에서는 this키워드를 사용함
메서드 중첩(method overloading)
class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){ //1
self.age = age
self.weight = weight
}
init(age: Int){ //2
self.age = age
}
}
var kim : Man = Man(age:10, weight:20.5) //1
var kim1 : Man = Man(age:10) //2
//var kim2 : Man = Man()
//init가 없다면 인스턴스 만드는 방법
kim.display()
kim1.display()
메서드 중첩 조건: 매개변수의 개수와 자료형은 달라야함
애플에서 만든 uiimage 함수, 생성자 중첩이 많이 되어있음
부모클래스: superclass
자식클래스: subclass
상속 방법: 자식 class : 부모 class
특징:C++에서는 여러 부모가 올 수 있지만 Swift 하나만 올 수 있음
프로토콜: 자바의 인터페이스와 비슷한 개념
부모와 자식간 같은 메서드가 있으면 자식의 메서드를 우선적으로 하기위해 Overriding 키워드를 사용해야함
failable initializer 만드는 법: init 뒤에 ? 붙임
init?(age: Int, weight : Double){
self.age = age
self.weight = weight
}
init?(age: Int, weight : Double){
if age <= 0 || weight <= 0.0 {
return nil
}
else {
self.age = age
self.weight = weight
}
조건식을 써주고, 반드시 return nil 구문이 있어야한다.
var han : Man? = Man(age:5, weight:10.3)
옵셔널 타입으로 선언해줘야 한다.
han!.display()
han!.age = 10
han!.weight = 25.4
옵셔널 타입이기 때문에 ! 키워드로 nil 언래핑 해야함, 위 방식은 권장하지 않는 방법. 이유는 han 변수가 nil일 경우 언래핑하면 clash 나기 때문
3, 4 방식 비추천
방법.1
var han : Man? = Man(age:5, weight:10.3)
if let han {
han.display()
}
변수 han nil 일 경우 if문이 거짓이기 때문에 clash 발생 안함
방법.2
if let han = Man(age:5, weight:10.3) {
han.display()
}
인스턴스 생성과 동시에 언래핑 하는 방식
상속, 오버라이딩, failableinitalizer
// 부모 클래스 정의
class Animal {
var name: String
// 기본 초기화
init(name: String) {
self.name = name
}
// 메서드 정의
func makeSound() {
print("Animal sound")
}
}
// 자식 클래스 정의 (상속)
class Dog: Animal {
// 오버라이딩
override func makeSound() {
print("Bark")
}
}
// Failable Initializer를 가진 클래스 정의
class Cat: Animal {
// Failable Initializer
init?(name: String) {
// 이름이 비어있으면 초기화 실패
if name.isEmpty {
return nil
}
self.name = name
}
// 오버라이딩
override func makeSound() {
print("Meow")
}
}
// 사용 예시
let dog = Dog(name: "Buddy")
dog.makeSound() // 출력: Bark
if let cat = Cat(name: "") {
cat.makeSound()
} else {
print("Failed to initialize Cat") // 출력: Failed to initialize Cat
}
if let cat2 = Cat(name: "Whiskers") {
cat2.makeSound() // 출력: Meow
}