大器晩成

구조체(Struct)와 클래스(Class) 본문

iOS/Swift 문법

구조체(Struct)와 클래스(Class)

zerobugpark 2024. 11. 21. 17:01

 

구조체와 클래스를 설명하기 전에, 객체지향 프로그램에 대해서 간단하게 생각해보려고 합니다.

체 지향 프로그램(Object-Oriented Programming, OOP)은 프로그램의 패러다임 중 하나로,  필요한 데이터를 추상화시켜, 객채들 간의 상호 작용을 통해 로직을 구성하는 프로그래밍 방법이라고 많이 정의가 되어있습니다.

 

이렇게만 들으면 사실 잘 와닿는 부분은 아니지만, 위키백과의 정의된 내용을 보면 "여러 개의 독립된 단위, 즉 "객체"들의 모임을 파악하고자 하는 것이다"라고 나와있습니다.

 

여기서 우리는 어떠한 여러 개의 변수나, 함수 같은 것들이 있는데, 이것들의 모임 즉 "데이터를 묶어서 쓰는 것"이라고 생각해 볼 수 있습니다.

 

데이터를 묶어서 쓰는 방법에는 여러 개의 방법이 있지만, 구조체와 클래스를 통해 알아보려고 합니다.

 

만약 다음과 같은 예제가 있다면 어떨까요?

네이버에서 iOS 신입사원 채용공고가 나왔습니다. 네이버의 이력서 양식은 이름, 나이, 성별만 작성하면 된다고 나와있습니다.

var 홍길동 = "홍길동"
var 홍길동나이 = 22
var 홍길동성별 = "남"

var 신사임당 = "신사임당"
var 신사임당나이 = 22
var 신사임당성별 = "여"

위에 코드처럼 수많은 지원자들이 양식에 맞춰서 지원할 것입니다. 1 ~ 2명이면 관리하기가 쉽지만, 수백 수천 명의 지원자의 이력서가 나온다면 저 많은 변수들은 관리하기가 쉽지 않을 것입니다. 이러한 공통적으로 쓰이는 항목들에 대해서 하나로 묶어서 사용하기 위해서 클래스와 구조체를 사용할 수 있습니다.

 

네이버에서는 그림처럼 네이버 지원서 양식을 만들고, 각 지원자는 양식에 맞는 자기만의 이력서를 제출할 것입니다.

여기서 네이버 지원서 양식을 가지고 자기만의 이력서들 만들 사람들 즉, "홍길동", "신사임당", "이순신" 모두가 객체입니다.

이때, 객체를 생성하는 과정을 인스턴스화라고 합니다.

 

 

구조체(Struct)와 클래스(Class)

  • 구조체와 클래스는 하나의 큰 코드 블록입니다.
  • 구조체나 클래스는 정의하는 구문  형식이 비슷합니다.
  • 구조체는 struct 키워드를 사용하여 정의하고, 클래스는 class 키워드를 사용하여 정의합니다.

클래스와 구조체의 정의 형식

 #1. 구조체의 정의 형식
 struct 구조체_이름 {
    구조체 정의
 }
 
 struct NaverResume {
     //구조체 내용 작성
 }
 
#2. 클래스의 정의 형식
 class 클래스_이름 {
    클래스 정의
 }
 
 class NaverResume {
     //클래스 내용 작성
 }

 

메서드와 프로퍼티

//프로퍼티와 메소드가 정의된 구조체와 클래스
struct NaverResume {
    var name = "홍길동" //저장 프로퍼티(속성)
    var age = 22 //저장 프로퍼티(속성)
    var gender = "남"
    
    func submit()  { //메서드
        print("제출이 완료되었습니다.")
    }
}

class NaverResume {
    var name = "신사임당" //저장 프로퍼티(속성)
    var age = 23 //저장 프로퍼티(속성)
    var gender = "여"
    
    func submit()  { //메서드
        print("제출이 완료되었습니다.")
    }
}
  • 구조체와 클래스 내부에서 정의된 변수나 상수를 프로퍼티(property) 또는 속성이라고 합니다.
  • 함수를 정의하여 특정 기능을 정의할 수도 있는데, 이를 메서드(method)라고 한다.

인스턴스

  • 구조체나 클래스는 실행할 수 있는 객체가 아니라, 값을 담을 수 있는 실질적은 그릇을 만들어 내기 위한 일정의 틀이다. 즉 원형(Origin)입니다.
  • 틀 역할을 하는 클래스나 구조체를 정의하고 이를 바탕으로 실질적으로 값을 담을 여러 개의 그릇을 만들어내는 것, 이것이 객체 지향 프로그래밍의 원리입니다.
  • 이때, 원형 틀을 이용하여 찍어낸 그릇을 인스턴스(Instance)라고 한다.
    -> 객체와 인스턴스의 차이를 찾아보면 거의 비슷하다고 하지만, 인스턴스는 객체 안에 포함됩니다.
  • 구조체로 찍어내면 구조체의 인스턴스이고, 클래스로 찍어내면 클래스의 인스턴스이다.

인스턴스 생성방식

  • 인스턴스를 생성하는 가장 단순한 형태는 구조체나 이름 뒤에 빈 괄호()를 덧붙이는 것입니다.
  • 즉 대문자로 시작, 뒤에 () 소괄호가 온다면, 이것이 인스턴스의 생성입니다.
  • 함수 호출 연산자와 모양은 같지만 의미는 다릅니다. 클래스나 구조체를 호출하는 것이 아니라 클래스나 구조체를 초기화하여 인스턴스를 생성하는 역할을 합니다.
  • 둘 다 괄호를 사용하는 연산자이지만, 함수의 이름 다음에 오면 함수 호출 연산자 역할을 하고, 클래스나 구조체 이름 다음에 오면 인스턴스 생성 연산자가 됩니다.

접근방법

  • 구조체나 클래스의 선언된 프로퍼티는 오직 인스턴스를 통해만 접근할 수 있습니다.
  • 프로퍼티에 접근하려면 반드시 인스턴스를 먼저 생성해야 합니다.
  • 프로퍼티에 접근할 때는 점 문법(Dot Syntax)을 이용하여 인스턴스의 하위 객체에 접근할 수 있습니다.
  • <인스턴스이름>. <프로퍼티이름>

클래스 예시

#1. 클래스의 정의와 객체의 생성
// 클래스만들기 (이력서 양식 만들기)
class NaverResume {
    var name: String
    var age: Int
    var gender: String
    
    func submit()  { //메서드
        print("제출이 완료되었습니다.")
    }
    
    init(name: String, age: Int, gender: String) {
        self.name = name
        self.age = age
        self.gender = gender
    }
}

// 홍길동 인스턴스 생성
let 홍길동 = NaverResume(name: "홍길동", age: 22, gender: "남")

// 신사임당 인스턴스 생성
let 신사임당 = NaverResume(name: "신사임당", age: 23, gender: "여")

// 이순신 인스턴스 생성
let 이순신 = NaverResume(name: "이순신", age: 32, gender: "남")


홍길동.name // 홍길동
홍길동.age  // 22
홍길동.gender // 남

신사임당.name // 신사임당
신사임당.age // 23
신사임당.gender // 여


이순신.name // 이순신
이순신.age // 32
이순신.gender // 남
  • 클래스는 객체(object)를 생성하는 데 사용합니다.
  • 객체란 클래스의 인스턴스를 의미하며, 일반적으로 "클래스의 객체"라는 표현을 사용합니다.
  • 클래스는 참조 타입(reference type)입니다. 즉, 클래스 인스턴스를 여러 곳에서 공유할 수 있으며, 하나의 인스턴스를 변경하면 다른 인스턴스도 영향을 받을 수 있습니다.

구조체 예시

#1. 구조체의 정의와 인스턴스의 생성
// 포켓몬 틀 만들기
struct Pokemon {
    var name = "포켓몬"
    var weight = 0.0
    
    func back() {
        print("몬스터볼로 복귀합니다.")
    }
}

// 포켓몬 찍어내기 (인스턴스의 생성)
var aPokemon = Pokemon()


// 인스턴스의 속성에 접근
aPokemon.name   // "포켓몬"
aPokemon.name = "피카츄" 
aPokemon.name // "피카츄"

aPokemon.weight // 0.0
aPokemon.weight = 7.0
aPokemon.weight // 7.0

aPokemon.back() // 출력: "몬스터볼로 복귀합니다"

// 새로운 포켓몬 찍어내기 (인스턴스의 생성)
var bPokemon = Pokemon()

// 인스턴스의 속성에 접근
bPokemon.name // "포켓몬"
bPokemon.name = "리자몽"
bPokemon.name // "리자몽"

bPokemon.weight // 0.0
bPokemon.weight = 10.00
bPokemon.weight // 10.0

bPokemon.back() // 출력: "몬스터볼로 복귀합니다"
  • 구조체는 인스턴스(instance)를 생성하는 데 사용.
  • 구조체는 값 타입(value type)입니다. 즉, 구조체 인스턴스는 값을 복사하여 전달되므로, 한 인스턴스를 변경하더라도 다른 인스턴스에는 영향을 미치지 않습니다.

 

참고사항

  • 클래스와 구조체 둘 다, 메모리에 찍어낸 것을 인스턴스(instance)라고 합니다.
  • 인스턴스는 실제로 메모리에 할당되어 구체적 실체를 갖춘 것이라는 의미를 가진다.
  • 스위프트에서는 클래스의 인스턴스(instance)를 특별히 객체(object)라고 부릅니다..
    - 클래스의 인스턴스(객체) / 구조체의 인스턴 / 열거형의 인스턴스
    - 인스턴스로 통일해서 부르는 경우가 훨씬 많습니다.
  • 객체지향 프로그램이란 어떤 틀이 있고 틀에다가 데이터를 찍어내는 것입니다. (ex) 틀: class, 데이터: 객체)

구조체와 클래스명 작성 규칙

  • 프로그래밍 언어마다 차이가 있을 수 있으며, 회사 또는 개개인의 차이가 있을 수 있습니다.
  • 아래 내용은 스위프트에서 많이 사용되는 방식을 나열한 것이며, 꼭 이 규칙을 따를 필요는 없습니다.
// 첫 글자는 대문자로 시작
struct Integer {}
struct String {}
class Object {}
class Controller {}

//2단어 이상으로 이루어진 복합 단어일 때는 단어마다 대소문자를 번갈아 표기
struct SingedInteger {} // Singed + Integer
class ViewController {} // View + Controller

//약어로 이루어진 부분은 모두 대문자로 표기
struct JSONDictionay {} // JSON은 JavaScript Object Notataion을 나타내는 약어
class UIView {} // UI: UIKit 프레임워크를 나타내는 약어 접두어
class UIButton {}
  • 클래스나 구조체의 이름을 작성할 때에는 첫 글자는 대문자로, 나머지 글자는 소문자로 작성하는 것이 원칙입니다.
  • 두 개 이상의 복합 단어로 이루어지는 경우 끊어 첫 글자는 대문자로, 나머지는 소문자로 작성하는 것을 반복하되, 이미 축약된 약어는 전부 대문자로 작성합니다(Camel 표기법)
  •  구조체와 클래스 이름의 첫 글자는 대문자로, 나머지 글자는 소문자로 작성합니다.
  • 2개 이상의 복합 단어는 단어별로 끊어 첫 글자는 대문자로, 나머지는 소문자로 작성합니다.
  • 이미 축약된 약어는 모두 대문자로 작성 가능합니다.(ex. Json, NS, HTTP 등)
  • 프로퍼티나 메서드를 선언할 때는 소문자로 시작합니다.
  • 언더바로 단어를 연결하는 방식은 지양합니다.

 

728x90

'iOS > Swift 문법' 카테고리의 다른 글

초기화(initializer)  (0) 2024.11.21
클래스와 구조체의 차이  (0) 2024.11.21
옵셔널 체이닝  (4) 2024.11.12
inout 파라미터  (0) 2024.11.08
Swift 제어전송문  (0) 2024.11.08