2주. tuple매년 시험에 나옴
3주. property제외, as? as! 언제 사용하는지 구분하기
4주. guard let 개중요 , 검은색 예제는 불필요
5주. 후행클로저 안함**
6주. 클래스는 상속 가능, 구조체는 ~~ 이 정도 개념만 알아두삼(시험에 다 안 나옴)
Method (Swift) = Member function (Method)
stored property (Swift) = 멤버변수(C++)
stored property를 초기화하는 3가지 방법
|
class Man{
var age : Int = 1 //직접 지정 var weight : Double = 3.5} |
|
class Man{
var age : Int? //옵셔널 변수는 nil로 자동 초기화 var weight : Double!} //옵셔널 변수는 nil로 자동 초기화 |
|
class Man{
var age : Int var weight : Double init(){ //initializer로 초기화 age = 1 weight = 3.5 }} |
xcode실행 file->new->playground
class Man{
var age : Int = 1
var weight : Double = 3.5
//init(){}
//눈에 보이지 않지만 자동으로 만들어지는 default initializer
func display(){
print("나이=\(age), 몸무게=\(weight)") }
class func cM(){
print("cM은 클래스 메서드입니다.")
}
static func scM(){
print("scM은 클래스 메서드(static)")
}
}
var kim : Man = Man() // ()는 init()호출하는 것 Man.init()
kim.display() //인스턴스 메서드는 인스턴스가 호출
Man.cM() //클래스 메서드는 클래스가 호출
Man.scM()
print(kim.age)
/*---result---
나이=1, 몸무게=3.5
cM은 클래스 메서드입니다.
scM은 클래스 메서드(static)
1
나이=1, 몸무게=3.5
cM은 클래스 메서드입니다.
scM은 클래스 메서드(static)
1
*/
class키워드로 만든 클래스 메서드는 자식 클래스에서 override가능 함

var kim = Man.init() .init생략됨
default initializer(.init 하나라도 만들면 사라짐) vs designated initializer(모든 프로퍼티를 초기화하는 이니셜라이저)
생성자 : 인스턴스가 만들어지면서 자동 호출

오류 해결하려면 self.age = age처럼 작성해야함
age = age는 class의 age변수에 age를 대입하라는 명령

method overloading : 생성자 중첩
init(age: Int, weight : Double){ //1
self.age = age
self.weight = weight
} //designated initializer
init(){ //2
self.age = 1
self.weight = 3.5
}
UIImage클래스의 init()함수 overloading
**failable initializer( 실패 가능한 생성자: init?() )
ㄴ정상적인 객체가 아닌 객체가 출력될 경우 사용

강제 언래핑 !으로 풀어버리면 오류발생
optional binding으로 해제 필요
- 1. 이미지 로딩과 캐싱
- init?(named: String, in: Bundle?, compatibleWith: UITraitCollection?)
- init?(named: String)
- 2. 이미지객체 생성 및 초기화
- init?(contentsOfFile: String)
- init?(data: Data)
- init?(data: Data, scale: CGFloat)
- let myImage: UIImage = UIImage(named: "apple.png")! //느낌표가 왜 있지?

if let kim{ }. //생략하고 그냥 쓸 수도 있다.
var kim : Man? = Man(age:1, weight:3.5)
//1-1.옵셔널 형으로 선언
if let kim1 = kim { //1-2.옵셔널 바인딩
kim1.display()
}
//2.인스턴스 생성과 동시에 옵셔널 바인딩
if let kim2 = Man(age:2, weight:5.5) {
kim2.display()
}
//3.인스턴스 생성하면서 바로 강제 언래핑 XX비추
var kim3 : Man = Man(age:3, weight:7.5)!
kim3.display()
//4.옵셔널 인스턴스를 사용시 강제 언래핑 XX비추
var kim4 : Man? = Man(age:4, weight:10.5)
kim4!.display()
class 자식:부모 { }
- 부모 클래스는 하나만 가능
- class 클래스명:프로토콜명1,프로토콜명2{} // 프로토콜은 여러개 가능
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
}
}
class Student : Man {
}
var kim = Man(age:10, weight:20.5)
kim.display()
var kim1 = Student(age:20, weight:60.5)
kim1.display()
//상속받으면 부모의 기능 사용 가능
오버라이드***
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
}
}
class Student : Man {
var name : String
func displayS() { //부모랑 겹치지 않게 하려고 S추가함 같은 이름을 쓰려면 override func...
print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
}
init(age1: Int, weight1 : Double, name : String){
self.name = name //자식의 프로퍼티 먼저 초기화
super.init(age:age1, weight:weight1) //과제: 이 줄을 안쓰면?
}//error:'super.init' isn't called on all paths before returning from initializer
}
var lee : Student = Student(age1:20,weight1:65.2,name:"홍길동")
lee.displayS()
lee.display()//만일 override를 사용하면 자식클래스의 메소드를 우선시하도록 바뀐다
//조심해야할 에러
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
}
}
class Student : Man {
var name : String
Override func display() { //부모랑 겹치지 않게 하려고 S추가함 같은 이름을 쓰려면 override func...
print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
}
init(age1: Int, weight1 : Double, name : String){
super.init(age:age1, weight:weight1) //
self.name = name //error 반드시 자식의 프로퍼티 먼저 초기화
}//error:'super.init' isn't called on all paths before returning from initializer
}
var lee : Student = Student(age1:20,weight1:65.2,name:"홍길동")
lee.displayS()
lee.display()//만일 override를 사용하면 자식클래스의 메소드를 우선시하도록 바뀐다
override : 객체 지향에서 상위(부모) 클래스에 정의된 메서드를 하위(자식) 클래스에서 동일한 이름과 매개변수 목록으로 재정의하여 사용하는 것
overloading : 같은 이름의 메서드를 여러 개 정의하는 기법
'computing' 카테고리의 다른 글
| 20251030_android8 (0) | 2025.10.30 |
|---|---|
| 20251027_iOS9 (0) | 2025.10.27 |
| 20251002_android_5_layout속성 (0) | 2025.10.02 |
| (Servlet, JSP), (MVC,MVCS), (MVVM, MVP) (0) | 2025.10.01 |
| 20250929_iOS5 (0) | 2025.09.29 |