728x90
클래스와 구조체(Classes and Structures)
- 클래스와 구조체는 프로그램의 코드를 조직화 하기 위해 일반적으로 사용
- OOP를 위한 필요 요소
클래스와 구조체의 비교 (Comparing Classes and Structures)
- Swift에서 클래스와 구조체는 많은 공통점이 있움. 클래스와 구조체 둘다 다음과 같은 기능이 가능.
- 공통점
- 값을 저장하기 위한 프로퍼티 정의
- 기능을 제공하기 위한 메소드 정의
- subscript 문법을 이용해 특정 값을 접근할 수 있는 subscript정의
- 초기 상태를 설정할 수 있는 initializer 정의
- 기본 구현에서 기능 확장
- 특정한 종류의 표준 기능을 제공하기위 한 프로토콜 순응
프로퍼티, 메소드, 서브스크립트, 초기화, 확장 그리고 프로토콜을 참조
구조체로 가능하지 않고 클래스만 가능한 기능
- 상속
- 클래스의 여러 속성을 다른 클래스에 물려줌
- 타입 캐스팅
- 런 타임에 클래스 인스턴스의 타입을 확인
- 소멸자
- 할당된 자원을 해제 시킴
- 참조 카운트
- 클래스 인스턴스에 하나 이상의 참조가 가능
더 많은 정보는 상속, 타입 캐스팅, 소멸자 그리고 자동 참조 카운트를 참조
선언 문법(Definition Syntax)
- 클래스와 구조체 비슷한 선언 문법을 가지고 있음.
클래스와 구조체 인스턴스 (Class and Structure Instances)
- 클래스와 구조체 이름 뒤에 빈 괄호를 적으면 각각의 인스턴스를 생성 할 수 있음
- let someResolution = Resolution() // 구조체 인스턴스 someResolution let someVideoMode = VideoMode() // 클래스 인스턴스 someVideoMode
프로퍼티 접근 (Accessing Properties)
- 점(dot) 문법을 통해 클래스/구조체 인스턴스의 프로퍼티에 접근할 수 있음
- 하위 레벨 프로퍼티도 . 문법을 이용해 접근 가능
- .문법을 이용해 값을 할당 가능
- Swift에서는 하위레벨의 구조체 프로퍼티도 직접 설정 가능
구조체형의 멤버 초기화(Memberwise Initializers for Structure Types)
- 모든 구조체는 초기화시 프로퍼티를 선언할 수 있는 초기자를 자동으로 생성해 제공
구조체와 열거형은 값 타입(Structures and Enumerations Are Value Types)
- 이것이 함수에서 상수나 변수에 전달될 때 그 값이 복사되어 전달
- let hd = Resolution(width: 1920, height: 1080) var cinema = hd // hd와 cinema는
- 열거형에서 예시
- enum CompassPoint { case north, south, east, west } var currentDirection = CompassPoint.west let rememberedDirection = currentDirection currentDirection = .east if rememberedDirection == .west { print("The remembered direction is still .west") } // "The remembered direction is still .west" 출력
클래스는 참조 타입(Classes Are Reference Types)
- 값 타입과 달리 참조 타입은 변수나 상수에 값을 할당을 하거나 함수에 인자로 전달할 때 그 값이 복사되지 않음
- let tenEighty = VideoMode() tenEighty.resolution = hd tenEighty.interlaced = true tenEighty.name = "1080i" tenEighty.frameRate = 25.0 // tenEighty,VideoMode 클래스 인스턴스를 생성하고 각 프로퍼티에 값을 할당 let alsoTenEighty = tenEighty alsoTenEighty.frameRate = 30.0 // 출력 값은 30이 출력 그이유는 상수가 인스턴스를 복사한것이 아니라 참조한 것
식별 연산자(Identity Operators)
- 클래스는 참조 타입이기 때문에 여러 상수와 변수에서 같은 인스턴스를 참조할 수 있음.
- === : 두 상수나 변수가 같은 인스턴스를 참조하고 있는 경우 true
- !== : 두 상수나 변수가 다른 인스턴스를 참조하고 있는 경우 true
클래스와 구조체의 선택(Choosing Between Classes and Structers)
- 클래스와 구조체 모두 프로그램의 코드를 조직화 하고 특정 타입을 선언하는데 사용
- 클래스 인스턴스가 인자로 사용될 때는 참조가 넘어가고 구조체는 값이 넘어간다고 했음
- When we used Class or Struct?
- Struct 사용 추쳔
- 구조체의 주 목적이 관계된 간단한 값을 캡슐화(encapsulate)하기 위한 경우
- 구조체의 인스턴스가 참조되기보다 복사되기를 기대하는 경우
- 여기서 참조는 값이 똑같은 것이고 복사가 되면 값이 달라지면 서로 다르다.
- 구조체가 프로퍼티나 메소드 등을 상속할 필요가 없는 경우
String, Array, Dictionary의 할당과 복사 동작 (Assignment and Copy Behavior for Strings, Arrays, and Dictionaries
- Swift에서는 String, Array, Dictionary 같은 기본 데이터 타입이 구조체로 구현
- 구조체이면 상수나 변수에 할당or 함수나 메소드에 인자를 넘길 때 값이 복사가 됨
- Foundation의 NSString, NSArray, NSDictionary는 클래스로 구현
- 항상 할당되거나 전달될 때 복사 되지 않고 참조가 사용
모르는 용어
OOP
- 객체 지향 프로그래밍
- Class, Struct, Enum, protocall
- Swift에서는 객체 지향 프로그래밍을 지원하면서도 함수형 프로그래밍(Functional Programming)을 강화하는 방향으로 발전
- OOP의 장점과 함수형 프로그래밍의 장점을 모두 살릴 수 있는 혼합 패러다임을 제공
프로토콜
- 메소드,프로퍼티 및 기타 요구 사항의 목록
- 클래스, 구조체 또는 열거형 즉 객체프로그밍언어에서 채택, 일종의 계약
- 프로토콜은 일반적으로 다른 객체와의 상호작용을 보장하기 위해 사용
- 특정 유형의 객체가 데이터를 가져오는 메소드를 구현하고 있는 경우, 해당 객체가 프로토콜을 채택함으로써 이 메소드가 존재한다는 것을 보장
- 다중 상속과 유사한 기능을 제공
- 클래스는 다중 상속을 지원하지 않기 때문에 여러 프로토콜을 채택하여 필요한 기능을 구현
- 제네릭을 지원하여 다양한 타입에 대한 요구 사항을 나타냄
제네릭
- 객체지향언어프로그래밍(함수,메소드,클래스,열거형)에서 타입을 추상화하는 기술
- 제네릭을 사용하면 코드의 재사용성과 유연성을 높이기 위한 기술
- 함수,메소드 및 타입등의 구성요소를 작성할 때,구체적인 타입을 명시하지 않고 일반적인 형태로 작성 ‘<T: Comparable>’은 제네릭 함수 Comparable은 프로토콜을 준수해야 함
- func findMax<T: Comparable>(a: T, b: T) -> T { if a > b { return a } else { return b } }
인스턴스
- Class, Struct, Enum 타입의 실제 개체
- 예시 : let person1 = Person()
프로퍼티(property)
- 값을 저장하는데 사용되는 변수인데 객체지향프로그래밍(class, struct, enum)안에서 선언되는 변수와 상수
- 저장 프로퍼티
- 값을 저장하는데 사용되는 프로퍼티 변수와 유사
- 연산 프로퍼티
- 값을 저장하지 않고, 계산된 값을 반환 ,
- get 키워드(읽기), set 키워드(쓰기)
- 프로퍼티 감시자(Property observe)
- 프로퍼티 값이 변경될 때 특정 잡을 수행
- willSet(프로퍼티 값 변경전), didset(프로퍼티 값 변경후)
- 저장 프로퍼티
초기자(Initializer)
- 인스턴스를 생성하고 초기화하는 메서드
- 객체(저장 프로퍼티 var,let)는 초기화를 거쳐야 사용 → initializer에 의해 초기화
캡슐화(encapsulate)
- 캡슐화는 객체 지향 프로그램(OOP)에서 중요한 개념 중 하나
- 객체의 데이터와 기능을 하나로 묶고, 외부에서 직접적으로 접근 불가 시킴
- 객체의 내부 구현을 숨기고 외부에서는 객체에게 제공되는 인터페이스를 통해서만 객체와 상호작용
- 객체의 안정성과 유지보수성, 코드의 재사용성과 유연성도 증가
- 객체 내부의 상태가 변경될 때 객체의 메서드를 통해 변경해야 함으로 데이터 일관성 유지
프로퍼티
- Class Struct enum (OOP) 구성요소 사용되는 값을 저장하거나 계산하는데 사용하는 변수나 상수
메소드
- 함수와 매우 유사,
- Struct, Class, Enum및 프로토콜에 속한 함수
- class MyClass { func myMethod(parameter: Int) -> Int { // 함수 본문 return parameter * 2 } }
728x90
'기타 > Today I Learned' 카테고리의 다른 글
[TIL] Swift 문법(Subscripts) (0) | 2023.05.03 |
---|---|
[TIL] Swift 문법 메소드(Methods) (0) | 2023.04.28 |
[TIL] Swift 문법 열거형(Enum) (0) | 2023.04.25 |
[TIL] Swift 문법 클로저(Closures) (0) | 2023.04.23 |
[TIL] Swift 문법(함수 Functions) (1) | 2023.04.23 |