• 상속
    • 단일 상속 (single inheritance) = 스위프트에서 하위 클래스는 단 하나의 부모 클래스만 상속받을 수 있음
      • 형식 = class 자식:부모 {} / class 클래스명:부모명, 프로토콜명1,프로토콜명2 {}
      • 부모가 없으면 프로토콜명 바로 표기가능
    • 상속은 클래스만 가능하다
      class Ho{
        var age : Int = 21
        var height : Double = 170.7
        func display(){
          print("나이=\(age), 신장=\(height)")
        }
        init(age:Int,height:Double){
          self.age = age
          self.height = height
        }
      }
      class Child : Ho{
      }
      var shin : Ho = Ho(age:21,height:175.5)
      shin.display()					//나이=21,신장=175.5
      var hyeon : Child = Child(age:20,height:169.9)	
      hyeon.display()					//나이=20,신장=169.9
      print(hyeon.age)					//20
    
    • super. = 자식에서 부모클래스의 멤버변수를 사용할 때 사용
      class Ho{
        var age : Int = 21
        var height : Double = 170.7
        func display(){print("나이=\(age), 신장=\(height)")}
        init(age:Int,height:Double){
          self.age = age
          self.height = height
        }}
    
      class Child : Ho{
        var name : String = "신현호"
        func displayS(){
          print("이름=\(name),나이=\(age), 신장=\(height)")}
        init(age:Int, height:Double, name:String){		//변수명 변환가능 (age = age1)
          super.init(age:age,height:height)
          self.name = name
        }}
      var shin = Child(age:21,height:175.5,name:"신현호")	
      shin.displayS()					//이름=신현호,나이=21, 신장=175.5
      shin.display()					//나이=21, 신장=175.5
    
  • Overriding
    • 부모와 자식에 같은 메서드가 있으면 자식 우선
    • 상속 받은 함수 부분 중 마음에 들지 않는 함수를 똑같은 이름과 똑같은 매개변수의 리턴형을 만들고 사용한다.
      • ㄴ 부모의 함수가 아닌 자식의 함수가 사용된다.
      • 부모형의 함수와 모든 것이 동일하고 기능만 다르게 구현해야한다 ex) 리턴형,이름,매개변수등
      class Ho{
        var age : Int = 21
        var height : Double = 170.7
        func display(){print("나이=\(age), 신장=\(height)")}
        init(age:Int,height:Double){
          self.age = age
          self.height = height
        }}
    
      class Child : Ho{
        var name : String = "신현호"
        override func display(){				//자식에서 생성한 함수 호출 / 자식이 우선순위
          print("이름=\(name),나이=\(age), 신장=\(height)")}
        init(age:Int, height:Double, name:String){		
          super.init(age:age,height:height)
          self.name = name
        }}
      var shin = Child(age:21,height:175.5,name:"신현호")	
      shin.display()						//이름=신현호,나이=21, 신장=175.5
    
  • Overloading : 생성자 중첩
    • 매개변수의 개수와 자료형이 다른 같은 이름의 함수를 여러 개 정의
      class Ho{
        var age : Int    
        var weight : Double = 70
        var height : Double = 170
        func display(){
          print("나이 = \(age), 몸무게 = \(weight), 키 = \(height)")
        }
       init(age : Int, weight : Double, height : Double){
         self.age = age
         self.weight = weight
         self.height = height
       }  //designaed initializer
       init(age : Int){			//매개변수의 개수와 자료형이 다른 같은 이름의 함수를 여러 개 정의
         self.age = age
       }
      }
      var shin : Ho = Ho(age : 21, weight : 70, height : 170)
      	var shin1 : Ho = Ho(age : 20)   //20 //overloading 호출
      shin.display() 
      shin1.display()
      }
    
  • 익스텐션(extension)
    • 하위 클래스를 생성하거나 참조하지 않고 기존 클래스에

      메서드, 생성자(initializer),계산 프로퍼티 등의 기능을 추가하기 위하여 사용

    • 기본 구문 = extension 기존타입이름 {// 새로운 기능 }

      extension Double { 
        var squared : Double{
          return self*self
        }
      }
      extension Double{
        var plus : Double{
          return self + 4.0
        }
      }
      let ho : Double = 4.4
      print(ho.squared)	//19.360000000000003
      print(4.0.squared)	//Double형 값에도 .으로 바로 사용 가능 , 16.0
      print(4.4.plus)		//8.4
    
  • Swift 접근제어
    • access modifier = 구성 요소를 캡슐화 하는 데 사용

      ㄴ 접근 속성(접근 수정자, 액세스 수정자, 액세스 지정자 )는

         클래스, 메서드, 멤버의 접근 가능성을 설정하는 객체 지향 언어의 키워드
      
    • 모듈은 코드 배포(code distribution)의 단일 유닛

      ㄴ [open 접근 및 public 접근]을 통해 모듈의 모든 소스 파일 내에서 사용할 수 있으며, 정의한 모듈을 가져오는 다른 모듈의

      소스파일에서도 사용할 수 있다. 일반적으로 Framework에 공용 인터페이스를 지정할 때는 open 또는 public 접근을 사용한다.

        ※ open 접근은 클래스 및 클래스 멤버에만 적용
      
    • [internal 접근]은 해당 모듈의 모든 소스 파일 내에서 사용되지만, 해당 모듈 외부의 소스파일에서는

      사용되지않도록 한다. 일반적으로 App이나 Framework의 내부 구조를 정의할 때 internal 접근을 사용한다.

      ※ 접근 제어를 생략하면 internal이 기본

    • [Fileprivate 접근]은 해당 소스 파일 내에서만 사용가능
    • [Private접근]은 블록과 동일한 파일에 있는 해당 선언의 extension으로 제한한다.
    • ex) open class var blue : UIColor { get }

      ㄴ open : 모듈 외부까지(클래스에만 사용) 접근 가능 class : 클래스 프로퍼티

      ㄴ 읽기 쓰기 가능한 프로퍼티는 정의 뒤에 {get set} 읽기만 가능한 프로퍼티는 정의 뒤에 {get}

        public class HoClass{
        fileprivate var name : String = "현호"			//현재 소스 파일 내에서만 사용 가능
        private func play() {}					//현재 블럭 내에서만 사용 가능
        func display(){}						//접근제어를 생략하면 internal 이 기본이다.
        }