1. Overriding
부모클래스로부터 상속받은 메서드의 내용을 자식클래스에서 사용하기에 맞게
변경하는것.
• 매개변수와 return type이 같아야 한다
(override func 함수명())
자식 class에게 method를 제공한다
✔ 함수 사용시 super 키워드 사용
✔ 클래스를 상속 받아 일부 메소드만 수정해 사용할 수 있다
✔ 코드의 가독성이 증가하며 유지보수가 쉽다
출력 시 부모, 자식에 같은 Method가 있으면 자식 우선
2. Overloding
클래스 내에서 이름이 같은 함수가 여러 개 있는 것
✔매개변수의 유형과 개수가 다르도록 하는 기술
✔리턴값만을 다르게 갖는 오버로딩은 작성 할 수 없다.
✔기존에 없던 새로운 메서드를 정의하는 것
3. 과제 클래스 하나 찾아서 간단 도움말 만들기
클래스 : UIImageView
기능 : 단일 이미지(jpg, pnp, gif)를 인터페이스에 표시하는 기능
필수 생성자 : init(coder: NSCoder), init(frame: CGRect)
let rect = CGRect(x: 4, y: 4, width: 50, height: 50)
let myView = UIView(frame: rect)
함수
func startAnimating() 이미지 애니메이션 시작
func stopAnimating() 이미지 애니메이션 중지
(로딩 화면 등에서 활용)
예제
image 불러오기 UIImage
var uiImageView = UIImageView()
var image: UIImage = UIImage(named: "sdk")!
uiImageView = UIImageView(image: image)
uiImageView
image url로 불러오기 UIImage
let url =URL(string: "http로 시작하는 이미지 주소“)
let data =try Data(contentsOf: url!)
uiImageView.image = UIImage(data : data)
uiImageView
4. Human Interface Guidelines(HIG)
앱을 만들시 가이드라인이 있음
디자인 할시 필요한 정보와 UI 리소스가 모여있는 곳
https://developer.apple.com/kr/design
5. extension(확장)
computed instance, computed type properties
추가할 때 사용한다
class, struct, enum, protocol에 새로운 기능을 추가
✔ 내장된 클래스에 기능을 추가할 시 매우 효과적
extension 기존타입이름(class, struct, enum, protocol)
{
//기능 추가
}
과제
extension Double
{
var multiply : Double
{ return self *self } //현재 인스턴스를 제곱
}
let Value =5.5
print(Value.multiply) //30.25
print(3.0.multiply) //9.0 Double 값에 이어 .으로 사용
6. 접근제어(access modifier)
✔ 코드끼리 상호작용을 할 때 파일 간 또는 모듈 간에
접근을 제한할 수 있는 기능
✔ 캡슐화와 연관 되어있다
모듈은 코드 배포(code distribution)의 단일 유닛
private //현재 블록 내에서만 가능
fileprivate //현재 소스 파일 내에서 가능
internal //해당 모듈의 모든 소스 파일 내에서 가능 (생략 가능)
public //모듈의 모든 소스 파일 내에서 접근, 다른 모듈 소스도 가능
open //모듈 외부까지 접근 가능, 클래스 및 클래스 멤버에만 적용
swift 접근제어를 사용할 수 있는 5가지
class, property, instance method, 생략(internal)
접근 수준(높은순)
open → public → internal(기본) → fileprivate → private
접근 제어
Ex) open class var blue : UIColor { get }
open : 모듈 외부까지(클래스에만 적용) 접근 가능
class : class property
{ get } : Read only property (읽기, 쓰기 가능)
{ get set } : read and write property (읽기 가능)
7. 프로토콜(protocol)
특정 클래스와 관련없는 함수(메서드)들의 선언 집합
✔ 함수(method) 정의는 없음)
✔ 기능이나 속성에 대한 설계도
protocol == 자바 C#의 interface
== C++의 abstarct base class
8. Swift 상속과 Protocol 채택
Class 자식 : 부모
{
}
부모 클래스는 오직 하나
: 이후 여러 개이면 부모를 제외한 나머지는 Protocol
class 클래스명:부모명, 프로토콜명{ }
✔ 부모가 있으면 부모 다음에 표기
✔ 부모로부터 상속받고 프로토콜 채택
부모가 없을 시 바로 표기 가능
class 클래스명:프로토컬명 { }
상속은 클래스만 가능
프로토콜을 채택 할 수 있는 것
클래스, 구조체(struct), 열거형(enum), extension
9. protocol 정의
protocol 프로토콜명
{
프로퍼티명
메서드 선언 //메서드는 선언만
}
protocol 프로토콜명 : 부모1프로토콜, 부모2프로토콜
{ //다중 상속 가능 (클래스는 단일 상속) }
protocol과 property / method 선언
protocol keepGoing
{
var x : Int { get set } //stored property, 읽기와 쓰기가 가능
var y : Int { get } //stored property, 읽기가 가능
func run() //기능이 없는 선언만
}
class add : keepGoing
{
var x =3 //protocol 채택 후 준수(conform)
var y =4 //protocol 채택 후 준수(conform)
func run() { print("뛴다") } //run 함수 구현
}
class stop : keepGoing //다중상속
{
var x =3 //protocol 채택 후 준수(conform)
var y =4 //protocol 채택 후 준수(conform)
func run() { print("멈춰!") } //run 함수 구현
}
let start = add()
print(start.x) //3
print(start.y) //4
start.run()//뛴다
let end = stop() //다중상속
end.run() //멈춰
10. delegate
✔대리자, 조력자
✔지정된 메서드를 통하여 처리해 줌
✔일부를 다른 객체에 넘기는 것
✔보통 프로토콜 사용
11. 과제
protocol B //bb()라는 메소드가 하나있는 프로토콜(protocol) B을 만드시오.
{
func bb(y : Int) ->Int //bb()메서드는 Int형 값을 매개변수로 받아 Int형으로 리턴하는 메서드이다.
}
class C { } //클래스 A는 클래스 C라는 부모를 갖는다(C로부터 상속받는다).
class A : C, B //클래스 A에서 프로토콜 B를 채택하고, 준수하는 소스
{
func bb(y : Int) ->Int
{ return y *2 } //bb()메서드는 Int형 값을 매개변수로 받아 두 배한 값을 Int형으로
리턴하는 메서드
}
let a = A() //클래스 A의 인스턴스 a를 만들고 bb를 호출(argument로 3을 입력)하여
결과를 확인
print(a.bb(y:3)) //6
12. 예제 protocol 상속, overloading overriding
protocol B //bb()라는 메소드가 하나있는 프로토콜(protocol) B을 만드시오.
{
func bb(y : Int) ->Int //bb()메서드는 Int형 값을 매개변수로 받아 Int형으로 리턴하는 메서드이다.
}
class C //클래스 A는 클래스 C라는 부모를 갖는다(C로부터 상속받는다).
{
var name ="주"
func say() //override
{
print("hi", name)
}
}
class A : C, B //클래스 A에서 프로토콜 B를 채택하고, 준수하는 소스
{
var name2 ="장권" //override
var age =20
var weight =53.3
func bb(y : Int) ->Int
{ return y *2 } //bb()메서드는 Int형 값을 매개변수로 받아 두 배한 값을 Int형으로
override func say() //override
{
print("Hi,"+ name +"-"+ name2 +"!")
}
func display() //overloading
{
print("나이 : \(age), 몸무게 : \(weight)")
}
init(age: Int, weight : Double) //overloading
{ //1
self.age = age
self.weight = weight
}
init(age: Int)
{ //2
self.age = age
}
}
let a : A = A(age:10, weight:3.2)
let a2 : A = A(age:50)
print(a.bb(y:3)) //6
a.say() //Hi,주-장권입니다!
a.display() //overloading 나이 : 10, 몸무게 : 3.2
a2.display() //overloading 나이 : 50, 몸무게 : 53.3
13. 열거형 enum
관련있는 데이터들이 멤버로 구성되어 있는 자료형 객체
✔ 원치 않는 값이 잘못 입력되는 것 방지
✔ 입력 받을 값이 한정되어 있을 때
✔ 특정 값 중 하나만 선택하게 할 때
사이즈
S, M, L
옷
상의, 하의
정의
enum 열거형명
{
열거형 정의
}
enum Size
{
case small, medium, large //한줄로 멤버 나열 가능
case Xlarge
case XXlarge
}
//print(열거형명.멤버)
print(Size.Xlarge) //Xlarge
var Howbigger = Size.small
Howbigger = .small //열거형명 생략 가능
print(Howbigger) //large
Howbigger = medium //열거형명 생략 가능
print(Howbigger, type(of:Howbigger)) //medium size
열거형 enum member 기능 정의
enum Size
{
case small, medium, large //한줄로 멤버 나열 가능
case Xlarge
case XXlarge
}
var Howbigger : Size
Howbigger = .small
switch Howbigger
{
case .small: //현재 Howbigger
print("this is small size")
case .medium:
print("this is medium size")
case .large:
print("this is large size")
case .Xlarge:
print("this is Xlarge size")
case .XXlarge:
print("this is XXlarge size")
}
결과 값
this is small size
스와이프(swipe) 제스처는 자주 사용 되며
.up .down .left 등으로 축약해서 쓸 수 있음
14. ViewController.swif
import UIKit //FrameWork 포함하기 위해 사용 UIkit – 디자인 요소 클래스
class ViewController : UIViewController //대게 Controller는 부모 클래스
{
@IBOutlet var lblHello: UILabel!
@IBOutlet var txtName: UITextField! //입력창(optional)
//Interface Builder Outlet(변수, 프로퍼티)
override func viewDidLoad() //override 직접 만든 함수를 호출
{
super.viewDidLoad() //자식이 만든 viewDidLoad에 추가하기 위함
}
@IBAction func btnSend(_ sender: UIButton)
//자료형 UIButton, 생략, 내부매개변수 sender
{
//Interface Builder Action(함수, 메서드)
lblHello.text ="Hello, "+ txtName.text!
//버튼이 눌릴 때 입력 Hello와 입력한 값이 입력 된다
}
}