-
안녕하세요. 그린입니다!
이번 포스팅에서는 스위프트의 객체지향 프로그래밍 성격에 대해 알아보겠습니다.
그 중 대표적인 구조체와 클래스에 대해 심층 학습을 해볼 예정입니다..!
말만 들어도 벌써 프로그래밍을 처음 접한 분들은 낯설게 느껴지는 경향이 있는 파트들입니다.
이전 포스팅까지의 기초들은 그래도 그럭저럭 이해하며 넘어갈 수 있는 부분이 많았는데 이번 포스팅부터는
조금 더 심오한 개념들이 나오니 집중해서 같이 학습해봐요^^
우선, 구조체와 클래스는 데이터를 용도에 맞게 묶어 표현하고자 할 때 유용합니다.
프로퍼티와 메서드를 사용하여 구조화된 데이터 및 기능을 가집니다. 즉 하나의 새로운 사용자 정의 데이터 타입을 만들어 주는것 입니다.
이제까지의 포스팅에서 알아본 데이터 타입과 열거형은 모두 값 타입이었습니다.
그러나 클래스는 참조 타입입니다. (C나 objective-C의 포인터와 유사한 개념입니다.)
또한, 구조체,클래스 모두 중첩 타입의 정의 및 선언이 가능합니다. (구조체 안 구조체 , 클래스 안 클래스 등)
1. 구조체
1-1. 정의
구조체는 struct 키워드로 정의합니다.
struct 구조체 이름 {
프로퍼티와 메서드
}
-. 구조체 이름 : 대문자 카멜케이스
-. 프로퍼티와 메서드 : 소문자 카멜 케이스
1-2. 인스턴스의 생성 및 초기화
구조체 정의가 된 후 인스턴스를 생성하고 초기화 할때 기본적으로 생성되는 멤버와이즈 이니셜라이저를 사용합니다.
구조체 기본 생성된 이니셜라이저의 매개변수는 구조체의 프로퍼티 이름으로 자동 지정됩니다.
인스턴스에 접근할때는 마침표(.)를 사용합니다.
-. 구조체를 상수 let으로 선언 시 인스턴스 내부 프로퍼티 값 변경 불가
-. 변수 var 선언 시 내부 프로퍼티 값 변경 가능
2. 클래스
클래스는 구조체와 어떻게 다른지 살펴보겠습니다. 스위프트의 클래스는 부모 클래스가 없더라도 상속 없이 단독으로 정의가 가능합니다.
2-1. 정의
클래스 정의 시 class라는 키워드를 사용합니다.
class 클래스 이름 {
프로퍼티와 메서드
}
-. 클래스 이름 : 대문자 카멜케이스
-. 프로퍼티와 메서드 : 소문자 카멜케이스
만약 상속받는 부모클래스가 있을 시 클래스 이름 뒤 콜론(:)을 붙여줍니다.
class 클래스 이름: 부모클래스 이름 {
프로퍼티와 메서드
}
2-2. 인스턴스의 생성 및 초기화
기본적으로 인스턴스 생성 및 초기화 시 이니셜라이저를 사용합니다.
기본값이 지정되어 있는 경우 전달인자를 통하여 따로 초기값을 주지 않아도 됩니다.
프로퍼티 값에 접근할 때는 구조체와 마찬가지로 마침표(.)를 사용합니다.
다만, 구조체와 다르게 클래스의 인스턴스는 참조타입으로 인스턴스를 let으로 선언해도 내부 프로퍼티 값을 변경 할 수 있습니다.
2-3. 인스턴스의 소멸
참조타입임으로 참조할 필요가 없을 시 메모리에서 해제됩니다. (이 과정을 소멸이라 합니다.)
소멸 직전 deinit 메서드(디이니셜라이저-Deinitializer)를 호출합니다. 해당 메서드는 클래스당 하나만 구현할 수 있으며 매개변수와 반환값을 가질 수 없습니다. 또한 매개변수를 가질 수 없음으로 소괄호도 적지 않습니다.
-. 위 코드에서 Person 클래스의 green 인스턴스 생성 시 Person 뒤 물음표(?)를 붙여주었습니다.
이는 옵셔널의 사용으로 nil값이 들어올 수 있음으로 붙여주었습니다.
3. 구조체와 클래스의 차이
[같은점]
1) 값 저장 시 프로퍼티를 정의할 수 있습니다.
2) 기능을 위한 메서드를 정의할 수 있습니다.
3) 프로퍼티 값을 통해 서브스크립트를 정의할 수 있습니다.
4) 초기화 상태를 지정하기 위해 이니셜라이저를 정의할 수 있습니다.
5) 새로운 기능 추가를 위해 익스텐션을 통해 확장이 가능합니다.
6) 특정 프로토콜을 준수할 수 있습니다.
[차이점]
1) 구조체는 상속할 수 없습니다.
2) 타입캐스팅은 클래스의 인스턴스만 가능합니다.
3) 디이니셜라이저는 클래스의 인스턴스에만 사용됩니다.
4) 참조횟수계산(Reference Counting)은 클래스의 인스턴스에만 가능합니다.
-> 즉 둘의 차이점을 구분짓는것은 구조체는 값 타입 / 클래스는 참조 타입입니다.
3-1. 값 타입과 참조 타입
가장 큰 두 타입의 차이점은 '뭐가 전달되냐' 입니다.
-. 값 타입 : 전달될 값이 복사되어 전달
-. 참조 타입 : 전달될 값을 복사하지 않고 참조(주소)가 전달
값 타입은 메모리에 전달인자를 위한 인스턴스가 새로 생성
참조 타입은 새로운 인스턴스가 아닌 기존의 인스턴스 참조를 전달
참조 타입에서 인스턴스끼리 참조가 같은지 확인할 때 식별 연산자(Identify Operator)을 사용합니다.
var green:Person = Person() let blakc: Person = green let yellow: Person = Person() print(green === black) //true print(green === yellow) //false print(blakc !== yellow) //true
구조체에서 기존 인스턴스를 따라 생성하면 해당 인스턴스의 값을 변경하더라도 값만 복사하여 변경한것으로 기존 인스턴스의 값은 변경되지 않습니다.
그러나, 클래스에서는 해당 인스턴스의 값을 변경하면 기존 인스턴스와 같은 참조이기 때문에 기존 인스턴스의 값도 변경됩니다.
만약 새로 인스턴스를 할당 받는다면 참조가 달라지게 됩니다.
3-2. 기본 데이터 타입은 모두 구조체
스위프트의 표준 라이브러리에 포함되어 있는 기본 데이터 타입은 모두 구조체입니다.
4. 구조체와 클래스 올바르게 사용하기
해당 두 타입은 비슷한 점이 많습니다. 모두 새로운 데이터 타입을 정의하고 기능을 추가한다는 점은 같습니다.
하지만 값 타입과 참조 타입을 명확히 구분하여야합니다. 올바르게 선택하여 사용하여야 합니다.
애플 가이드라인에서 아래 조건 중 하나라도 해당되면 구조체 사용을 권장합니다.
1) 값의 집합을 캡슐화 하는것만이 목적
2) 값을 참조하기보다 복사/할당할 때
3) 상속받거나 상속할 필요가 없을 때
그 외 대부분의 사용자 정의 데이터 타입은 클래스로 구현하는것이 좋습니다.
이렇게 이번 시간에는 구조체와 클래스에 대해 같은점/차이점 그리고 생성 정의하여 사용하는 방법을 알아보았습니다,
다소 많이 어렵게 느껴질 수 있다고 생각됩니다.
그렇지만 프로그래밍중 꼭 필요하게 잘 숙지해야하는 부분임을 명확히 기억하고 학습해보죠 모두!
다음 포스팅에서는 구조체 클래스에 이어 프로퍼티와 메서드에 대해 학습해보겠습니다~~!!
점점 내용이 어려워지고 헷갈리는 만큼 집중해서 좋은 결과를 내보도록 합시다 ^^
감사합니다!
'Swift' 카테고리의 다른 글
객체지향 프로그래밍 패러다임 (0) 2020.11.08 랜덤함수 (0) 2020.11.04 옵셔널 (0) 2020.11.03 특수 기호와 문자 읽는법 (0) 2020.11.02 함수 (0) 2020.11.02