프로퍼티

프로퍼티는 클래스, 구조체, 열거형과 연관된 값입니다. 타입과 관련된 값을 저장할 수도, 연산할 수도 있습니다.


소스코드


프로퍼티의 종류

  • 인스턴스 저장 프로퍼티
  • 타입 저장 프로퍼티
  • 인스턴스 연산 프로퍼티
  • 타입 연산 프로퍼티
  • 지연 저장 프로퍼티

이번 파트에서는 지연 저장 프로퍼티를 제외한 저장 프로퍼티와 연산 프로퍼티에 대해 알아봅니다.


정의와 사용

프로퍼티는 구조체, 클래스, 열거형 내부에 구현할 수 있습니다. 다만 열거형 내부에는 연산 프로퍼티만 구현할 수 있습니다. 연산 프로퍼티는 var로만 선언할 수 있습니다.

연산프로퍼티를 읽기전용으로는 구현할 수 있지만, 쓰기 전용으로는 구현할 수 없습니다. 읽기전용으로 구현하려면 get 블럭만 작성해주면 됩니다. 읽기전용은 get블럭을 생략할 수 있습니다. 읽기, 쓰기 모두 가능하게 하려면 get 블럭과 set블럭을 모두 구현해주면 됩니다.  

set 블럭에서 암시적 매개변수 newValue를 사용할 수 있습니다.

struct Student {
    
    // 인스턴스 저장 프로퍼티
    var name: String = ""
    var `class`: String = "Swift"
    var koreanAge: Int = 0
    
    // 인스턴스 연산 프로퍼티
    var westernAge: Int {
        get {
            return koreanAge - 1
        }
        
        set(inputValue) {
            koreanAge = inputValue + 1
        }
    }
    
    // 타입 저장 프로퍼티
    static var typeDescription: String = "학생"
    
    /*
    // 인스턴스 메서드
    func selfIntroduce() {
        print("저는 \(self.class)반 \(name)입니다")
    }
     */
    
    // 읽기전용 인스턴스 연산 프로퍼티
    // 간단히 위의 selfIntroduce() 메서드를 대체할 수 있습니다
    var selfIntroduction: String {
        get {
            return "저는 \(self.class)반 \(name)입니다"
        }
    }
        
    /*
     // 타입 메서드
     static func selfIntroduce() {
     print("학생타입입니다")
     }
     */
    
    // 읽기전용 타입 연산 프로퍼티
    // 읽기전용에서는 get을 생략할 수 있습니다
    static var selfIntroduction: String {
        return "학생타입입니다"
    }
}

// 타입 연산 프로퍼티 사용
print(Student.selfIntroduction)
// 학생타입입니다

// 인스턴스 생성
var yagom: Student = Student()
yagom.koreanAge = 10

// 인스턴스 저장 프로퍼티 사용
yagom.name = "yagom"
print(yagom.name)
// yagom

// 인스턴스 연산 프로퍼티 사용
print(yagom.selfIntroduction)
// 저는 Swift반 yagom입니다

print("제 한국나이는 \(yagom.koreanAge)살이고, 미쿡나이는 \(yagom.westernAge)살입니다.")
// 제 한국나이는 10살이고, 미쿡나이는 9살입니다.


응용

struct Money {
    var currencyRate: Double = 1100
    var dollar: Double = 0
    var won: Double {
        get {
            return dollar * currencyRate
        }
        set {
            dollar = newValue / currencyRate
        }
    }
}

var moneyInMyPocket = Money()

moneyInMyPocket.won = 11000

print(moneyInMyPocket.won)
// 11000

moneyInMyPocket.dollar = 10

print(moneyInMyPocket.won)
// 11000


지역변수 및 전역변수

저장 프로퍼티와 연산 프로퍼티의 기능은 함수, 메서드, 클로저, 타입 등의 외부에 위치한 지역/전역 변수에도 모두 사용 가능합니다.

var a: Int = 100
var b: Int = 200
var sum: Int {
    return a + b
}

print(sum) // 300


프로퍼티 감시자


프로퍼티 감시자를 사용하면 프로퍼티 값이 변경될 때 원하는 동작을 수행할 수 있습니다. 값이 변경되기 직전에 willSet블럭이, 값이 변경된 직후에 didSet블럭이 호출됩니다. 둘 중 필요한 하나만 구현해 주어도 무관합니다. 변경되려는 값이 기존 값과 똑같더라도 프로퍼티 감시자는 항상 동작합니다. 

willSet 블럭에서 암시적 매개변수 newValue를 사용할 수 있고, didSet 블럭에서 암시적 매개변수 oldValue를 사용할 수 있습니다.

프로퍼티 감시자는 연산 프로퍼티에 사용할 수 없습니다.


소스코드



정의 및 사용

struct Money {
    // 프로퍼티 감시자 사용
    var currencyRate: Double = 1100 {
        willSet(newRate) {
            print("환율이 \(currencyRate)에서 \(newRate)으로 변경될 예정입니다")
        }
        
        didSet(oldRate) {
            print("환율이 \(oldRate)에서 \(currencyRate)으로 변경되었습니다")
        }
    }

    // 프로퍼티 감시자 사용
    var dollar: Double = 0 {
        // willSet의 암시적 매개변수 이름 newValue
        willSet {
            print("\(dollar)달러에서 \(newValue)달러로 변경될 예정입니다")
        }
        
        // didSet의 암시적 매개변수 이름 oldValue
        didSet {
            print("\(oldValue)달러에서 \(dollar)달러로 변경되었습니다")
        }
    }

    // 연산 프로퍼티
    var won: Double {
        get {
            return dollar * currencyRate
        }
        set {
            dollar = newValue / currencyRate
        }
        
        /* 프로퍼티 감시자와 연산 프로퍼티 기능을 동시에 사용할 수 없습니다
        willSet {
            
        }
         */
    }    
}

var moneyInMyPocket: Money = Money()

// 환율이 1100.0에서 1150.0으로 변경될 예정입니다
moneyInMyPocket.currencyRate = 1150
// 환율이 1100.0에서 1150.0으로 변경되었습니다

// 0.0달러에서 10.0달러로 변경될 예정입니다
moneyInMyPocket.dollar = 10
// 0.0달러에서 10.0달러로 변경되었습니다

print(moneyInMyPocket.won)
// 11500.0



관련문서

The Swift Programming Language - Properties





by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓ 블로거에게 공감은 큰 힘이 됩니다 ↓↓↓ 


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

인스턴스의 생성과 소멸  (0) 2017.07.03
상속  (0) 2017.06.29
프로퍼티 - Property  (2) 2017.06.26
클로저 - Closure  (0) 2017.06.22
클래스, 구조체, 열거형 비교  (0) 2017.06.19
열거형 - Enumerations  (0) 2017.06.15
Posted by yagom

상수, 변수의 선언




소스코드


  • 상수 선언 키워드 let
  • 변수 선언 키워드 var


let 이름: 타입 =
var 이름: 타입 =


값의 타입이 명확하다면 타입은 생략 가능

let 이름 = 값  
var 이름 = 값
let constant: String = "차후에 변경이 불가능한 상수 let"
var variable: String = "차후에 변경이 가능한 변수 var"

variable = "변수는 이렇게 차후에 다른 값을 할당할 수 있지만"
// constant = "상수는 차후에 값을 변경할 수 없습니다" // 오류발생


상수 선언 후에 나중에 값 할당하기


나중에 할당하려고 하는 상수나 변수는 타입을 명시해주어야 합니다

let sum: Int
let inputA: Int = 100
let inputB: Int = 200

// 선언 후 첫 할당
sum = inputA + inputB

// sum = 1 // 그 이후에는 다시 값을 바꿀 수 없습니다, 오류발생

// 변수도 물론 차후에 할당하는 것이 가능합니다
var nickName: String

nickName = "yagom"

// 변수는 차후에 다시 다른 값을 할당해도 문제가 없지요
nickName = "야곰"


생각해보기


다음과 같은 경우에 각 값은 상수와 변수 중 어느 것으로 선언하는 것이 더 좋을지 생각해 봅시다.

OOO name = "yagom"
OOO numberToAdd = 5
OOO pi = 3.14195
OOO maxItemCount = 1000


관련문서





by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   




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

컬렉션 타입  (0) 2017.05.22
데이터 타입  (0) 2017.05.18
상수와 변수  (0) 2017.05.15
이름짓기, 콘솔로그, 문자열 보간법  (0) 2017.05.11
스위프트 시작하기  (0) 2017.05.08
Swift - 프로토콜, 익스텐션  (0) 2017.03.07
Posted by yagom


오늘의 주제

Objective-C의 상수와 스위프트의 상수


안녕하세요 야곰입니다.

Objective-C를 쓰다가 스위프트로 넘어왔을 때 고민되었던 부분 중의 하나인 스위프트의 상수에 관해 이야기해 보려 합니다.


혼자 프로젝트를 진행하다 보면 상수의 필요성을 많이 느낄 수 없을지 모르지만, 누군가 협업을 하게 된다면, 혹은 미래 또는 과거의 나와 협업(?)을 하게 된다면 상수의 필요성을 많이 느끼게 됩니다. 바꾸면 안 되는 데이터를 실수로 바꿔서 난감했던 경험이 없나요? 혹시 그런 적이 있다면 상수의 필요성에 대해서는 많이 공감하실 것으로 생각됩니다.


* 오해가 생길 소지의 표현들이 있어서 처음 발행 이후 조금 수정하였습니다. 좋은 의견 주신 과니님 고맙습니다 :)


사라진 const


사실 저는 Objective-C에서 특별한 경우가 아니면 const를 많이 사용하지 않았습니다(반성).


그런데 스위프트에서는 전역이든 지역이든 데이터를 저장할 공간(변수 또는 상수)에는 var 또는 let을 사용하여 변수인지 상수인지 명확히 명시해 주어야 하므로 상수에 대한 고민을 많이 하게 되었습니다.


사실 지역상수가 필요한 경우에 const 키워드를 쓰는 귀찮음 때문에 상수를 많이 사용하지 않았는데 스위프트에서는 var 또는 let을 선택해야 하는 시간이 조금 걸렸지만, 지금은 큰 시간 들일 필요 없이 자연스럽게 상수를 많이 사용하고 있습니다. 또, 혹시라도 상수로 사용해야 하는 경우임에도 변수로 선언하고 사용한다면 Xcode에서 변수 대신 상수를 사용하는 게 어떻냐는 경고를 보여줍니다. 




[Xcode의 경고]


지역상수


지역상수를 사용하는 경우에는 사실 Objective-C와 크게 다를 바 없이 사용할 수 있습니다. 상수의 이름을 지어주는 명명법도 크게 다를 바 없습니다. 

상수로 사용할 변수 앞에 const를 붙여 쓴 것처럼 let을 사용하여 상수를 선언하여 사용하면 됩니다.



// Objective-C
const NSInteger someConstant = 100;


// Swift
let someConstant: Int = 100



전역상수


전역상수를 사용할 때 조금 더 생각해보아야 할 것들이 있습니다. 저는 처음 스위프트를 사용할 때 별생각 없이 Objective-C에서 사용하던 것과 같은 명명법으로 전역상수를 사용했습니다.


// Objective-C NSInteger const  YGSomeGlobalConstant = 100;


// Swift
let YGSomeGlobalConstant: Int = 100


그런데 Objective-C에서 'YG'와 같이 접두어(prefix)를 붙이는 것은 Objective-C에는 네임스페이스(name space)가 없기 때문인데, 스위프트에는 이 단점을 극복했다는 것에 대한 생각이 문득 스쳤습니다.


Objective-C에는 네임스페이스가 없어서 전역변수를 선언하고 사용할 때 꽤 골치가 아팠습니다. 귀찮기도 아주 귀찮았죠. 이름도 매우 길어지기만 했습니다. 열거형(enum)은 정수밖에 지원하지 않기 때문에 다른 타입의 값들은 관련된 상수끼리 묶어 쓰기도 어렵기도 했지요.


// Objective-C의 상수들... // 네임스페이스가 없기 때문에 // 연관된 상수들을 접두어를 사용하여 표현합니다 // 요일 상수들 NSString *const YGWeekMonday = @"MON"; NSString *const YGWeekTuesday = @"TUE"; NSString *const YGWeekWednesday = @"WED"; NSString *const YGWeekThursday = @"THU"; NSString *const YGWeekFriday = @"FRI"; NSString *const YGWeekSaturday = @"SAT"; NSString *const YGWeekSunday = @"SUN"; // 네트워킹 관련 상수들 NSTimeInterval const YGNetworkingTimeoutInterval = 10.0f; NSUInteger const YGNetworkingMaxRetryCount = 3; NSString *const YGNetworkingBaseURLString = @"https://abc.com";


정말 보기만 해도 정신이 없습니다. 또, 실수로 복사 붙여넣기를 하다가 중복된 값을 넣었다면 컴파일 오류가 발생하지 않기 때문에 실수를 찾아내기도 매우 어려워집니다.


스위프트에서는 이런 전역 상수들을 조금 더 멋진 방법으로 표현해 볼 수 있습니다. 타입 내부에 다른 타입을 정의하는 방법으로 네임스페이스를 사용할 수 있습니다. 더군다나 네임스페이스 덕분에 접두어는 더 이상 스위프트에서 사용하지 않습니다.


// Week라는 구조체 타입 내부에
// 여러 타입 상수를 선언
struct Week {
    static let mon: String = "MON"
    static let tue: String = "TUE"
    static let wed: String = "WED"
    static let thu: String = "THU"
    static let fri: String = "FRI"
    static let sat: String = "SAT"
    static let sun: String = "SUN"
}

// 실제 사용시 Week.mon // "MON" Week.sat // "SAT"


처음에 이렇게 선언해 보았습니다. 그런데 만약 복사 붙여넣기를 하다가 실수로 중복된 값을 넣는다면...? 가령 "SUN"을 넣어야 하는데 "SAT"를 넣어버렸다면? 이때는 중복 값이 들어있는지 확인할 수 없습니다. 물론 의도적으로 다른 이름의 상수에 같은 값을 넣을 수도 있지만 그렇지 않은 경우에는 낭패입니다.


그래서 이렇게 개선해 봅니다.


// 열거형의 연관 값(associated value)을 사용하여
// 상수처럼 사용
enum Week: String {
    case mon = "MON"
    case tue = "TUE"
    case wed = "WED"
    case thu = "THU"
    case fri = "FRI"
    case sat = "SAT"
    case sun = "SUN"
}

// 실제 사용시 Week.mon.rawValue // "MON" Week.sat.rawValue // "SAT"



이렇게 사용하면 열거형 내부의 연관 값이 중복되는 경우에 컴파일오류가 발생하게 됩니다. 그래서 미리 실수를 발견하기도 좋습니다.


또, 위의 Objective-C로 선언했던 네트워킹 관련 상수를 스위프트에서 선언한다면 이렇게 바꿔볼 수 있을 것 같습니다.


// Objective-C NSTimeInterval const YGNetworkingTimeoutInterval = 10.0f; NSUInteger const YGNetworkingMaxRetryCount = 3; NSString *const YGNetworkingBaseURLString = @"https://abc.com";
// 사용 YGNetworkingTimeoutInterval // 10.0


// Swift
struct Networking {
    static let timeoutInterval: TimeInterval = 10.0
    static let maxRetryCount: Int = 3
    static let baseURL: URL? = URL(string: "https://abc.com")
}

// 사용

Networking.timeoutInterval // 10.0


이처럼 꼭 열거형의 연관 값을 사용하지 않고 용도에 맞게 구조체의 타입 상수(static let)로 사용해도 좋습니다. 


상수뿐만 아니라 전역변수, 전역함수(메서드) 등에도 충분히 응용할 수 있습니다.


또한 구조체 내부에 다른 타입(구조체, 클래스, 열거형) 등등 몇 단계를 걸쳐 내부 타입을 정의할 수 있기 때문 연관된 값을 타입의 타입의 타입까지 여러 번에 걸쳐 정의도 가능합니다.



struct CalendarItem {
    typealias Year = Int
    typealias Day = Int
    
    enum Week: String {
        case mon = "MON", tue = "TUE" //...
    }
    
    enum Month: Int {
        case jan = 1, feb, mar //...
    }
    
    static let startYear: Int = 1970
    static let startMonth: CalendarItem.Month = .jan
    
    struct Date {
        var day: Day = 1
        var weekDay: CalendarItem.Week = .mon
        var month: CalendarItem.Month = .jan
        var year: Year = CalendarItem.startYear
    }
}

var userBirthday: CalendarItem.Date userBirthday = CalendarItem.Date.init(day: 10, weekDay: .tue, month: .mar, year: 2017)



마치며


같은 Cocoa 플랫폼 위에서 코드를 작성하는데도 불구하고 역시나 언어의 특성을 살려 새로이 구조를 설계하기는 쉽지 않습니다 하핳


무언가 두서없이 써내려간 느낌입니다만, 잘 이해가 가지 않거나 궁금한 점이 있다면 댓글 남겨주세요 :D





by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


Posted by yagom


오늘의 주제

1. 스위프트에서의 명명법
2. 변수, 상수의 선언

3. 기초 데이터 타입

안녕하세요, 야곰입니다. 

지난 포스팅에서는 스위프트가 어떤 언어인지에 대해 잠시 살펴보았습니다. 


2017/01/23 - [Swift] - Swift란 어떤 언어인가?


이번에는 스위프트의 아주 기초적인 문법에 대해 알아보겠습니다 :)


이름짓기

프로그래밍을 할 때 우리는 변수, 상수, 함수, 타입 등을 제각각 구분할 수 있도록 이름을 지어주어야 합니다. 그런데 각 언어마다 이름을 지어줄 때 지켜야 하는 규칙들이 있습니다. 스위프트에도 마찬가지로 이름을 지을 때 생각해 주어야 할 점들이 있는데요, 간략히 알아보겠습니다.

  • 이름은 유니코드에서 지원하는 어떤 문자(한글, 한자, 영문, 숫자, 이모티콘 등등)라도 사용할 수 있습니다. 다만, 다음과 같은 예외의 경우는 사용할 수 없습니다. 
    • 스위프트에서 미리 사용하고 있는 예약어 또는 키워드
    • 해당 코드 범위 내에서 이미 사용하고 있는 기존의 이름과 동일한 이름 
    • 연산자로사용될수있는기호(+, -,*,/)
    • 숫자로 시작하는 이름
    • 공백이 포함된 이름 
  • 함수, 메서드, 인스턴스 이름은 첫 글자를 소문자로 사용하는 소문자 카멜케이스(Lower Camel Case)를 사용합니다. 
  • 클래스, 구조체, 익스텐션, 프로토콜, 열거형 이름은 타입의 이름이기 때문에 첫 글자를 대문자로 사용하는 대문자 카멜케이스(Upper Camel Case)를 사용합니다.
  • 대소문자를 구별합니다. 예를 들어 Var와 var를 따로 인식합니다.

예약어와 키워드 


예약어는 프로그래밍 언어에서 미리 사용하기로 약속되어 있는 단어로, 식별자로 사용할 수 없는 단어를 뜻합니다. 키워드는 프로그래밍 언어 문법의 일부로, 특별한 의미를 갖는 단어를 뜻합니다. 스위프트의 키워드는 대부분 예약어입니다.



변수와 상수

변수

프로그래밍을 해보신 분들이라면 변수와 상수가 어떤 역할을 하는지 다들 알고 계시겠지요?
프로그램에서 사용되는 데이터를 메모리에 임시적으로 저장하기 위하여 변수나 상수를 이용합니다. 이때 변수와 상수는 특정 데이터 타입에 해당하는 값의 이름입니다. 변수는 생성 후 데이터 값을 변경할 수 있지만, 상수는 한 번 값을 설정하면 추후에는 변경할 수 없습니다. 

스위프트에서 변수를 생성하려면 var 키워드를 사용합니다. var [변수명]: [데이터 타입] = [값] 의 형태로 선언합니다. 변수를 생성할 때 데이터 타입은 생략할 수 있습니다. 큰따옴표(“)로 묶인 데이터는 문자열을 의미합니다.

var name: String = "yagom" var age: Int = 100 var job = "iOS Programmer" // 타입 추론이 사용되었습니다 var height = 181.5 // 타입 추론이 사용되었습니다 age = 99 // 변수는 값을 변경해 줄 수 있습니다. job = "Writer" // 값을 변경할 때에는 기존과 동일한 타입의 값을 할당해 주어야 합니다.



주석(Comment)


코드 중간중간 // 기호 뒤에 녹색으로 붙은 글귀는 주석입니다. 즉, 코드에 해당하는 설명을 덧붙이기 위한 메모라고 생각하면 됩니다. 주석은 프로그램이 실행될 때 코드로서 실행되지는 않습니다. 사람이 코드를 읽기 편하도록 하기위한 보조수단입니다. 


타입 추론


변수나 상수를 생성할 때 데이터 타입을 생략하면 컴파일러가 변수 값의 타입을 추론하여 타입을 지정합니다. 애플은 이런 타입 추론을 스위프트의 강력한 기능이라고 소개했지만, 스위프트에 익숙하지 않은 프로그래머에게는 오히려 독이 될 수 있습니다. 그러다 보니 저는 타입 추론을 많이 사용하지는 않습니다. 자칫 잘못된 타입 추론으로 인해 오류가 생기면 이 오류를 찾는데 상당한 시간이 걸릴 수도 있습니다. 타입을 명확히 지정하지 않아 발생하는 오류를 찾아내는 것보다 처음부터 타입을 명시하는 편이 시간을 더 절약할 수 있습니다. 


[플레이그라운드 실행결과]


스위프트에서 세미콜론 


스위프트에서 명령구문 뒤에 세미콜론(;)을 붙이는 것은 선택사항입니다. 기존 프로그래밍 언어의 습관대로 구 문 뒤에 세미콜론을 붙이셔도 상관 없습니다. 



상수

스위프트에서는 let 키워드를 사용해서 상수를 생성합니다. let [상수명]: [데이터 타입] = [값] 의 형태로 선언합니다. 변수 생성과 마찬가지로 상수 생성 때도 데이터 타입을 생략할 수 있습니다. 

let name: String = "yagom" // 차후 변경하지 않는 값은 상수로 선언합니다.
var age: Int = 100
var job = "iOS Programmer"  // 타입 추론이 사용되었습니다.
let constHeight = 181.5

age = 99        // 변수는 값을 변경할 수 있습니다.
job = "Writer"  // 값을 변경할 때에는 기존과 동일한 타입의 값을 할당해야 합니다.
name = "야곰"     // 상수로 선언된 값은 변경할 수 없습니다. 오류가 발생합니다.


변수를 사용하지 않고 상수를 사용하는 이유는 다양합니다. 하지만 가장 중요한 이유는 가독성입니다. 


상수는 변하지 않는 값입니다. 때문에 상수로 값을 선언하면, 이후 코드에서 값의 변화가 없다는 사실을 주석이나 API 문서 등을 살펴보지 않고서도 직관적으로 알 수 있습니다. 즉, 차후 값의 변경을 신경쓰지 않아도 된다 는 것입니다. 예를 들어 원주율 값은 (아직까지는) 공식적으로 불변하는 값이므로 상수로 선언하는 것이 좋습니다. 


또, 특정 값에 특별한 의미를 부여할 때 사용할 수도 있습니다. 예를 들어 입력받는 수의 최대 크기가 100이 라고 한다면, 100이라는 숫자에 의미를 부여하기 위해 let maxInputValue = 100 등으로 선언해두면 차후에 직관적으로 읽기도, 사용하기도 편리할 것입니다.  


[플레이그라운드 실행결과]


플레이그라운드 실행결과를 보면 왼쪽에 빨간 동그라미를 통해 해당 줄에서 오류가 발생했음을 확인할 수 있습니다. 상수의 값을 차후에 변경하려고 했기 때문에 컴파일러가 프로그래머가 발생시킨 오류를 알려준 것입니다. 오류가 발생한 곳을 삭제하거나 수정하면 정상작동 합니다.

[오류 수정 후 플레이그라운드 실행결과]



콘솔 로그 남기기

프로그램에서 로그란, 애플리케이션의 상태 또는 애플리케이션 내부 로직의 흐름을 관찰할 수 있도록 출력한 정보를 의미합니다. 콘솔 로그(Console Log)는 디버깅 중 디버깅 콘솔에 보여줄 로그를 뜻합니다. 스위프트에서는 print ( ) 함수를 사용하여 콘솔 로그를 출력할 수 있습니다. 
print 함수의 매개변수 타입은 문자열입니다. 그래서 print 함수의 전달인자로 문자열을 전달해 주어야합니다. 기본적으로 print("Hello Swift!")와 같이 사용하면 디버깅 콘솔에서 ‘Hello Swift!’라는 로그를 디버깅 콘솔에서 확인할 수 있습니다. print 함수는 로그를 출력한 뒤에 줄바꿈을 해주기 위해 줄바꿈 문자(\n) 를 자동으로 삽입해줍니다.

콘솔 로그의 print 함수에 대한 이해가 잘 가지 않는다면 다음 포스팅에 이어질 함수의 내용을 참고하세요. 



문자열 보간법(String Interpolation)은 변수 또는 상수 등의 값을 문자열 내에 나타내고 싶을 때 사용합니다. 문자열 내에 \(변수나 상수) 의 형태로 표기하면 이 변수나 상수를 문자열로 치환해서 넣어줍니다. 



기본 데이터 타입

스위프트에서 기본으로 제공하는 데이터 타입(자료형)에 대해 알아보겠습니다. 


Int와 UInt 

정수 타입입니다. Int는 +, - 부호를 포함한 정수를 뜻하며 이 중 - 부호를 포함하지 않고 0 을 포함한 양의 정수는 UInt로 표현합니다. Int와 UInt형의 최댓값과 최솟값은 각각 max 와 min 프로퍼티로 알아볼 수 있습니다. Int와 UInt는 각각 8비트, 16비트, 32비트, 64비 트의 형태를 가지고 있습니다.


var integer: Int = -100 let unsignedInteger: UInt = 50 // UInt 타입에는 음수 값을 할당할 수 없습니다. print("integer 값 : \(integer), unsignedInteger 값 : \(unsignedInteger)") print("Int 최댓값 : \(Int.max), Int 최솟값 : \(Int.min)") print("UInt 최댓값 : \(UInt.max), UInt 최솟값 : \(UInt.min)") let largeInteger: Int64 = Int64.max let smallUnsignedInteger: UInt8 = UInt8.max print("Int64 최댓값 : \(largeInteger), UInt8 최댓값 : \(smallUnsignedInteger)") let tooLarge: Int = Int.max + 1 // Int의 표현 범위를 초과하므로 오류를 냅니다. let cannotBeNegetive: UInt = -5 // UInt는 음수가 될 수 없으므로 오류를 냅니다. integer = unsignedInteger // 오류! 스위프트에서 Int와 UInt는 다른 타입입니다. integer = Int(unsignedInteger) // Int 타입의 값으로 할당해주어야 합니다.


[플레이그라운드 실행결과]




Bool 

Bool은 불리언 타입입니다. 불리언 타입은 참(true) 또는 거짓(false)만 값으로 가집니다. 

let boolean: Bool = true
let iLoveYou: Bool = true
let isTimeUnlimited: Bool = false
print("시간은 무한합니까? : \(isTimeUnlimited)")


[플레이그라운드 실행결과]



Float과 Double 

Float과 Double은 부동소수점을 사용하는 실수형이며 부동소수 타입이라고 합니다. 흔히 우리가 말하는 소수점 자리가 있는 수입니다. 부동소수 타입은 정수형보다 훨씬 넓은 범위의 수를 표현할 수 있습니다. 스위프트에는 64비트의 부동소수 표현을 하는 Double과 32비트의 부동소수 표현을 하는 Float이 있습니다. 
64비트 환경에서 Double은 최소 15자리의 십진수를 표현할 수 있는 반면에 Float은 6자리의 숫자까지만 표현이 가능합니다. 필요에 따라 둘 중 하나를 선택하여 사용할 텐데 무엇을 사용해야 할지 잘 모르는 상황이라면 Double을 사용하길 권합니다.

var floatValue: Float = 1234567890.1 
// Float이 수용할 수 있는 범위를 넘어섭니다. 
// 자신이 감당할 수 있는 만큼만 남기므로 정확도가 떨어집니다.

let doubleValue: Double = 1234567890.1 // Double은 충분히 수용할 수 있습니다. 

floatValue = 123456.1 // Float이 수용할 수 있는 범위의 수로 변경합니다.


Character 

Character는 말 그대로 ‘문자’를 의미합니다. 단어, 문장처럼 문자의 집합이 아닌 단 하나의 문자를 의미합니다. 스위프트는 유니코드 문자를 사용하므로 영어는 물론, 유니코드에서 지원 하는 모든 언어 및 특수기호 등을 사용할 수 있습니다. 문자를 표현하기 위해서는 값의 앞뒤 에 큰따옴표를 사용하여 표현합니다. 

let alphabetA: Character = "A" print(alphabetA) let commandCharacter: Character = “♡" // Character 값에 유니코드 문자를 사용할 수 있습니다. print(commandCharacter) let 한글변수이름: Character = "ᄀ" // 한글도 유니코드 문자에 속해 있으므로 스위프트 코드에 변수 이름으로 사용할 수 있습니다. print("한글의 첫 자음 : \(한글변수이름)")



[플레이그라운드 실행결과]



String 

String은 문자의 나열, 즉 문자열입니다. String은 Character와 마찬가지로 유니코드를 사용할 수 있으며, 값의 앞뒤에 큰따옴표를 사용하여 표현합니다. 


let name: String = "yagom" // 상수로 선언된 문자열은 변경이 불가능합니다. // 이니셜라이저를 사용하여 빈 문자열을 생성할 수 있습니다. // var 키워드를 사용하여 변수를 생성하였으므로 문자열의 수정 및 변경이 가능합니다. var introduce: String = String() introduce.append("제 이름은") // append() 메서드를 사용하여 문자열을 이어붙일 수 있습니다. introduce = introduce + " " + name + "입니다." // + 연산자를 통해서도 문자열을 이어붙일 수 있습니다. print(introduce)




[플레이그라운드 실행결과]



이번에 스위프트의 기초적인 문법과 데이터 타입에 대해 알아봤습니다. 다음 포스팅에서는 컬렉션 타입과 함수에 대해 알아보겠습니다. 

다음 번에 또 뵈어요~ 고맙습니다 :D





by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/

twitter : http://www.twitter.com/yagomSoft ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   









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

스위프트 시작하기  (0) 2017.05.08
Swift - 프로토콜, 익스텐션  (0) 2017.03.07
Swift - 구조체 클래스  (0) 2017.02.28
Swift - 함수, 콜렉션 타입  (0) 2017.02.06
Swift 기초문법 - 변수, 상수, 기초 데이터 타입  (0) 2017.01.25
Swift란 어떤 언어인가?  (0) 2017.01.23
Posted by yagom

C <13>. 변수의 범위

C 2012.04.05 12:30

오늘의 주제

1. 변수의 범위 


열 세번째 시간입니다.^^

지난 번에는 함수에 대해 알아보았어요~
함수... 중요합니다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
내가 안중요하다고 하는거 있었나..ㅋㅋㅋㅋㅋㅋㅋ
그말인 즉슨 알짜배기 열심히 적고있다는 얘기겠지요?ㅋㅋ

자 그럼 서론 생략하고 변수의 범위에 대해 알아봅시다~
스따뚜~~~~~~~~~~~~


# 변수의 범위

그전에 변수란...?
이미 예전에 포스팅 했지요?ㅎㅎ
잘 기억이 안나신다면...ㅋㅋ
보고옵시다~
2011/12/02 - [C] - C <3>. 변수. Variable

자. 변수에도 범위가 있나요??

오홍 그럼요~

어디서든지 쓸 수 있는녀석, 어떤 곳에서만 쓸 수 있는 녀석 등등 변수가 미치는 범위는 다양하답니다~
변수 뿐만 아니라 함수도 마찬가지예요~^^
그럼 자세히 알아봅시다~

일단 변수에는, 어떤 영역 안에서만 사용 가능한 변수, 한 코드파일 안에서 사용 가능한 변수, 다른 파일에서도 사용 가능한 변수... 등등 이렇게 여러가지가 있어요~

몇몇 변수들은 변수 앞에 붙는 키워드에 따라 분류할 수 있습니다.

extern, static 등등 이런 키워드 들이예요~

자, 아래 설명을 봅시다.

전역변수 (Global 변수) : 어떠한 한 코드 파일 내에서 어디서든지 사용 가능한 변수를 말합니다.
지역변수 (Local 변수) : 어떠한 한 구문 또는 함수 내에서만 사용 가능한 변수를 말합니다.
외부변수 (Extern 변수) : 다른 코드 파일에서도 사용 가능한 변수를 말합니다.
정적변수 (Static 변수) : 한 번 선언이 되면 변수가 사용 가능한 영역을 벗어나도 메모리에 기억되어 사라지지 않는 변수를 말합니다. 

자, 이렇게만 말하니까 이해가 잘 안가시죠?

직접 실습해 봅시다~

일단은 지난번에 생성한 VarAndFunc.h 파일로 갑니다.

네모 박스처럼 이쁘게 코딩 해 줍니다~


자, 그럼 이제 FuncExample.h로 가서 VarAndFunc.h에서 선언했던 녀석들을 한 번 불러와 볼게요~
extern 이라는 녀석이 외부 변수를 뜻하는 겁니다.


보시다시피, extern 키워드를 써서 다른 코드파일(VarAndFunc.h)에서 변수와 함수를 가져오는 것을 볼 수 있죠?
이렇게 하면 다른 파일에 선언된 변수를 가져와서 쓸 수 있습니다. 
main함수에서도 새로 몇 줄 추가를 합니다. 


이렇게 추가를 해주고, 우리가 만들어 주었던 myFirstFunction 함수로 와서 static(정적)변수를 선언해 줍니다.
이녀석은 함수가 끝나고 메모리에서 지워지지 않습니다.
무슨말이냐 하면... 우리가 흔히 사용하던 int 변수는 함수가 끝나면 초기화가 되고 함수를 다시 시작하여 선언하면 다시 생성됩니다.
이것을 지역변수라고 합니다.
하지만 static 변수를 선언하게 되면 다시 함수를 호출하여도 초기화가 되지 않고 지난 값들을 기억하고 있다가 다시 그 값을 불러들이게 됩니다.
잘 이해가 안가신다면 밑에 실행 결과를 봅시다~

[##_http://blog.yagom.net/script/powerEditor/pages/1C%7Ccfile29.uf@1413BC424F707BEE1A67DE.png%7Cwidth=%22601%22%20height=%22118%22%20alt=%22%22%20filename=%224.png%22%20filemime=%22image/jpeg%22%7C_##]


짜잔~
static 변수는 함수를 몇 번 호출하더라도, 한 번 선언을 했으면 지워지지 않고 초기화 하는 1은 신경을 쓰지 않습니다.
하지만 지역변수인 녀석은 계속 1로 초기화 되기 때문에 1만 출력이 되죠.
또한 global 변수는 하나의 함수 안에 종속되지 않고 나하의 코드 파일 안에서 어디서든지 사용 할 수 있습니다.
그리고 extern 변수는 다른 파일에서 가져와서 쓸 수 있는거죠.


잘 이해가 되셨는지 모르겠습니다만...

저도 지금 감기는 눈으로 휘갈기는거라...ㅋㅋㅋ

혹시 이해가 가지 않는 부분이나 틀린 부분이 있으면 날카롭게 지적 부탁드립니다...^^

그럼 야곰은 이만 물러갑니다..^^



by yagom

twitter : @yagomsoft

 
p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓ 



'C' 카테고리의 다른 글

C <15>. 전처리자  (0) 2012.05.14
C <14>. 배열  (4) 2012.05.11
C <13>. 변수의 범위  (0) 2012.04.05
C <12>. 함수  (4) 2012.04.02
C <11>. 포인터 (2)간단실습  (0) 2012.03.27
C <10>. 포인터 (1)개념잡기  (3) 2012.03.23
Posted by yagom


오늘의 주제


1. 변수 알아보기


세 번째 시간입니다.

안녕하세요! 야곰입니다.ㅎㅎ
벌써 세 번째 시간이네요 ㅎㅎㅎ
Objective-C는 C를 기반으로 하며 이런저런것들이 추가되고 빠지고 한 것이기 때문에 C에서 기초되어 쓰이는 것들이 많습니다. 그래서 오늘은 C에서 나오는 변수들에 대해 조금 알아보겠습니다.
C가 그냥 커피라면 Objective-C는 T.O.P라 이거죠 ㅋㅋㅋㅋㅋㅋㅋ
 

긴말 필요없고 본론으로 들어가죠 ㅋㅋㅋ


# 변수가 뭐냐?

변수라는 것은 자료를 담아 둘 수 있는 기억공간이라고 생각하시면 됩니다.
컴퓨터는 무슨 일을 처리하기 전에 주기억장치, 즉, RAM에 정보를 올려놓고 맞춰진 스케줄 대로 CPU에서 연산처리 하게 됩니다.(물론 상세히는 좀 더 복잡하고 다를 수 있지만 대충 그렇다고 생각해 두세요 ㅎ)
CPU는 기억력이 없고 계산만 하다보니 처리해야 할 정보들을 기억해줄 녀석이 필요한데, RAM이 그 역할을 하는것입니다.
그리고 프로그래머가 RAM에 정보를 기억할 공간을 할당해 준 것이 변수입니다.
이제 우리는 변수를 하나의 박스라고 생각해 봅시다.

일단 주제와는 약간 벗어나지만 박스는 일단 우리가 사용하던 사용하지 않던간에 항상 공간을 차지하기 마련입니다.
그렇기 때문에 우리는 박스를 필요 이상으로 많이 만들거나 필요 이하로 너무 적게 만들지 말아야 합니다... 뭐 일단 잊어두세요 ㅎㅎㅎ 아직은 그리 중요한 내용이 아니지만, 메모리를 많이 낭비하지 않으려면 변수는 최대한 많이 쓰지 않는게 좋겠죠?ㅎ

서론이 길었습니다..

그런데 문제는 박스의 종류가 몇 가지 있다는 것입니다.
사과박스에는 사과를 담아야 하고(돈은 담지 말아야죠... 그쵸?ㅋㅋㅋ), 귤박스에는 귤을 넣어야 합니다.
겉모양과 내용물이 다르면 컴퓨터랑 사람이 모두 헷갈리잖아요^^

즉, 실수형 변수에는 실수가, 정수형 변수에는 정수가 들어가야 하는 것입니다.
C에서 많이 쓰이는 몇 가지 자료형에 대해 알아봅시다.

# 자료형의 종류

 변수형 크기(32bit 프로세서) 자료형 출력 형식 지정자 
 int 4byte  정수  %d
 float 4byte  실수  %f 
 double  8byte  실수  %lf 
 char 1byte  문자  %c

위의 표에 적혀있는 자료형의 크기는 상자의 크기로 생각하시면 될 것 같습니다. 즉, 메모리에 하나의 자료가 저장될 때 할당되는 메모리 크기입니다.
float과 double은 같은 실수형 표현인데 왜 크기가 다른지 궁금하실 텐데요, 간단합니다.
더 많은 메모리를 할당하면 더 큰 수를 표현할 수 있기 때문입니다.
지금 표에는 각 변수들이 표현할 수 있는 숫자의 한계를 적어놓지 않았는데, C관련 책자 보시면 나옵니다. 굳이 여기서는 깊고 심오하게 들어가지 않겠습니다 ㅋㅋ
메모리가 차지하는 크기가 클 수록 표현할 수 있는 숫자의 크기가 증가한다는 것을 기억하시면 되구요. 또한 변수의 크기가 클수록 연산하는데 시간이 더 오래걸립니다(보통 평균적으로..^^). 하지만, 우리는 지금 일단은 그런건 제껴둡시다! 나중에 다 알아서 깨닫게 되실테니..ㅎㅎ
참고로 정수는 우리가 말하는... 숫자, 즉 -3, -2, -1, 0, 1, 2, 3 등등등 요런 숫자들을 말하구요, 실수는 우리가 흔히 말하는 소수... 0.1, -94.0342, 5.34, 3.14 등등 이런 숫자들을 말합니다~
출력형식 지정자는 대표적인 것들만 적어 두었습니다. NSLog에 찍을 때 쓰는거 말예요 ㅎㅎ
물론 NSLog에만 쓰이지는 않습니다^^
더 자세히 알아보고 싶으신 분들은 http://blog.naver.com/corea139/50038232196 를 참고하시길 바랍니다!!

자, 이제 그럼 무작정 한 번 실습해 봅시다~!

일단 새로운 프로젝트를 생성해 줍시다~

 
그리고 아래와 같이 코드를 작성해 봅니다^^
코드 작성 위치는... 지난 번 포스팅을 참고하세요^^
main함수 안에 autorelease풀 안쪽에 작성하시면 됩니다~
함수가 뭐냐구요?ㅋㅋ
그냥 지난 번 포스팅 보고 눈치껏!!
제가 캡쳐를 잘못해가지고 못보여 드리는거 절대 아닙니다요(ㅠㅠ)ㅋㅋㅋㅋㅋㅋㅋㅋ
 


실행 결과 화면입니다.


설명을 하자면,
처음에 변수들을 주욱 선언해줍니다.
int는 자료형 val_integer는 그 변수(상자)의 이름입니다.
즉 정수를 담을 수 있는 상자 하나를 만든 거예요.
밑에도 똑같이 float을 담을 수 있는 상자를 만들거예요~ 이름은 val_float...
float은 더블과 차이를 두기 위해 실수 뒤에 f를 붙여줍니다. float에 담을 숫자라고 표현해 주는거죠~
자, 이해되셨나요? 그리고 등호를 붙이고 옆에 숫자를 쓴다는 것은 그 상자에 그것을 담아두고 싶다고 말하는 것입니다.

그렇게 해서 NSLog로 화면에 찍어보니 상자에 담긴 내용이 보입니다~
그런데 좀 이상한게 보이죠?
분명히 char (문자형, Character)는 %c로 표현한다고 했는데, %d로 찍어도 뭔가 나오네요~
char형에는 ASCII, 즉 아스키 코드에 해당하는 숫자가 들어가 있습니다...^^
그래서 C의 아스키 코드값에 해당하는 67이 출력되는겁니다.
그래서 지금 선언되어 있는 val_char를
val_char = var_char +1;
이라고 더해줘도 에러가 나지 않습니다.
또한 val_char = 99; 라고 대입해줘도 됩니다. 물론 %c로 출력해보면 ASCII코드 99에 해당하는 문자가 출력될 거예요~
반대로 정수형의 숫자를 문자로 찍어볼 수도 있습니다.
후우~

여기까지 이해가 되셨는지 모르겠습니다~
이해가 되지 않으시면 폭풍 댓글 질문 주세요~@_@

그리고 아래에 xxx_array[x] 라는 식으로 선언해준 변수도 보이시나요?
이것은 배열이라고 합니다.
배열은 나중에 좀 더 심도있게 포스팅 할텐데요~
여기서는 이런게 있다~ 라고 아시면 됩니다.

배열은 똑같은 자료형을 사용하는 상자들을 쭈욱~~~~~~ 붙여놓은 것이라고 생각하시면 됩니다. 무조건 동일형 자료들만 배열로 만들 수 있습니다~!
선언 방법은 자료형을 표기한 후 배열이름[칸수] 로 선언해 주시면 됩니다.
말로 설명하니 너무 어려우시죠?

간단히 int int_array[3] 이라고 선언하게 되면

 int_array[0] int_array[1]  int_array[2] 

이런식으로 변수들이 생기게 되는 겁니다.
배열의 숫자는 0부터 시작해요~ 헷갈리지 마세요~

배열을 사용하는 방법은 코드를 참고해 보세요 ㅎㅎ

물론 여기서 배열을 이해하지 못한다고 좌절할 필요 없습니다!
나중에 다시 배우면 돼요 ㅎ 배열 이해 안가시는 분들은 일단 배열은 패스하세요!

char형의 배열 맨 마지막을 보시면 \0 이라는 문자를 집어 넣어 놓은 것을 보실 수 있습니다.
char형의 배열은 문자 하나하나 따로 빼서 볼 수도 있지만, 길게 보면 하나의 문장으로 볼 수도 있기 때문에 여기서 이문장은 끝! 이라는 표시로 \0을 넣어주게 됩니다. \0은 null이라고 표현합니다. null이라는 것은 뭐... 없다.. 비었다.. 이런 뜻입니다. 일단 패스^^

그래서 char형 배열은 문장(string)으로 출력해 보고 싶으면 %s로 출력해 볼 수 있습니다.
이제 위에 코드들이 조금 이해가 가실까요?
잘 이해가 가지 않으시면 C 책 가지고 계신거 하나쯤 참고하며 보세요~^^
책만큼 많은 모든 내용을 담을수가 없네요 ㅎ 여기서는 꼭 필요한 내용만 콕 찝어서 말씀드리려고 해요~
물론... 잔소리와 잡소리와 부연설명 투성이지만...ㅋㅋㅋ

자, 그럼 변수안의 내용물을 조금 바꿔치기 해 보도록 할게요~!
변수에다가 다른 숫자들을 대입해 봅시다.
위에 작성하였던 코드 아래쪽에 추가적으로 작성해 주세요~!


변경 된 후에 찍히는 로그 입니다.


변수안에 다른 수를 대입해 주면 원래 있던 내용물은 없어지고 새로운 내용물이 채워지게 됩니다.
즉, 새로운 정보를 입력하면 지난 정보는 사라지고 새로운 정보가 입력되는 거죠^^

어떠신가요... 좀 이해가 되시나요?

후악후악 힘드네요 ㅋㅋㅋ

추가적으로 unsigned라는 녀석을 보게 되실텐데요.
이녀석은 부호를 사용하지 않겠다는 거예요. 즉, 정수에도 음의정수 양의정수가 있는데, 양의 정수만 사용하겠다는 의미입니다.
왜냐면 같은 메모리 4byte를 사용할 때, 양의 정수만 사용하면 더 큰 수까지 표현이 가능하기 때문에 사용하게 됩니다.
어쨋든 unsigned는 음이아닌 양의 수만 사용할 때 사용하시면 됩니다!
효율적인 사용을 위해서^^

으아~~~~~~
오늘은 이만해야 겠습니다.
머리가 아프시죠??ㅎ
근데 뭐 이것만 하면 C 1/3은 했다고 보시면 됩니다 ㅋㅋ
그만큼 뭐 별거 없어요~~~~~~~~~~
몇 번이고 보면서 생각해 보시기 바랍니다.

궁금하신 점은 폭풍 댓글 질문 해주세요^^

자, 그럼 다음번에 뵙도록 하겠습니다 ㅎ


by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기  


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓ 

Posted by yagom

C <3>. 변수. Variable

C 2011.12.02 13:00


오늘의 주제


1. 변수 알아보기


세 번째 시간입니다.

안녕하세요! 야곰입니다.ㅎㅎ
벌써 세 번째 시간이네요 ㅎㅎㅎ
이번에는 C언어에서 가장 기초가 될 변수에 대해 알아보도록 하겠습니다~!
 

긴말 필요없고 본론으로 들어가죠 ㅋㅋㅋ


# 변수가 뭐냐?

변수라는 것은 자료를 담아 둘 수 있는 기억공간이라고 생각하시면 됩니다.
컴퓨터는 무슨 일을 처리하기 전에 주기억장치, 즉, RAM에 정보를 올려놓고 맞춰진 스케줄 대로 CPU에서 연산처리 하게 됩니다.(물론 상세히는 좀 더 복잡하고 다를 수 있지만 대충 그렇다고 생각해 두세요 ㅎ)
CPU는 기억력이 없고 계산만 하다보니 처리해야 할 정보들을 기억해줄 녀석이 필요한데, RAM이 그 역할을 하는것입니다.
그리고 프로그래머가 RAM에 정보를 기억할 공간을 할당해 준 것이 변수입니다.
이제 우리는 변수를 하나의 박스라고 생각해 봅시다.

일단 주제와는 약간 벗어나지만 박스는 일단 우리가 사용하던 사용하지 않던간에 항상 공간을 차지하기 마련입니다.
그렇기 때문에 우리는 박스를 필요 이상으로 많이 만들거나 필요 이하로 너무 적게 만들지 말아야 합니다... 뭐 일단 잊어두세요 ㅎㅎㅎ 아직은 그리 중요한 내용이 아니지만, 메모리를 많이 낭비하지 않으려면 변수는 최대한 많이 쓰지 않는게 좋겠죠?ㅎ

서론이 길었습니다..

그런데 문제는 박스의 종류가 몇 가지 있다는 것입니다.
사과박스에는 사과를 담아야 하고(돈은 담지 말아야죠... 그쵸?ㅋㅋㅋ), 귤박스에는 귤을 넣어야 합니다.
겉모양과 내용물이 다르면 컴퓨터랑 사람이 모두 헷갈리잖아요^^

즉, 실수형 변수에는 실수가, 정수형 변수에는 정수가 들어가야 하는 것입니다.
C에서 많이 쓰이는 몇 가지 변수형에 대해 알아봅시다.

# 자료형의 종류

 변수형 크기(32bit 프로세서) 자료형 출력 형식 지정자 
 int 4byte  정수  %d
 float 4byte  실수  %f 
 double  8byte  실수  %lf 
 char 1byte  문자  %c

위의 표에 적혀있는 자료형의 크기는 상자의 크기로 생각하시면 될 것 같습니다. 즉, 메모리에 하나의 자료가 저장될 때 할당되는 메모리 크기입니다.
float과 double은 같은 실수형 표현인데 왜 크기가 다른지 궁금하실 텐데요, 간단합니다.
더 많은 메모리를 할당하면 더 큰 수를 표현할 수 있기 때문입니다.
지금 표에는 각 변수들이 표현할 수 있는 숫자의 한계를 적어놓지 않았는데, C관련 책자 보시면 나옵니다. 굳이 여기서는 깊고 심오하게 들어가지 않겠습니다 ㅋㅋ
메모리가 차지하는 크기가 클 수록 표현할 수 있는 숫자의 크기가 증가한다는 것을 기억하시면 되구요. 또한 변수의 크기가 클수록 연산하는데 시간이 더 오래걸립니다(보통 평균적으로..^^). 하지만, 우리는 지금 일단은 그런건 제껴둡시다! 나중에 다 알아서 깨닫게 되실테니..ㅎㅎ
참고로 정수는 우리가 말하는... 숫자, 즉 -3, -2, -1, 0, 1, 2, 3 등등등 요런 숫자들을 말하구요, 실수는 우리가 흔히 말하는 소수... 0.1, -94.0342, 5.34, 3.14 등등 이런 숫자들을 말합니다~
출력형식 지정자는 대표적인 것들만 적어 두었습니다. printf에 찍을 때 쓰는거 말예요 ㅎㅎ
물론 printf에만 쓰이지는 않습니다^^
더 자세히 알아보고 싶으신 분들은 http://blog.naver.com/corea139/50038232196 를 참고하시길 바랍니다!!

자, 이제 그럼 무작정 한 번 실습해 봅시다~!

일단 새로운 프로젝트를 생성해 줍시다~



그리고 아래와 같이 코드를 작성해 봅니다^^
코드 작성 위치는... 지난 번 포스팅을 참고하세요^^
main함수 안에 작성하시면 됩니다~
함수가 뭐냐구요?ㅋㅋ
그냥 지난 번 포스팅 보고 눈치껏!!
제가 캡쳐를 잘못해가지고 못보여 드리는거 절대 아닙니다요(ㅠㅠ)ㅋㅋㅋㅋㅋㅋㅋㅋ


실행 결과 화면입니다.


설명을 하자면,
처음에 변수들을 주욱 선언해줍니다.
int는 자료형 val_integer는 그 변수(상자)의 이름입니다.
즉 정수를 담을 수 있는 상자 하나를 만든 거예요.
밑에도 똑같이 float을 담을 수 있는 상자를 만들거예요~ 이름은 val_float...
float은 더블과 차이를 두기 위해 실수 뒤에 f를 붙여줍니다. float에 담을 숫자라고 표현해 주는거죠~
자, 이해되셨나요? 그리고 등호를 붙이고 옆에 숫자를 쓴다는 것은 그 상자에 그것을 담아두고 싶다고 말하는 것입니다.

그렇게 해서 printf로 화면에 찍어보니 상자에 담긴 내용이 보입니다~
그런데 좀 이상한게 보이죠?
분명히 char (문자형, Character)는 %c로 표현한다고 했는데, %d로 찍어도 뭔가 나오네요~
char형에는 ASCII, 즉 아스키 코드에 해당하는 숫자가 들어가 있습니다...^^
그래서 C의 아스키 코드값에 해당하는 67이 출력되는겁니다.
그래서 지금 선언되어 있는 val_char를
val_char = var_char +1;
이라고 더해줘도 에러가 나지 않습니다.
또한 val_char = 99; 라고 대입해줘도 됩니다. 물론 %c로 출력해보면 ASCII코드 99에 해당하는 문자가 출력될 거예요~
반대로 정수형의 숫자를 문자로 찍어볼 수도 있습니다.
후우~

여기까지 이해가 되셨는지 모르겠습니다~
이해가 되지 않으시면 폭풍 댓글 질문 주세요~@_@

그리고 아래에 xxx_array[x] 라는 식으로 선언해준 변수도 보이시나요?
이것은 배열이라고 합니다.
배열은 나중에 좀 더 심도있게 포스팅 할텐데요~
여기서는 이런게 있다~ 라고 아시면 됩니다.

배열은 똑같은 자료형을 사용하는 상자들을 쭈욱~~~~~~ 붙여놓은 것이라고 생각하시면 됩니다. 무조건 동일형 자료들만 배열로 만들 수 있습니다~!
선언 방법은 자료형을 표기한 후 배열이름[칸수] 로 선언해 주시면 됩니다.
말로 설명하니 너무 어려우시죠?

간단히 int int_array[3] 이라고 선언하게 되면

 int_array[0] int_array[1]  int_array[2] 

이런식으로 변수들이 생기게 되는 겁니다.
배열의 숫자는 0부터 시작해요~ 헷갈리지 마세요~

배열을 사용하는 방법은 코드를 참고해 보세요 ㅎㅎ

물론 여기서 배열을 이해하지 못한다고 좌절할 필요 없습니다!
나중에 다시 배우면 돼요 ㅎ 배열 이해 안가시는 분들은 일단 배열은 패스하세요!

char형의 배열 맨 마지막을 보시면 \0 이라는 문자를 집어 넣어 놓은 것을 보실 수 있습니다.
char형의 배열은 문자 하나하나 따로 빼서 볼 수도 있지만, 길게 보면 하나의 문장으로 볼 수도 있기 때문에 여기서 이문장은 끝! 이라는 표시로 \0을 넣어주게 됩니다. \0은 null이라고 표현합니다. null이라는 것은 뭐... 없다.. 비었다.. 이런 뜻입니다. 일단 패스^^

그래서 char형 배열은 문장(string)으로 출력해 보고 싶으면 %s로 출력해 볼 수 있습니다.
이제 위에 코드들이 조금 이해가 가실까요?
잘 이해가 가지 않으시면 C 책 가지고 계신거 하나쯤 참고하며 보세요~^^
책만큼 많은 모든 내용을 담을수가 없네요 ㅎ 여기서는 꼭 필요한 내용만 콕 찝어서 말씀드리려고 해요~
물론... 잔소리와 잡소리와 부연설명 투성이지만...ㅋㅋㅋ

자, 그럼 변수안의 내용물을 조금 바꿔치기 해 보도록 할게요~!
변수에다가 다른 숫자들을 대입해 봅시다.
위에 작성하였던 코드 아래쪽에 추가적으로 작성해 주세요~!


변경 된 후에 찍히는 로그 입니다.


변수안에 다른 수를 대입해 주면 원래 있던 내용물은 없어지고 새로운 내용물이 채워지게 됩니다.
즉, 새로운 정보를 입력하면 지난 정보는 사라지고 새로운 정보가 입력되는 거죠^^

어떠신가요... 좀 이해가 되시나요?

후악후악 힘드네요 ㅋㅋㅋ

추가적으로 unsigned라는 녀석을 보게 되실텐데요.
이녀석은 부호를 사용하지 않겠다는 거예요. 즉, 정수에도 음의정수 양의정수가 있는데, 양의 정수만 사용하겠다는 의미입니다.
왜냐면 같은 메모리 4byte를 사용할 때, 양의 정수만 사용하면 더 큰 수까지 표현이 가능하기 때문에 사용하게 됩니다.
어쨋든 unsigned는 음이아닌 양의 수만 사용할 때 사용하시면 됩니다!
효율적인 사용을 위해서^^

으아~~~~~~
오늘은 이만해야 겠습니다.
머리가 아프시죠??ㅎ
근데 뭐 이것만 하면 C 1/3은 했다고 보시면 됩니다 ㅋㅋ
그만큼 뭐 별거 없어요~~~~~~~~~~
몇 번이고 보면서 생각해 보시기 바랍니다.

궁금하신 점은 폭풍 댓글 질문 해주세요^^

자, 그럼 다음번에 뵙도록 하겠습니다 ㅎ


by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기  


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓

'C' 카테고리의 다른 글

C <6>. 조건문(1), if, else  (6) 2011.12.11
C <5>. 반복문(1), 단항 연산자  (2) 2011.12.08
C <4>. 실수 표현 방법  (2) 2011.12.04
C <3>. 변수. Variable  (4) 2011.12.02
C <2>. 주석(Comment)  (6) 2011.11.29
C <1>. Hello, World!  (9) 2011.11.25
Posted by yagom


티스토리 툴바