[Swift] 구조체와 클래스 - 인스턴스, 값 전달 방식

민니·2022년 7월 4일
0

Swift 문법

목록 보기
7/17

구조체와 클래스

  • 필요한 기능을 객체로 구현하여 사용한다는 것이 바로 객체지향 언어의 핵심
  • 객체를 만들어내는 주요 대상이 바로 구조체와 클래스이다
  • Swift는 객체지향 언어라는 것을 명심할 것 ❗️

정의 형식

  • 구조체 정의 형식
struct 구조체_이름 {
	//구조체 정의 내용
}
  • 클래스 정의 형식
class 클래스_이름 {
	//클래스 정의 내용
}

메서드와 프로퍼티

  • 프로퍼티: 구조체와 클래스 내부에서 정의된 변수나 상수
  • 메서드: 함수를 정의하여 특정 기능을 정의(구조체나 클래스 내부에서 작성된 함수라고 생각하면 됨)
  • Example
//해상도 정보 관리 구조체
struct Resolution { 
	var width = 0 //프로퍼티
    var height = 0 //프로퍼티
    
    //메서드
    func desc() -> String {
    	return "Resolution 구조체"
    }
}

//비디오에 대한 정보 관리 클래스
class VideoMode {
	var interlaced = false //프로퍼티
    var frameRate = 0.0 //프로퍼티
    var name: String? //프로퍼티
    
    //메서드
    func desc() -> String {
    	return "VideoMode 클래스"
    }
}

인스턴스

  • 우리가 정의한 클래스나 구조체를 그대로 사용하여 값을 저장하거나 메서드를 실행할 수 없음.
  • 값을 저장하거나, 메서드를 실행하는 데에 필요한 메모리 공간을 할당받지 못했기 때문
  • 이때 메모리 공간을 할당받은 것이 바로 인스턴스
  • 인스턴스 생성해 보기
let insRes = Resolution()
let insVMode = VideoMode()

📚 insRes, insVMode는 인스턴스


  • 인스턴스 속성에 접근해 보기
let width = insRes.width
print("insRes 인스턴스의 width 값은 \(width)입니다")
//insRes 인스턴스의 width 값은 0입니다

초기화

  • 객체의 프로퍼티를 초기화하기 위해, 구조체나 클래스 이름 뒤에 인자값을 넣어주기도 함
  • ❗️옵셔널 타입으로 선언되지 않은 모든 프로퍼티❗️는 초기화가 필요
  • 클래스나 구조체의 모든 프로퍼티는 적어도 인스턴스가 생성되는 시점까지는 반드시 초기화되어야 함

구조체 초기화

  • 기본 초기화 구문
let defaultRes = Resolution()

📚 인스턴스 생성 역할만
📚 객체의 모든 프로퍼티는 선언과 동시에 초기값이 지정되어 있어야 함


  • 멤버와이즈 초기화 구문(Memberwise Initializer)
let defaultRes = Resolution(width: 1024, height: 700)

print("width: \(defaultRes.width). height: \(defaultRes.height)")
//width: 1024, height: 700

📚 Resolution 구조체의 width, height 프로퍼티 초기화를 위한 인자값을 받음
📚 내부적으로 프로퍼티 초기화


클래스 초기화

  • 멤버와이즈 형식 초기화 구문 x, 기본 초기화 구문만
  • 모든 프로퍼티는 정의할 때 초기값 필요, 혹은 옵셔널 타입으로 선언
  • 기본 초기화 구문
let defaultVMode = VideoMode()

값 전달 방식

  • 구조체: 복사에 의한 전달
    📚 구조체 인스턴스를 변수에 대입하면, 기존의 인스턴스가 그대로 대입 x, 이를 복사한 새로운 값 대입 o
    📚 인스턴스를 할당한 후 기존 인스턴스나 할당된 쪽의 인스턴스에 변경이 발생하여도 서로에게 전혀 영향을 미치지 않음
    📚 구조체 인스턴스가 값을 변경하려면 무조건 변수에 할당되어야 함
    📚 Example
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048

print("cinema 인스턴스의 width 값은 \(cinema.width)입니다")
//cinema 인스턴스의 width 값은 2048입니다.

print("hd 인스턴스의 width 값은 \(hd.width)입니다")
//hd 인스턴스의 width 값은 1920입니다
  • 클래스: 참조에 의한 전달
    📚 인스턴스가 저장된 메모리 주소 정보가 전달됨(객체 자체를 전달한다)
    📚 한 곳에서 수정할 경우 다른 곳에도 적용됨
    📚 참조 타입이므로, 하나의 클래스 인스턴스를 여러 변수나 상수, 또는 함수의 인자값에서 동시에 참조할 수 있음
    📚 Example
let video = VideoMode()
video.name = "Original Video Instance"
print("video 인스턴스의 name 값은 \(video.name!)입니다.")
//video 인스턴스의 name 값은 Original Video Instace입니다.

let dvd = video
dvd.name = "DVD Video Instance"
print("video 인스턴스의 name 값은 \(video.name!)입니다.")
//dvd 인스턴스의 name 값은 DVD Video Instace입니다.



출처)
꼼꼼한 재은씨의 스위프트: 문법편

0개의 댓글