Swift/문법
앱개발 용어 정리(3) - 구조체와 클래스, 메서드
yurim-dev
2024. 2. 7. 14:53
* 참고 : nbcamp 깃북(링크), 프린스송님 블로그(링크), pnlkc님 블로그(링크), 예코림딩님 블로그(링크)
1. 구조체와 클래스
- 구조체나 클래스는 하나의 큰 코드 블록이다. 변수나 상수를 넣어 값을 저장하거나, 함수를 넣어 기능을 정의할 수 있다. => 다른 종류의 객체에 의존하지 않고도 자체적으로 값을 저장하거나 함수적인 기능을 구현할 수 있다.
- 객체지향의 근간을 이루는 핵심 객체이다.
- 객체지향 언어는 필요한 기능을 객체로 구현하여 사용한다.
1-1. 명칭의 차이
일반 명칭
|
구조체/클래스에서의 명칭
|
변수 / 상수
|
프로퍼티(properties), 속성, 변수, 상수
|
함수
|
메서드(method)
|
* 프로퍼티와 메서드를 합쳐서 구조체나 클래스의 '멤버(Member)'라고 표현하기도 함.
1-2. 구조체와 클래스 비교
공통점
|
|
차이점
|
구조체는 할 수 없지만 클래스는 할 수 있는 기능 ;
|
1-3. 정의
- 구조체/클래스 이름의 첫 글자는 대문자, 나머지 글자는 소문자로 작성!
- 구조체는 struct로, 클래스는 class로 정의
2. 메서드
메서드는 클래스나 구조체, 열거형과 같은 객체 내에 함수가 선언될 경우 이를 메서드라고 통칭한다.
즉, 특정 타입의 객체 내부에서 사용하는 함수라고 할 수 있다.
2-1. 함수 vs. 메서드
함수 : 독립적인 기능 구현을 위해 만들어짐
메서드 : 하나의 객체 내에 정의된 다른 메서드들과 서로 협력하여 함수적 기능을 수행함.
2-2. 메서드 종류 : 인스턴스 메서드와 타입 메서드
2-2-1. 인스턴스 메서드
클래스, 구조체, 열거형과 같은 객체 타입이 만들어내는 인스턴스에 소속된 함수.
객체 타입 내부에 선언된다는 점을 제외하고는 일반 함수와 선언하는 형식이 완전히 동일하다.
객체 타입을 인스턴스화한 후, 이 인스턴스를 통해 호출하게 된다.
일반 함수와의 차이점
- 구조체와 클래스의 인스턴스에 소속된다.
- 메서드 내에서 정의된 변수와 상수뿐만 아니라 클래스 범위에서 정의된 프로퍼티도 모두 참조할 수 있다.
- self 키워드를 사용할 수 있다.
구조체 안의 변수 : "프로퍼티(property)"
구조체 안의 함수 : "메소드(method)"
* 프로퍼티와 일반 변수(파라미터) 이름이 충돌할 때, 프로퍼티 앞에 반드시 self 키워드를 부여야 한다.
self.width => 클래스나 구조체 자신의 인스턴스에 속한 width 프로퍼티를 의미.

▽ 클래스 및 메서드 정의
class Counter {
// 카운트를 저장할 프로퍼티
var count = 0
// 카운트를 1 증가
func increment() {
self.count += 1
}
// 입력된 값만큼 카운트를 증가
func incrementBy(amount: Int) {
self.count += amount
}
// 카운트를 0으로 초기화
func reset() {
self.count = 0
}
}
▽ 메서드 호출
* 인스턴스 메서드를 호출할 때는 인스턴스를 할당한 상수 or 변수와 메서드 사이에 점을 사용하여 연결한다.
// Counter 클래스의 인스턴스를 생성합니다. 초기 카운터 값은 0입니다
let counter = Counter()
// 카운터 값을 증가시킵니다. 이제 카운터 값은 1입니다
counter.increment()
// 카운터 값을 5만큼 증가시킵니다. 이제 카운터 값은 6입니다
counter.incrementBy(amount: 5)
// 카운터 값을 초기화시킵니다. 이제 카운터 값은 0입니다
counter.reset()
2-2-2. 타입 메서드
인스턴스를 생성하지 않고 객체 타입 자체에서 호출할 수 있는 메서드.
아직 잘 모르겠는 개념..
<특징>
- 객체 타입 전체에 영향을 미침
- 타입 메서드 자체에 인스턴스가 존재하지 않으므로 인스턴스 프로퍼티를 참조할 수 없음.
class Foo {
// 타입 메서드 선언
class func fooTyopeMethod() {
// 타입 메서드 구현 내용 들어갑니다
}
}
let f = Foo()
f.fooTypeMethod() // 오류
Foo.fooTypeMethod()