오늘은 객체 지향 언어인 Swift의 클래스에 대해서 알아볼 것이다.
언어별 클래스 정의와 객체 생성 비교
Swift
- 클래스 정의: class Dog { ... } 형태로 클래스를 정의한다.
- 초기화 메서드: init(name: String)을 사용하여 초기화 메서드를 정의한다.
- 객체 생성: let myDog = Dog(name: "Buddy")와 같이 객체를 생성한다.
Java
- 클래스 정의: public class Dog { ... } 형태로 클래스를 정의한다.
- 생성자: public Dog(String name) { ... }을 사용하여 생성자를 정의한다.
- 객체 생성: Dog myDog = new Dog("Buddy");와 같이 객체를 생성한다.
C#
- 클래스 정의: public class Dog { ... } 형태로 클래스를 정의한다.
- 생성자: public Dog(string name) { ... }을 사용하여 생성자를 정의한다.
- 객체 생성: Dog myDog = new Dog("Buddy");와 같이 객체를 생성한다.
JavaScript
- 클래스 정의: class Dog { ... } 형태로 클래스를 정의한다.
- 생성자: constructor(name) { ... }을 사용하여 생성자를 정의한다.
- 객체 생성: const myDog = new Dog("Buddy");와 같이 객체를 생성한다.
Python
- 클래스 정의: class Dog: 형태로 클래스를 정의한다.
- 초기화 메서드: def __init__(self, name):을 사용하여 초기화 메서드를 정의한다.
- 객체 생성: my_dog = Dog("Buddy")와 같이 객체를 생성한다.
각 언어의 문법에 따라 클래스와 객체를 정의하고 생성하는 방법이 다르지만, 기본적인 개념은 유사하다.
Swift의 클래스 선언하기와 다른 언어들 비교
Swift
class Animal {
// 부모 클래스
}
class Dog: Animal {
// 자식 클래스
}
JAVA
class Animal {
// 부모 클래스
}
class Dog extends Animal {
// 자식 클래스
}
C#
public class Animal {
// 부모 클래스
}
public class Dog : Animal {
// 자식 클래스
}
JavaScript
class Animal {
// 부모 클래스
}
class Dog extends Animal {
// 자식 클래스
}
Python
class Animal:
# 부모 클래스
class Dog(Animal):
# 자식 클래스
클래스의 기본 구조
class 새로운 클래스 이름 : 부모 클래스 {
// 프로퍼티
// 인스턴스 메서드
// 타입(type) 메서드(클래스 메서드)
}
프로퍼티 부분은 클래스 내에 포함되는 변수(var)와 상수(let)를 정의,
인스턴스 메서드는 객체가 호출하는 메서드를 정의,
타입 메서드는 클래스가 호출하는 메서드를 정의한다.
Class 안에 있는 프로퍼티는 초기값이 반드시 있어야 한다.
이 에러를 해결하기 위한 초기값 지정 방법은 두 가지가 있다.
1) 직접 지정해 주기
var x : Int
class Man {
var age : Int = 0
var weight : Double = 0.0
}
2) 옵셔널 사용하기
var x : Int
class Man {
var age : Int?
var weight : Double? //값이 없으면 nil이 들어가서 에러 X
}
var x : Int
class Man {
var age : Int = 0
var weight : Double = 0.0
func display() {
print("나이: \(age), 몸무게: \(weight)")
}
class func cM(){
print("cM은 클래스 메서드입니다.")
}
static func scM(){
print("scM은 클래스 메서드(static)")
}
}
var song : Man = Man() //눈에 안 보이는 디폴트 이니셜라이저 호출
print(song.age)
song.age = 22
song.weight = 40
print(song.age, song.weight)
song.display()
Man.cM() //class 키워드로 만든 클래스 메서드는
Man.scM() //자식 클래스에서 override 가능하다.
객체 만들기 예제
var x : Int
class Man {
var age : Int = 0
var weight : Double = 0.0
func display() {
print("나이: \(age), 몸무게: \(weight)")
}
}
var song : Man = Man()
print(song.age)
song.age = 22
song.weight = 40
print(song.age, song.weight)
song.display()
designated initializer?
class Man {
var age : Int = 0
var weight : Double = 0.0
init(yourAge: Int, yourWeight : Double){
age = yourAge
weight = yourWeight
} //designated initializer
func display() {
print("나이: \(age), 몸무게: \(weight)")
}
}
var song : Man = Man.init(yourAge: 5, yourWeight: 10.5)
song.display()
song.age = 22
song.weight = 40
song.display()
designated initializer란, 모든 프로퍼티를 다 초기화시키는 생성자이다.
하나라도 직접 만들면 default initializer는 사라진다.
this를 사용하는 언어와 self를 사용하는 언어
언어 | 사용되는 키워드 | 설명 |
Java | this | 현재 객체를 참조 |
C# | 현재 인스턴스를 참조 | |
JavaScript | 호출 방식에 따라 현재 객체를 참조 | |
PHP | 현재 객체를 참조 | |
Python | self | 인스턴스 메서드 내에서 현재 객체를 참조 |
Ruby | 현재 객체를 참조 | |
Swift | 현재 인스턴스를 참조 |
Method overloading 예시
class Man {
var age : Int = 0
var weight : Double = 0.0
init(age: Int, weight : Double){
self.age = age //self 사용
self.weight = weight
} //designated initializer
init(age: Int){ //method overloading
self.age = age
}
func display() {
print("나이: \(age), 몸무게: \(weight)")
}
}
var song : Man = Man.init(age: 5, weight: 10.5)
var kim1 : Man = Man(age:10) //2
song.display()
song.age = 22
song.weight = 40
song.display()
https://developer.apple.com/documentation/uikit/uiimage
UIImage | Apple Developer Documentation
An object that manages image data in your app.
developer.apple.com
해당 사이트에서 UIImage클래스의 init()함수에 대해 더 자세히 알 수 있다.
가장 많이 사용되는 것으로는,
let image = UIImage(named: "exampleImage") //1 init(named:)
if let imageData = try? Data(contentsOf: url) { //2 init(data:)
let image = UIImage(data: imageData)
}
let image = UIImage(contentsOfFile: "/path/to/image.png") //3 init(contentsOfFile:)
if let url = URL(string: "https://example.com/image.png") { //4 init(contentsOf:)
let image = UIImage(contentsOf: url)
}
let color = UIColor.red //5 init(color:)
let image = UIImage(color: color)
Class의 상속
Swift에서 클래스를 상속하는 방법이다.
class 자식:부모 { }
부모 클래스는 하나만 가능하며, 콜론 다음이 여러 개이면 나머지는 프로토콜이다.
위 사진은 override 에러 예시이다. Override라는 키워드를 사용하라고 말하고 있다.
부모 클래스와 자식 클래스의 display() 함수가 중첩되어 생긴 오류인데,
이를 해결하기 위해서는 Student 클래스의 display() 함수에 override를 하면 된다.
class Man {
var age : Int = 0
var weight : Double = 0.0
init(age: Int, weight : Double){
self.age = age
self.weight = weight
} //designated initializer
init(age: Int){
self.age = age
}
func display() {
print("나이: \(age), 몸무게: \(weight)")
}
}
class Student : Man {
var name : String
override func display() { //override 사용
print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double, name : String){
self.name = name
super.init(age:age, weight:weight)
}
}
failable initializers(실패 가능한 생성자: init?)
failable initializers 예제이다.
class Man {
var age : Int = 0
var weight : Double = 0.0
init?(age: Int, weight : Double) {
if age <= 0 || weight <= 0.0 { return nil } //사람이 대상이기 때문에 존재할 수 없는 경우 nil
else {
self.age = age
self.weight = weight
}
} //designated initializer
func display() {
print("나이: \(age), 몸무게: \(weight)")
}
}
var song : Man? = Man(age: 0, weight: 10.5) //nil을 사용하기 때문에 옵셔널로 사용해야 한다!
song!.display()
song!.age = 22
song!.weight = 40
failable initialize가 있는 클래스의 인스턴스 생성 방법들이다.
일반적으로 해당 방법들을 가장 많이 쓴다.
만들고 옵셔널을 해제하여 사용하는 방법, 만듦과 동시에 해제하는 방법 등등이 있다.
포스팅한 내용을 전부 넣어서 소스를 만들어 보았다. 이상이다.
class Man {
var age: Int // 나이를 저장하는 변수
var weight: Double // 몸무게를 저장하는 변수
// 인스턴스의 나이와 몸무게를 출력하는 메서드
func display() {
print("나이=\(age), 몸무게=\(weight)")
}
// 초기화 메서드
init?(age: Int, weight: Double) {
// 나이가 0 이하일 경우 nil을 반환하여 인스턴스 생성을 실패하게 함
if age <= 0 {
return nil
} else {
self.age = age // 나이를 설정
}
self.weight = weight // 몸무게를 설정
}
}
// 1. 옵셔널 형으로 선언하여 인스턴스 생성
var song: Man? = Man(age: 1, weight: 3.5)
// 1-1. 옵셔널 바인딩을 사용하여 인스턴스가 nil이 아닐 경우에만 실행
if let song1 = song { // 1-2. song이 nil이 아닐 경우 song1에 할당
song1.display() // 인스턴스의 display() 메서드 호출
}
// 2. 인스턴스 생성과 동시에 옵셔널 바인딩
if let song2 = Man(age: 2, weight: 5.5) {
song2.display() // 인스턴스가 성공적으로 생성되면 display() 호출
}
// 3. 인스턴스 생성하면서 바로 강제 언래핑
var song3: Man = Man(age: 3, weight: 7.5)! // 강제 언래핑을 사용하여 인스턴스 생성
song3.display() // 인스턴스의 display() 메서드 호출
// 4. 옵셔널 인스턴스를 사용 시 강제 언래핑
var song4: Man? = Man(age: 4, weight: 10.5) // 옵셔널 타입으로 인스턴스 생성
song4!.display() // 강제 언래핑을 사용하여 display() 메서드 호출