Swift/문법

앱개발 용어 정리(3) - 구조체와 클래스, 메서드

yurim-dev 2024. 2. 7. 14:53

* 참고 : nbcamp 깃북(링크), 프린스송님 블로그(링크), pnlkc님 블로그(링크), 예코림딩님 블로그(링크)

 


 

1. 구조체와 클래스

  • 구조체나 클래스는 하나의 큰 코드 블록이다. 변수나 상수를 넣어 값을 저장하거나, 함수를 넣어 기능을 정의할 수 있다. => 다른 종류의 객체에 의존하지 않고도 자체적으로 값을 저장하거나 함수적인 기능을 구현할 수 있다.
  • 객체지향의 근간을 이루는 핵심 객체이다.
    • 객체지향 언어는 필요한 기능을 객체로 구현하여 사용한다.

1-1. 명칭의 차이

일반 명칭
구조체/클래스에서의 명칭
변수 / 상수
프로퍼티(properties), 속성, 변수, 상수
함수
메서드(method)

* 프로퍼티와 메서드를 합쳐서 구조체나 클래스의 '멤버(Member)'라고 표현하기도 함.

1-2. 구조체와 클래스 비교

공통점
  • 프로퍼티 - 변수나 상수를 사용하여 값을 저장하는 프로퍼티를 정의할 수 있다.
  • 메서드 - 함수를 사용하여 기능을 제공하는 메서드를 정의할 수 있다.
  • 서브스크립트 - 속성값에 접근할 수 있는 방법을 제공하는 서브스크립트를 정의할 수 있다.
  • 초기화 블록 - 객체를 원하는 초기 상태로 설정해주는 초기화 블록을 정의할 수 있다.
  • 확장 - 객체에 함수적 기능을 추가하는 확장(extends) 구문을 사용할 수 있다.
  • 프로토콜 - 특정 형식의 함수적 표준을 제공하기 위한 프로토콜을 구현할 수 있다.
차이점
구조체는 할 수 없지만 클래스는 할 수 있는 기능 ;
  • 상속 - 클래스의 특성을 다른 클래스에게 물려줄 수 있다.
  • 타입 캐스팅 - 실행 시 컴파일러가 클래스 인스턴스의 타입을 미리 파악하고 검사할 수 있다.
  • 소멸화 구문 - 인스턴스가 소멸되기 직전에 처리해야 할 구문을 미리 등록해 놓을 수 있다.
  • 참조에 의한 전달 - 클래스 인스턴스가 전달될 때에는 참조 형식으로 제공되며, 이때 참조가 가능한 개수는 제약이 없다.

1-3. 정의

  • 구조체/클래스 이름의 첫 글자는 대문자, 나머지 글자는 소문자로 작성!
  • 구조체는 struct로, 클래스는 class로 정의

2. 메서드

메서드는 클래스나 구조체, 열거형과 같은 객체 내에 함수가 선언될 경우 이를 메서드라고 통칭한다.

즉, 특정 타입의 객체 내부에서 사용하는 함수라고 할 수 있다.

2-1. 함수 vs. 메서드

함수 : 독립적인 기능 구현을 위해 만들어짐

메서드 : 하나의 객체 내에 정의된 다른 메서드들과 서로 협력하여 함수적 기능을 수행함.

2-2. 메서드 종류 : 인스턴스 메서드와 타입 메서드

2-2-1. 인스턴스 메서드

클래스, 구조체, 열거형과 같은 객체 타입이 만들어내는 인스턴스에 소속된 함수.

객체 타입 내부에 선언된다는 점을 제외하고는 일반 함수와 선언하는 형식이 완전히 동일하다.

객체 타입을 인스턴스화한 후, 이 인스턴스를 통해 호출하게 된다.

일반 함수와의 차이점

  1. 구조체와 클래스의 인스턴스에 소속된다.
  2. 메서드 내에서 정의된 변수와 상수뿐만 아니라 클래스 범위에서 정의된 프로퍼티도 모두 참조할 수 있다.
  3. 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()