오늘의 주제

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. iOS 어플리케이션의 생명주기
2. ViewController의 생명주기 



마흔 세번째 시간입니다.^^

요 며칠 제 개인적으로 좀 힘든일도 있고, 빡빡한 프로젝트 일정 때문에 제대로 포스팅을 하지 못했습니다.

흙흙 아직 프로젝트가 마무리 되지는 않았지만 최대한 짬을 내 보도록 하겠습니다..ㅎ

우리 이제까지 정말 쭉쭉 달려왔습니다.

이것저것 해 보면서 많은 것을 맛 봐왔죠...ㅎ
물론 이것 저것 많이 해 보는 것도, 맛을 보고 언제 어디서 어떻게 써야할지 감을 익히는 것도 중요합니다.

그러나 더더욱 중요한 것은 통괄적인 흐름이고 기초죠.

초반에 포스팅 할 때 말씀드렸듯이 아주 기초적인 사항들은 많이 스킵하고 넘어왔습니다.

이번에는 그래서 정말 기초 하나를 같이 알아보고자 합니다.

물론 초보자 님께서 포스팅을 해 달라고 부탁하신 내용이기도 합니다 :-) 고맙습니다 ㅎ

자, 그럼 이제 같이 해 볼까요?

스따뚜~~~~~~~~~~~~


# 실습해보기

ㅎㅎ 초심으로 돌아가서 프로젝트 생성부터 따라 가 봅시다.
빈 프로젝트를 생성합니다.


이름은 ViewLifeCycle.
코어 데이터도 사용하지 않을 것이고, ARC도 사용하지 않을 것이며, Unit Test도 포함하지 않을 것입니다.
ARC를 사용하지 않는 이유는, 우리가 원할 때 메모리 관리를 함으로써 더 명확히 흐름을 보여드리기 위함입니다.


자, 프로젝트를 생성했으면 ViewLifeCycle 폴더에서 오른쪽 버튼을 클릭.
New File...


Objective-C class를 선택하고 Next


TestViewController로 이름짓고 XIB생성에 체크합니다~


TestViewController가 생성되었으면 RootViewController도 만들어 주세요 :-)


자, 그리고 RootViewController.xib로 와서 Assistance 모드로 변경하면 이렇게 나오겠죠?
무슨 말인지 모르시는 분들은 
2012/04/03 - [iOS Dev/깨알 Tips] - Xcode4 xib의 객체 소스파일과 쉽게 연결하기

를 참고해 주시면 됩니다 ㅎ
자, 여튼 xib파일을 클릭하고, RootViewController.h를 option+클릭하면 이런 화면이 나오겠죠.
xib파일에 버튼 세 개 가지런히 올려주시고, 저렇게 연결 해 줍니다.


나머지 두 버튼들도 이쁘게 연결 해 주시구요~^^


연결 해 주었으니 무엇을 할지 작성해 주어야겠죠?ㅎ
RootViewController.m 파일로 이동합니다.
이렇게 이쁘게 작성을 해 주세요.ㅎ 
#import 부터 저 쪼 아래까지 쭈욱 다 보셔야 해요 ㅎ


자, 그리고 AppDelegate로 옵니다.
이렇게 이쁘게 네비게이션 컨트롤러를 하나 만들어 주시구요 ㅎ


구현파일로 들어와서 이렇게 또 이쁘게 코딩을 합니다 ㅎ


자, 이제 TestViewController도 RootViewController에서 했던 것과 마찬가지로 쭉쭉 연결해 줍니다 ㅎ


그리고 구현파일로 와서 이렇게 작성을 해 주세요 ㅎ
__PRETTY_FUNCTION__은 나중에 어떤녀석인지 알 수 있으실 거예요 ㅎ
앞에 언더바(_) 두개, 가운데 한 개, 뒤에 두 개 이렇습니다. ㅎ


자, 그리고 RootViewController 구현파일에도 와서 필요한 부분에 그녀석을 찍어 줍니다.


AppDelegate에도 마찬가지구요 ^^*


자! 그리고 실행해 봅시다~!
처음 로그는 어플리케이션을 실행시킨 후 네비게이션 push버튼을 누르고 다시 pop버튼을 누른 후에 나타난 로그입니다.


두 번째 로그는 어플리케이션을 실행시킨 후 모달뷰를 띄웠다가 다시 닫은 후에 나타난 로그입니다.


세 번째 로그는 어플리케이션을 실행시킨 후 addSubview와 removeSubview를 한 후의 로그입니다.


네 번째 로그는 어플리케이션 실행 후 홈버튼을 눌러서 백그라운드로 보낸 후 다시 어플리케이션을 띄운 후 다시 홈버튼을 누른 후에 생긴 로그입니다.


어떤가요? 여러분의 로그와 일치하나요?ㅎ

로그에 찍힌 것은,  -[해당 클래스명 메소드명] 이런식으로 남게 됩니다.

한 번 차근차근 로그를 따라서 추적해 보세요 ~^^*


# iOS Application Life Cycle

자, 그럼 실습을 해 보았으니 본격적으로 알아봅시다.

어플리케이션의 생명주기를 설명하는 그림으로 유명한 녀석입니다.ㅎ


1. 사용자가 어플리케이션을 탭합니다.
2. main() 함수가 호출됩니다.
3. UIApplicationMain()이 호출됩니다.
4. applicationDidFinishLaunching이 호풀됩니다. (AppDelegate)
5. 여러분이 설계하고 작성한 어플리케이션의 코드가 동작합니다.
6. 어플리케이션 종료를 명령하면 applicationWillTerminate가 호출됩니다. (AppDelegate)
7. 어플리케이션이 종료됩니다.

자, 어떤가요? 감이오시나요?ㅎㅎㅎ

main은 뭐고 UIApplicationMain 은 또 뭐고...???

ㅎㅎ

모든 C언어 기반의 프로그램은 main함수에서 출발을 하게됩니다.

Objective-C로 엄연히 아랫단은 C언어 기반이므로 main함수로부터 출발을 하게되는 것입니다.

사실상 형식적이라고 볼 수 있습니다.

우리가 신경써야 할 부분은 AppDelegate의 applicationDidFinishLaunching 부터라고 생각하시면 됩니다.

로그에 applicationDidFinishLaunching이 가장 먼저 찍힌 것을 확인하셨나요?ㅎ 맞지요?ㅎ

그리고 로그에서는 확인 할 수 있을지 모르겠지만 applicationWillTerminate에서 우리가 할 수 있는 모든 것은 끝이나게 됩니다.

한 마디로 어플리케이션의 생명주기는 우리가 AppDelegate에서 확인하고 관리할 수 있습니다.

그렇다면 ViewController들의 생명주기는...???


# iOS View Life Cycle
 
자, 어플리케이션 전체의 생명주기를 알아보았으니, 작게는 ViewController들의 생명주기에 대해 알아봅니다.

로그에 보면 ViewController의 로그 중에 가장 먼저 찍히는 녀석은 init(initWith....... 포함)입니다.

초기화 해 주는 녀석이 당연히 가장 먼저 호출이 되겠죠.

그 후에 바로 불리게 되는 녀석이 viewDidLoad입니다.

자동으로 생성되는 주석에 보면 이녀석에서 처음 부가적인 세팅을 하라고 써있죠.

눈치채신 분들도 계시겠지만 제가 아까 위에서 ViewController에 작성한 View Life Cycle의 메소드들은 순서대로 호출됩니다.

너무나 당연하게 

viewDidLoad
viewWillAppear:
viewDidAppear:
viewWillDisappear:
viewDidDisappear:
viewDidUnload

의 순서로 호출이 되게 됩니다.
그래서 viewDidUnload에서는 객체들을 놓아주는 곳으로 사용하라고 주석으로 설명이 되어있죠.

각각 호출되는 타이밍은 말씀드리지 않아도 아실 수 있을거라고 생각합니다...^^

영어 그대로 해석해 보세요..ㅎ

alloc, init, dealloc은 모든 객체에 공통적으로 해당되는 내용이므로 위에 나열하지는 않았습니다.

alloc - 메모리에 적재되는 시점
init - 객체가 초기화 되는 시점
dealloc - 객체가 메모리에서 해제되는 시점

dealloc은 실질적으로 해당 객체가 메모리에서 해제되는 시점(retainCount가 0이 되는 시점)에 호출되게 됩니다. 말그대로 alloc과 딱 반대개념이죠~


자, 이렇게 간략하게나마 어플리케이션과 뷰컨트롤러, 그리고 일반적인 객체의 생명주기에 대해 알아보았습니다.

제 설명이 어떻게 다가갔을지, 또 어떻게 느껴지셨을지 잘 모르겠지만, 궁금하거나 해결되지 않는 내용이 있었다면 꼭 말씀 부탁드립니다 :-)

사실 이 부분이 제가 초반에 제대로 개념을 잡아놓지 않아서 항상 혼돈을 겪었던 부분중에 하나기 때문에 필시 여러분께 도움이 될 것이라고 생각합니다.

그럼 이만...~!

p.s 오늘은 6월 25일 6.25전쟁 62주년입니다.
우리나라의 평화와 안위를 위하여 목숨바친 순국선열께 감사하는 마음을 가지는 우리가 되었으면 좋겠습니다.


by yagom

facebook : http://fb.yagom.net

twitter : http://twitter.yagom.net ( @yagomsoft )

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. iOS 어플리케이션의 생명주기
2. ViewController의 생명주기 



마흔 세번째 시간입니다.^^

요 며칠 제 개인적으로 좀 힘든일도 있고, 빡빡한 프로젝트 일정 때문에 제대로 포스팅을 하지 못했습니다.

흙흙 아직 프로젝트가 마무리 되지는 않았지만 최대한 짬을 내 보도록 하겠습니다..ㅎ

우리 이제까지 정말 쭉쭉 달려왔습니다.

이것저것 해 보면서 많은 것을 맛 봐왔죠...ㅎ
물론 이것 저것 많이 해 보는 것도, 맛을 보고 언제 어디서 어떻게 써야할지 감을 익히는 것도 중요합니다.

그러나 더더욱 중요한 것은 통괄적인 흐름이고 기초죠.

초반에 포스팅 할 때 말씀드렸듯이 아주 기초적인 사항들은 많이 스킵하고 넘어왔습니다.

이번에는 그래서 정말 기초 하나를 같이 알아보고자 합니다.

물론 초보자 님께서 포스팅을 해 달라고 부탁하신 내용이기도 합니다 :-) 고맙습니다 ㅎ

자, 그럼 이제 같이 해 볼까요?

스따뚜~~~~~~~~~~~~


# 실습해보기

ㅎㅎ 초심으로 돌아가서 프로젝트 생성부터 따라 가 봅시다.
빈 프로젝트를 생성합니다.


이름은 ViewLifeCycle.
코어 데이터도 사용하지 않을 것이고, ARC도 사용하지 않을 것이며, Unit Test도 포함하지 않을 것입니다.
ARC를 사용하지 않는 이유는, 우리가 원할 때 메모리 관리를 함으로써 더 명확히 흐름을 보여드리기 위함입니다.


자, 프로젝트를 생성했으면 ViewLifeCycle 폴더에서 오른쪽 버튼을 클릭.
New File...


Objective-C class를 선택하고 Next


TestViewController로 이름짓고 XIB생성에 체크합니다~


TestViewController가 생성되었으면 RootViewController도 만들어 주세요 :-)


자, 그리고 RootViewController.xib로 와서 Assistance 모드로 변경하면 이렇게 나오겠죠?
무슨 말인지 모르시는 분들은 
2012/04/03 - [iOS Dev/깨알 Tips] - Xcode4 xib의 객체 소스파일과 쉽게 연결하기

를 참고해 주시면 됩니다 ㅎ
자, 여튼 xib파일을 클릭하고, RootViewController.h를 option+클릭하면 이런 화면이 나오겠죠.
xib파일에 버튼 세 개 가지런히 올려주시고, 저렇게 연결 해 줍니다.


나머지 두 버튼들도 이쁘게 연결 해 주시구요~^^


연결 해 주었으니 무엇을 할지 작성해 주어야겠죠?ㅎ
RootViewController.m 파일로 이동합니다.
이렇게 이쁘게 작성을 해 주세요.ㅎ 
#import 부터 저 쪼 아래까지 쭈욱 다 보셔야 해요 ㅎ


자, 그리고 AppDelegate로 옵니다.
이렇게 이쁘게 네비게이션 컨트롤러를 하나 만들어 주시구요 ㅎ


구현파일로 들어와서 이렇게 또 이쁘게 코딩을 합니다 ㅎ


자, 이제 TestViewController도 RootViewController에서 했던 것과 마찬가지로 쭉쭉 연결해 줍니다 ㅎ


그리고 구현파일로 와서 이렇게 작성을 해 주세요 ㅎ
__PRETTY_FUNCTION__은 나중에 어떤녀석인지 알 수 있으실 거예요 ㅎ
앞에 언더바(_) 두개, 가운데 한 개, 뒤에 두 개 이렇습니다. ㅎ


자, 그리고 RootViewController 구현파일에도 와서 필요한 부분에 그녀석을 찍어 줍니다.


AppDelegate에도 마찬가지구요 ^^*


자! 그리고 실행해 봅시다~!
처음 로그는 어플리케이션을 실행시킨 후 네비게이션 push버튼을 누르고 다시 pop버튼을 누른 후에 나타난 로그입니다.


두 번째 로그는 어플리케이션을 실행시킨 후 모달뷰를 띄웠다가 다시 닫은 후에 나타난 로그입니다.


세 번째 로그는 어플리케이션을 실행시킨 후 addSubview와 removeSubview를 한 후의 로그입니다.


네 번째 로그는 어플리케이션 실행 후 홈버튼을 눌러서 백그라운드로 보낸 후 다시 어플리케이션을 띄운 후 다시 홈버튼을 누른 후에 생긴 로그입니다.


어떤가요? 여러분의 로그와 일치하나요?ㅎ

로그에 찍힌 것은,  -[해당 클래스명 메소드명] 이런식으로 남게 됩니다.

한 번 차근차근 로그를 따라서 추적해 보세요 ~^^*


# iOS Application Life Cycle

자, 그럼 실습을 해 보았으니 본격적으로 알아봅시다.

어플리케이션의 생명주기를 설명하는 그림으로 유명한 녀석입니다.ㅎ


1. 사용자가 어플리케이션을 탭합니다.
2. main() 함수가 호출됩니다.
3. UIApplicationMain()이 호출됩니다.
4. applicationDidFinishLaunching이 호풀됩니다. (AppDelegate)
5. 여러분이 설계하고 작성한 어플리케이션의 코드가 동작합니다.
6. 어플리케이션 종료를 명령하면 applicationWillTerminate가 호출됩니다. (AppDelegate)
7. 어플리케이션이 종료됩니다.

자, 어떤가요? 감이오시나요?ㅎㅎㅎ

main은 뭐고 UIApplicationMain 은 또 뭐고...???

ㅎㅎ

모든 C언어 기반의 프로그램은 main함수에서 출발을 하게됩니다.

Objective-C로 엄연히 아랫단은 C언어 기반이므로 main함수로부터 출발을 하게되는 것입니다.

사실상 형식적이라고 볼 수 있습니다.

우리가 신경써야 할 부분은 AppDelegate의 applicationDidFinishLaunching 부터라고 생각하시면 됩니다.

로그에 applicationDidFinishLaunching이 가장 먼저 찍힌 것을 확인하셨나요?ㅎ 맞지요?ㅎ

그리고 로그에서는 확인 할 수 있을지 모르겠지만 applicationWillTerminate에서 우리가 할 수 있는 모든 것은 끝이나게 됩니다.

한 마디로 어플리케이션의 생명주기는 우리가 AppDelegate에서 확인하고 관리할 수 있습니다.

그렇다면 ViewController들의 생명주기는...???


# iOS View Life Cycle
 
자, 어플리케이션 전체의 생명주기를 알아보았으니, 작게는 ViewController들의 생명주기에 대해 알아봅니다.

로그에 보면 ViewController의 로그 중에 가장 먼저 찍히는 녀석은 init(initWith....... 포함)입니다.

초기화 해 주는 녀석이 당연히 가장 먼저 호출이 되겠죠.

그 후에 바로 불리게 되는 녀석이 viewDidLoad입니다.

자동으로 생성되는 주석에 보면 이녀석에서 처음 부가적인 세팅을 하라고 써있죠.

눈치채신 분들도 계시겠지만 제가 아까 위에서 ViewController에 작성한 View Life Cycle의 메소드들은 순서대로 호출됩니다.

너무나 당연하게 

viewDidLoad
viewWillAppear:
viewDidAppear:
viewWillDisappear:
viewDidDisappear:
viewDidUnload

의 순서로 호출이 되게 됩니다.
그래서 viewDidUnload에서는 객체들을 놓아주는 곳으로 사용하라고 주석으로 설명이 되어있죠.

각각 호출되는 타이밍은 말씀드리지 않아도 아실 수 있을거라고 생각합니다...^^

영어 그대로 해석해 보세요..ㅎ

alloc, init, dealloc은 모든 객체에 공통적으로 해당되는 내용이므로 위에 나열하지는 않았습니다.

alloc - 메모리에 적재되는 시점
init - 객체가 초기화 되는 시점
dealloc - 객체가 메모리에서 해제되는 시점

dealloc은 실질적으로 해당 객체가 메모리에서 해제되는 시점(retainCount가 0이 되는 시점)에 호출되게 됩니다. 말그대로 alloc과 딱 반대개념이죠~


자, 이렇게 간략하게나마 어플리케이션과 뷰컨트롤러, 그리고 일반적인 객체의 생명주기에 대해 알아보았습니다.

제 설명이 어떻게 다가갔을지, 또 어떻게 느껴지셨을지 잘 모르겠지만, 궁금하거나 해결되지 않는 내용이 있었다면 꼭 말씀 부탁드립니다 :-)

사실 이 부분이 제가 초반에 제대로 개념을 잡아놓지 않아서 항상 혼돈을 겪었던 부분중에 하나기 때문에 필시 여러분께 도움이 될 것이라고 생각합니다.

그럼 이만...~!

p.s 오늘은 6월 25일 6.25전쟁 62주년입니다.
우리나라의 평화와 안위를 위하여 목숨바친 순국선열께 감사하는 마음을 가지는 우리가 되었으면 좋겠습니다.


by yagom

facebook : http://fb.yagom.net

twitter : http://twitter.yagom.net ( @yagomsoft )

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




저작자 표시 비영리 변경 금지
신고
Posted by yagom

C <20>. enum

C 2012.05.24 12:30

오늘의 주제

1. enum


벌써 스무 번째 시간입니다.^^

지난 번에 연결리스트에 대해 알아보았는데요 ㅎ 어려우셨죠?
요번에는 잠시 쉬어갈 겸 간단한 녀석 하나 들고 왔습니다~
이런 녀석도 있구나~
알고 가시면 될 듯 합니다.

자 그럼 상쾌한 기분으로 출발 해 볼까요?
고고씽~~~~~~~~~~~~




# enum

지난 번에 전처리자를 이야기 하면서 enum에 대하여 스치듯이 이야기 해 드린 것 같은데요 그때 소개해 드리지 못해 이번에 소개해 드리려 합니다.

enum은 상수 세트를 선언 해 줄 수 있습니다.

주로 어떤 상수 Flag를 지정해 줄 때 사용하게 되는데요, 그게 무슨 뜻이냐 하면 

내가 프로그램 안에서의 약속을 

상태1 == 0
상태2 == 1
상태3 == 2

으로 표현 간단히 해 주고 싶을 때 사용하게 됩니다.

뭐, 일단 알아두시고 나중에 프로그램을 짤 때 아! 이거 써먹으면 편하겠다! 라는 생각이 들 때가 올거예요 ㅎ 

언제 한 번 사용 해볼 때가 있으면 저도 다시 소개 해 드릴게요 ㅎ

오늘은 간단한 코드만 하나 내려놓고 갑니다~^^*


실행 해 보세요~

아까 말씀드렸다시피 enum으로는 상수형 정수만 표현이 가능합니다.

enum안에서 다음번의 순서에 있는 녀석에 특별히 숫자를 대입해 주지 않는다면, 이전 숫자에 +1 이 되어 들어갑니다.

직접 실행해서 확인해 보시는 방법이 가장 빠르겠네용 ㅎ

그럼 저는 이만~!

다음엔 뭘 가지고 나타나 볼까요 ㅎㅎ


by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 



저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

C <20>. enum  (4) 2012.05.24
C <18>. 연결리스트 (Linked list) - 자료구조(1)  (0) 2012.05.21
C <17>. 동적할당  (2) 2012.05.18
C <16>. 구조체  (2) 2012.05.16
C <15>. 전처리자  (0) 2012.05.14
C <14>. 배열  (4) 2012.05.11
Posted by yagom

오늘의 주제

1. 연결 리스트 (Linked list)


열 여덟 번째 시간입니다.^^

지난 번에 동적 할당에 대하여 알아보았습니다~
오늘은 동적 할당과 구조체를 알고 계셔야 이해할 수 있습니다.ㅎ

2012/05/16 - [C] - C <16>. 구조체

2012/05/18 - [C] - C <17>. 동적할당

자. 오늘 내용은 난이도가 쪼깨 있습니다~
처음 보시는 분들은 다섯 번은 봐야 이해가 될랑 말랑 하실거예요..ㅎㅎ
물론 C의 문법은 아닙니다만(사실 C의 중요한 문법은 거의 끝났다고 봐야겠죠?), 자료구조 공부하심에 있어서 도움이 되실거예요~
정말 중요한 것이니 몇 번을 보고, 다른 싸이트를 검색하고, 직접 계속 둘러보면서 꼭 몸으로 익히도록 하세요~!

자 험난한 여정을 함께 즐겨 볼까요?ㅎ
스따뚜~~~~~~~~~~~~


# 연결리스트

연결리스트 입니다.
이녀석은 언뜻 보면 배열과 비슷합니다.
하지만 동작 방식과 생성 방식은 크게 다르죠~

배열은 메모리 상에서 다닥다닥 서로 붙어있기 때문에 접근하기 용이 합니다. 하지만 우리가 마음대로 개수를 늘렸다 줄였다 할 수가 없지요.

그래서 우리는 연결 리스트라는 녀석을 고안해 냅니다. 쭈욱 늘어선 녀석들을 자유롭게 추가/삭제 할 수 있게 된 겁니다~

하지만, 기본적으로 C에서 주어진 자료형이 아닌, 우리가 직접 스스로 만들어야 하는 어려움이 있습니다.

코드의 양이 적지 않습니다~

잘 따라오세요^^ 물론 역시나 상세한 설명은 주석으로 남깁니다.

헤더 파일입니다.  (yagom.h)
연결리스트의 원소가 될 구조체를 처음에 선언 해 두었구요.
연결리스트 관리를 위한 함수들을 선언해 주었습니다.


구현 파일입니다. (yagom.c)
메인 함수를 구현합니다.


그 후에 헤더에 선언해 놓았던 함수들을 메인함수 아래쪽에 차례대로 작성해 줍니다.


그리고 실행을 해 볼까요?


자 이런식으로 우리는 연결리스트를 배열처럼 사용 할 수 있습니다.

어떤가요? 연결리스트라는 녀석, 비록 복잡하고 속도는 느리지만 용도에 따라 적절히 사용한다면 정말 매력적이 녀석이 됩니다^^*

그럼 다음에 또 뵈어요~^^*

by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 



저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

C <20>. enum  (4) 2012.05.24
C <18>. 연결리스트 (Linked list) - 자료구조(1)  (0) 2012.05.21
C <17>. 동적할당  (2) 2012.05.18
C <16>. 구조체  (2) 2012.05.16
C <15>. 전처리자  (0) 2012.05.14
C <14>. 배열  (4) 2012.05.11
Posted by yagom

C <17>. 동적할당

C 2012.05.18 12:30

오늘의 주제

1. 동적할당 malloc 


열 일곱 번째 시간입니다.^^

지난 번에는 구조체에 대하여 알아보았습니다.
구조체라는 녀석도 꽤나 매력적인 녀석입니다.
예를 들어 한 사람의 정보를 구조체 하나에 담을 수도 있구요(이름, 나이, 성별, 직업 등등)...
복합적인 자료를 관리하기 참 편리할 것 같죠?ㅎ

그리고 저번에 배웠던 배력적인 배열에 대해서도 잠깐 생각해 보도록 해요.
2012/05/11 - [C] - C <14>. 배열
ㅂㅐ열에서 우리는 하나의 의문을 가지고 끝을 맺었었죠.

배열의 크기는 조절 할 수 없는가 였는데요.
네, 조절할 수 없으므로, 필요에 따라서 우리가 원하는 크기만큼 할당하는 것이 좋겠죠?

그런데 우리가 개발을 하면서 이 배열은 딱 이 사이즈면 돼. 라고 말할 수 있는 경우는 많지 않습니다.
때에 따라 너무 다를 수 있으니까요.

그래서 배열을 때에 따라 상황에 맞게 할당 할 수 있는 기능이 있습니다.

물론 배열에 국한된 것은 아니지만 주로 배열에서 사용하게 되므로 배열로 예를 들어서 설명해 보겠습니다.

정말 중요한 것이니 몇 번을 보고, 다른 싸이트를 검색하고, 직접 계속 둘러보면서 꼭 몸으로 익히도록 하세요~! ^^

스따뚜~~~~~~~~~~~~

그 전에 추천 한 방 어떠세요?ㅎ 저에게 큰 힘이 됩니다 +_+ㅋ



# 동적할당 malloc

malloc이라는 함수가 하는 역할은 우리가 원하는 크기의 자료를 메모리에 할당하고 그 주소값을 다시 되돌려 주는 역할을 합니다.
즉, 입력값은 원하는 크기, 리턴값은 메모리의 주소 입니다.

사용방법은

포인터 변수 = (포인터의 자료형 종류)malloc(원하는 자료크기);

이런식으로 사용합니다.

잘 감이 안오시죠?ㅎ 예제를 봐도 감이 올랑말랑 할겁니다 ㅎ

그래도 한 번 예제 소스 보시죠~ 자세한 설명은 역시나 주석으로 ^^

 
지난 번 배열의 비밀에서 배열의 이름은 배열 첫 머리 원소의 주소가 된다고 말씀 드렸죠?ㅎ
그것을 여기서 멋들어지게 써먹는 겁니다~
배열을 메모리에 할당을 해주고 그 첫머리의 주소값을 포인터 변수에 넣어주는 것이죠 ㅎ
그러면 배열과 똑같은 역할을 하게 되는 것이죠~

참! 그리고 malloc을 한 후에 사용을 끝냈으면 꼭 free를 호출해서 메모리에 할당하였던 녀석을 풀어주어야 합니다~
안그러면 메모리에 좀비처럼 남겨져서 메모리가 필요할 때 사용을 할 수가 없어요^^&

그럼 결과를 한 번 볼까요?



자, 숫자는 랜덤으로 들어갔기 때문에 숫자는 다를 수가 있어요 ㅎ

어떤가요? malloc이라는 녀석 매력적인가요?ㅎ

부족하거나 더 궁금한 점이 있다면 주저말고 댓글 주세요~^^*

그럼 전 이만...!


by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 



저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

C <20>. enum  (4) 2012.05.24
C <18>. 연결리스트 (Linked list) - 자료구조(1)  (0) 2012.05.21
C <17>. 동적할당  (2) 2012.05.18
C <16>. 구조체  (2) 2012.05.16
C <15>. 전처리자  (0) 2012.05.14
C <14>. 배열  (4) 2012.05.11
Posted by yagom

C <16>. 구조체

C 2012.05.16 12:30

오늘의 주제

1. 구조체 


열 여섯 번째 시간입니다.^^

지난 번에는 전처리자에 대해 알아보았습니다.
잘만 사용하면 좋지만, 잘못 사용한다면 독이 될 수 있는 녀석입니다.
사용에 유의하세요^^

오늘은 또 하나의 개념 구조체에 대해 알아보도록 하겠습니다.

자 그럼 이제 시작해 볼까요?^^
스따뚜~~~~~~~~~~~~

그 전에 추천 한 방 부탁~~~~~~~해요~~~~~~
저에게 큰 힘이 됩니다. ^~^




# 구조체의 개념


간단 합니다.
이 녀석은 배열과는 다르게 서로 다른 종류의 자료들이 들어갈 수 있습니다.

큰~~~~~~~ 박스 안에 서로 다른 크기의 작은 박스들이 들어가 있는 형태라고 보시면 되겠습니다.

그래서 우리가 큰 박스를 만들고 그 안에 작은 박스들을 만들어 넣습니다.

선언하는 방법은

struct 구조체이름 {
  내용물(변수들 선언)
} 구조체변수이름;


한 번 구조체 이름으로 선언 해 주면
다음 번에는 
struct 구조체이름 구조체변수이름;
이라고 선언 해 줄 수도 있습니다.

구조체 안의 변수에 접근하는 방법은

구조체변수명.내용물변수이름

이런식으로 접근하게 됩니다.

말로 하니까 어렵네요 ㅎ 예제를 한 번 봅시다요~

# 구조체 예제
 


yagom이라는 이름의 구조체를 tYagom, tAgainYagom 이라고 선언해 준 형태입니다.
yagom이라는 이름의 구조체 안에는 int형 변수 nNum과 char 포인터형 변수 szName이 들어가 있네요~
그곳에 접근하는 방법은 .  을 통해서 접근하는 것이죠.


결과 캡쳐입니다. 다들 예상대로 출력이 되었나요?ㅎ

그런데 구조체를 선언 할 때 마다 struct yagom 이렇게 하기가 좀 귀찬습니다...ㅎㅎ

그래서 조금이라도 더 간단히 하기 위해서 우리는 이렇게도 선언을 할 수 있습니다.

typedef 라는 녀석을 이용하는데요.

typedef는 어떠한 형태의 타입을 나는 이렇게 정의 하겠다, 라고 말해주는 것으로써 #define이랑 하는 짓은 비슷합니다만, 정의 해 줄 녀석이 아무거나가 아니라 자료형이라는 점이 다릅니다.

typedef int my;
이런 식으로 해주면
int a; 라고 선언 한 것과 my a; 라고 선언 한 것과 동일한 효과를 가져오게 됩니다.

그러므로 typedef struct yagom{ ...} yagom; 이런 식으로 선언을 해준다면 struct yagom{...} 과 yagom과 같아지는 효과를 보게 되겠지요.

말로는 잘 이해가 다가오지 않죠?ㅎ 실습 해 봅시다.


위에 그림처럼 struct yagom을 한 것과 그냥 yagom이라고 한 것과 같은 효과를 볼 수가 있네요~


자, 이렇게 해서 구조체에 대해 간단히 알아보았습니다.

참, 오늘 빼먹은 것이 있는데, 만약 구조체의 포인터변수에서 내부의 변수에 접근을 하려면 . 을 사용하는 것이 아니라 ->을 사용하게 됩니다.

잘 이해가 안가시면 다다음 번 포스팅 때 제대로 볼 수 있으실 거예요~ㅎ

그럼 다음에 또 뵈어요~^^&

by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 



저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

C <18>. 연결리스트 (Linked list) - 자료구조(1)  (0) 2012.05.21
C <17>. 동적할당  (2) 2012.05.18
C <16>. 구조체  (2) 2012.05.16
C <15>. 전처리자  (0) 2012.05.14
C <14>. 배열  (4) 2012.05.11
C <13>. 변수의 범위  (0) 2012.04.05
Posted by yagom

C <15>. 전처리자

C 2012.05.14 12:30

오늘의 주제

1. #define 
2. #ifdef 



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

지난 번에는 배열에 대해 알아보았는데, 흥미로우셨나요?
배열은 두고두고 계속 사용하게 되니까 잘 알아두셔야 합니다~
게다가 배열과 포인터는 뗄 수 없는 관계이므로 꼭 기억해 두세요 ㅎ

이번엔 전처리자에 대해 알아봅니다.
스따뚜~~~~~~~~~~~~

그 전에 추천 한 방 어떠세요?ㅎ


# 전처리자

전처리자는 전처리 명령을 수행하는 녀석입니다.

전처리 명령은 '#'으로 시작하게 됩니다. 

우리가 흔히 볼 수 있는 전처리 명령에는 #include가 있겠죠?

이 전처리 명령은 컴파일이 시작되기 전에 처리가 되게 됩니다.

그래서 이름이 전처리 명령이죠..^^

이 전처리 명령을 수행하는 전처리기는 C언어의 문법을 알지 못합니다.

어쨋든 이 전처리 명령은 우리가 잘만 활용을 하면 유용하게 사용할 수 있습니다^^

일단 처음에 소개할 녀석은

#define 이라는 녀석입니다.

간단한 예제로 시작해 볼게요~




#define 이라는 녀석은

define... 말 그대로 정의 해 주는 녀석입니다.

이녀석은 이거다!!! 이렇게요 ㅎ

선언 방법은

#define 이녀석 이거

입니다.

위의 그림을 보시면 MAX(a, b) 라는 녀석은 (a>=b ? a :b ) 라고 알아먹어라.

라는 이야기가 되지요.

위의 뜻이 이해가 안가신다구요? 3항연산자를 모르신다구요? 안돼요 ㅠㅠ
2012/01/28 - [C] - C <8>. 조건문(3) 3항 연산자

ㅋㅋ 여튼 define 해줄때 뿐만 아니라 모든 전처리 명령에서는 뒤에 세미콜론 (;)을 붙이지 않습니다.

위의 예제를 실행해 봅시다.


이런 결과가 나오게 되네요~

#define 이라는 녀석 조금은 감이 오시나요?ㅎ

다음에는 char 형을 파라메터로 넣어 봅시다.

이렇듯이 define하여 '매크로화' 된 녀석의 파라메터로 들어가는 값은 어떤 형식이든지 상관이 없습니다. 왜냐면 이 녀석은 C의 문법을 모르기 때문이지요.
그만큼 편리하지만 그만큼 무서운 녀석입니다.
잘못된 인자(파라메터)를 받고서도 무작정 실행 해 버리기 때문에 warning이나 error가 발생하지 않기 때문에 나중에 프로그램에 문제가 생겼을 때 그 원인을 찾기가 힘들어 집니다...
물론 위의 예제는 에러나 워닝의 요소는 아닙니다..^^;

자, 다음에 소개드릴 녀석은 #ifdef 라는 녀석입니다.

말 그대로 '만약 이녀석이 define 되어 있다면...' 이런 뜻입니다.

 #ifdef 이녀석

이런 표현이 되겠지요?

우리가 if 를 쓸 때 else 라는 녀석이 따라왔지요. 여기서도 마찬가지 입니다~

#else가 따라옵니다 ㅎ

거기에 덧붙여 #ifdef를 끝마친다는 의미의 #endif도 추가적으로 따라옵니다.


위의 그림에서는 MODE_DEBUG가 #define 이 되어있기 때문에 #ifdef안의 문장이 실행이 됩니다.

만약 MODE_DEBUG가 #define되어 있지 않다면 어떻게 되는지 봅시다.


요로코롬 #else 에 속해있는 녀석이 실행이 되겠지요..^^

이 #ifdef 같이 되어있는 녀석은 if와는 다른점이 컴파일 되기도 전에 해당사항이 없다면 컴파일 되지 않게 된다는 점입니다.

즉, 프로그램 안에 영영 속하지 않게 된다는 뜻이 겠지요~

그 다음에 살펴볼 녀석은

#undef 라는 녀석입니다.

말 그대로 define되어 있던 녀석을 해제하는 녀석입니다.

예제를 통해 볼까요?


#define으로 정의되어 있던 SUM(a, b)라는 녀석을 define 해제시키고 새로 define한 예제입니다. 지난 define값이 없어지고 새로 define 되었지요..^^

이 외에도 ifdef말고도 

#if

#ifelse

등을 쓸 수도 있습니다.

한 번 시도해 보세요~^^

그러나 이 전처리자의 무서움은 C문법을 알고있지 않다는 점에 있습니다.

함부로 사용하게 되면 복잡한 프로그램에서는 피를 보는 결말을 보게되지요..^^;

그러므로 적절히 사용하는 것이 좋습니다.

이 전처리 명령을 대체할 수 있는 방법들이 몇 가지 있습니다.

enum을 사용해도 좋고, const변수를 사요해도 좋습니다.

물론 꼭 define을 사용해야 하는 경우도 생기지만 말입니다~


위의 그림을 보고 코드를 이해해 보세요..^^

구글링을 해 보셔도 좋습니다~

전처리 명령은 잘만 사용하면 효과적인 프로그래밍에 많은 도움이 됩니다.

꼭 기억해 두세요~^^

오늘은 여기 까~~~~~~~~지~~~~~~~~~

by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 



저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

C <17>. 동적할당  (2) 2012.05.18
C <16>. 구조체  (2) 2012.05.16
C <15>. 전처리자  (0) 2012.05.14
C <14>. 배열  (4) 2012.05.11
C <13>. 변수의 범위  (0) 2012.04.05
C <12>. 함수  (4) 2012.04.02
Posted by yagom

C <15>. 전처리자

C 2012.05.14 12:30

오늘의 주제

1. #define 
2. #ifdef 



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

지난 번에는 배열에 대해 알아보았는데, 흥미로우셨나요?
배열은 두고두고 계속 사용하게 되니까 잘 알아두셔야 합니다~
게다가 배열과 포인터는 뗄 수 없는 관계이므로 꼭 기억해 두세요 ㅎ

이번엔 전처리자에 대해 알아봅니다.
스따뚜~~~~~~~~~~~~

그 전에 추천 한 방 어떠세요?ㅎ


# 전처리자

전처리자는 전처리 명령을 수행하는 녀석입니다.

전처리 명령은 '#'으로 시작하게 됩니다. 

우리가 흔히 볼 수 있는 전처리 명령에는 #include가 있겠죠?

이 전처리 명령은 컴파일이 시작되기 전에 처리가 되게 됩니다.

그래서 이름이 전처리 명령이죠..^^

이 전처리 명령을 수행하는 전처리기는 C언어의 문법을 알지 못합니다.

어쨋든 이 전처리 명령은 우리가 잘만 활용을 하면 유용하게 사용할 수 있습니다^^

일단 처음에 소개할 녀석은

#define 이라는 녀석입니다.

간단한 예제로 시작해 볼게요~




#define 이라는 녀석은

define... 말 그대로 정의 해 주는 녀석입니다.

이녀석은 이거다!!! 이렇게요 ㅎ

선언 방법은

#define 이녀석 이거

입니다.

위의 그림을 보시면 MAX(a, b) 라는 녀석은 (a>=b ? a :b ) 라고 알아먹어라.

라는 이야기가 되지요.

위의 뜻이 이해가 안가신다구요? 3항연산자를 모르신다구요? 안돼요 ㅠㅠ
2012/01/28 - [C] - C <8>. 조건문(3) 3항 연산자

ㅋㅋ 여튼 define 해줄때 뿐만 아니라 모든 전처리 명령에서는 뒤에 세미콜론 (;)을 붙이지 않습니다.

위의 예제를 실행해 봅시다.


이런 결과가 나오게 되네요~

#define 이라는 녀석 조금은 감이 오시나요?ㅎ

다음에는 char 형을 파라메터로 넣어 봅시다.

이렇듯이 define하여 '매크로화' 된 녀석의 파라메터로 들어가는 값은 어떤 형식이든지 상관이 없습니다. 왜냐면 이 녀석은 C의 문법을 모르기 때문이지요.
그만큼 편리하지만 그만큼 무서운 녀석입니다.
잘못된 인자(파라메터)를 받고서도 무작정 실행 해 버리기 때문에 warning이나 error가 발생하지 않기 때문에 나중에 프로그램에 문제가 생겼을 때 그 원인을 찾기가 힘들어 집니다...
물론 위의 예제는 에러나 워닝의 요소는 아닙니다..^^;

자, 다음에 소개드릴 녀석은 #ifdef 라는 녀석입니다.

말 그대로 '만약 이녀석이 define 되어 있다면...' 이런 뜻입니다.

 #ifdef 이녀석

이런 표현이 되겠지요?

우리가 if 를 쓸 때 else 라는 녀석이 따라왔지요. 여기서도 마찬가지 입니다~

#else가 따라옵니다 ㅎ

거기에 덧붙여 #ifdef를 끝마친다는 의미의 #endif도 추가적으로 따라옵니다.


위의 그림에서는 MODE_DEBUG가 #define 이 되어있기 때문에 #ifdef안의 문장이 실행이 됩니다.

만약 MODE_DEBUG가 #define되어 있지 않다면 어떻게 되는지 봅시다.


요로코롬 #else 에 속해있는 녀석이 실행이 되겠지요..^^

이 #ifdef 같이 되어있는 녀석은 if와는 다른점이 컴파일 되기도 전에 해당사항이 없다면 컴파일 되지 않게 된다는 점입니다.

즉, 프로그램 안에 영영 속하지 않게 된다는 뜻이 겠지요~

그 다음에 살펴볼 녀석은

#undef 라는 녀석입니다.

말 그대로 define되어 있던 녀석을 해제하는 녀석입니다.

예제를 통해 볼까요?


#define으로 정의되어 있던 SUM(a, b)라는 녀석을 define 해제시키고 새로 define한 예제입니다. 지난 define값이 없어지고 새로 define 되었지요..^^

이 외에도 ifdef말고도 

#if

#ifelse

등을 쓸 수도 있습니다.

한 번 시도해 보세요~^^

그러나 이 전처리자의 무서움은 C문법을 알고있지 않다는 점에 있습니다.

함부로 사용하게 되면 복잡한 프로그램에서는 피를 보는 결말을 보게되지요..^^;

그러므로 적절히 사용하는 것이 좋습니다.

이 전처리 명령을 대체할 수 있는 방법들이 몇 가지 있습니다.

enum을 사용해도 좋고, const변수를 사요해도 좋습니다.

물론 꼭 define을 사용해야 하는 경우도 생기지만 말입니다~


위의 그림을 보고 코드를 이해해 보세요..^^

구글링을 해 보셔도 좋습니다~

전처리 명령은 잘만 사용하면 효과적인 프로그래밍에 많은 도움이 됩니다.

꼭 기억해 두세요~^^

오늘은 여기 까~~~~~~~~지~~~~~~~~~

by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 



저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

C <17>. 동적할당  (2) 2012.05.18
C <16>. 구조체  (2) 2012.05.16
C <15>. 전처리자  (0) 2012.05.14
C <14>. 배열  (4) 2012.05.11
C <13>. 변수의 범위  (0) 2012.04.05
C <12>. 함수  (4) 2012.04.02
Posted by yagom

C <14>. 배열

C 2012.05.11 12:30

오늘의 주제

1. 배열 


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

지난 번에는 변수의 범위에 대하여 알아보았습니다.
감이 조금 오실지는 잘 모르겠습니다^^;
혹여나 부족한 부분이 있다면 말씀해 주세요 ㅎ
이번에는 또 하나 중요한 개념인 배열에 대하여 알아보도록 하겠습니다.

출발!!!!

자, 시작전에 추천 한 방 어떠세요?ㅎ



# 배열이란?

자, 배열이란 무엇일까요?

配列
 
나눌 배, 벌일 열.

사전에는
"동일한 성격의 데이터를 관리하기 쉽도록 하나로 묶는 ."
이라고 정의되어 있네요 ㅎ

자, 쉽게 한 번 알아봅시다.



위에는 제가 발로그린 배열의 개념도 입니다.

위의 정의에서 보듯이 배열은 같은 종류의 데이터를 줄세워 놓은 녀석을 말합니다.

그림에서 보듯이 배열은 같은 크기의 상자들이 쭈욱 붙어서 늘어서 있습니다. 
 
배열의 선언방법은

자료형 배열이름[배열크기];

입니다.

초기화 방법은 여러가지가 있습니다만 

5개의 배열에 하나씩 넣어주려면 위의 그림처럼 초기화 해 줄 수 있구요,

int arr[100] = { 0, };

으로 초기화하면 모든 원소의 값이 0으로 초기화 됩니다.

배열의 index는 0부터 시작합니다.

위의 그림에도 보듯이 5칸 배열을 선언을 해 주었는데

index는 0부터 시작을 하므로 index값이 0으로 시작하여 4로 끝나게 되지요.

위의 그림에서 

rgIntArray[0]에는 1이, rgIntArray[1]에는 3이... 이런식으로 들어가 있을 겁니다.

그래서 맨 첫칸의 자료를 변경하거나 읽어오려면 rgIntArray[0] 라고 하면 변수처럼 사용이 가능한 것입니다.

개념이 조금 잡히시나요?

배열은 단지 같은 유형의 데이터를 쭈욱 늘어놓은 것이라고 생각하시면 되겠습니다.^^


# 배열과 포인터
 

여기서 배열의 비밀을 하나 말씀드리려 합니다.

배열을 사용하게되면 같은 유형의 자료들을 모아놓고 쓸 수 있는 편한점이 있지만 이 외에도 좋은 점이 있습니다.

배열 자체를 포인터로 접근이 가능하다는 점입니다.

포인터에 대해서 잘 모르시겠다구요?

지난 포스팅을 참고해 주세요...^^

2012/03/23 - [C] - C <10>. 포인터 (1)개념잡기
2012/03/27 - [C] - C <11>. 포인터 (2)간단실습

'배열을 포인터로 사용이 가능하다고???'

무슨 말일까요?



자. 배열에서 각각의 자료를 불러오거나 저장할 때

배열명[index]로 변수처럼 사용한다고 말씀드렸죠?

그런데 만약에 함수(2012/04/02 - [C] - C <12>. 함수)를 사용할 때, 인자로 배열을 넘겨야 할 때...

이녀석들을 하나하나 다 넘길 수가 없겠죠?

그래서 인자를 넘길때는 해당 자료형의 포인터값으로 넘어가게 됩니다.

그래서 함수 안에서 이 배열 통채를 사용 할 수 있게 됩니다.

배열의 원소들은 메모리 안에서 위에 그림처럼 다닥다닥 붙어있게 됩니다.

그렇기 때문에 배열의 첫머리의 주소만 알면 그 다음녀석, 그 다다음 녀석도 메모리상의 어느 위치에 있는지 쉽게 알 수 있게되는거죠.

이해가 되시려나요? +_+

그래서 그림처럼 rgIntArray 라고 변수처럼 사용하면 이녀석은 배열의 첫 번째 원소를 가리키는 포인터값입니다.

그녀석에 +1을 해주면 그 다음칸 녀석의 주소를 가리키게 되는 것입니다. 그런식으로 rgIntArray+2면 rgIntArray의 주소값이 겠죠?

이해가 안되면 실습으로 궁금증을 풀어봅시다..ㅎㅎ

# 실습해보기 

자세한 코드 설명은 주석에 달려있으므로 참고하시기 바랍니다~!
yagom.h 파일에는

#include <stdio.h>
#include <stdlib.h>

만 작성되어 있습니다.



자, 실행 결과입니다.
자신의 실행결과와 일치하나요?ㅎ


여기까지 배열에 관하여 간단히 알아보았습니다.

문자 배열 ( char[] )는 문자열로 사용이 가능합니다.

printf와 같은 함수에서 %s로 문자열 출력이 가능하지요.

대신 문자열의 맨 마지막은 null (\0)으로 끝나야 합니다.

2차원, 다차원 배열도 있지만 그것도 어렵게 생각하실 필요가 없습니다.

쉽게 쉽게 생각해 보세요~

따로 포스팅할 필요를 잘 못느껴서 하진 않지만,

누군가 요청해 주시면 다차원 배열에 대해서도 한 번 알아보도록 하겠습니다~^^&


자, 그럼 여기서 생길만한 의문점..!!

Q : 배열을 생성해 놓고 배열의 크기나 종류를 변경 할 수는 없나요?
A : 네, 불가능 합니다. 그렇기 때문에 동적할당이라는 녀석을 사용하게 되는데, 추후에 포스팅 할 예정입니다.

다른 의문점이 또 있다면 댓글 주세요..^^

또 필요한 것이 있다면 말씀해 주세요 ㅎ

by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 



저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

C <16>. 구조체  (2) 2012.05.16
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
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

C <12>. 함수

C 2012.04.02 12:30

오늘의 주제

1. 함수의 개념
2. 함수 만들고 사용하기 


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

지난 번에는 포인터라는 녀석에 대해 알아보았습니다.
사실 포인터라는 녀석과 함수는 절친사이랍니다~
모양이나 역할이 비슷한것이 아니라, 함수 때문에 포인터가 유용하다고나 할까요?ㅎㅎ

뭐 여튼 포인터든 함수든 중요합니다~

자 거두절미하고 시작합니다~
고고씽~~~~~~~~~~~~


# 함수?

함수란 무엇일까요?

함수에 대해 간략하게 이야기 해보자면,
함수라는 녀석들은 무엇인가를 수행하는 역할을 합니다.
쉽게 설명을 해서 전자레인지는 우리가 차가운 음식을 집어넣고 버튼을 누르면 데워서 뜨거운 음식으로 만들어 줍니다. 즉, 찬음식을 데워서 뜨거운 음식을 만드는 일련의 과정을 수행하는 역할을 하지요.
함수도 우리가 메소드에게 일할거리를 던져주면 함수의 고유한 역할들을 수행합니다.
감이 오시나요?ㅎ

함수라는 것은 인자값과 반환값이라는 것이 있습니다.
함수의 원형 하나를 선언해 본다고 생각해 봅시다.
자 이렇게 선언을 하는 것입니다.

int myFunction(int a, float b);

처음 쓰여있는 자료형은 이 함수의 반환값(리턴값)의 자료형을 의미합니다. 이 함수의 반환값은 int 자료형을 가지고 있군요. 자세한 설명은 아래에서 하겠습니다.
그 다음에 오는 것은 이 함수의 이름입니다. 이 함수의 이름은 myFunction 입니다. 정확히 말하자면 myFunction(int, float) 입니다.
그리고 괄호 안에 있는 녀석들은 이 함수에 들어가는 인자의 자료형과 이름을 뜻합니다. int자료형을 갖는 a와 float자료형을 갖는 b라는 이름을 가진 두 개의 인자가 전달되어 들어오네요. 이 역시 자세한 설명은 요 아래.

자, 그럼 반환값과 인자가 무엇이냐?

우리가 밥을 먹는다고 생각해 봅시다. 밥도 먹고 국도 먹고 반찬도 먹습니다. 이것을 인자라고 생각합니다.
그리고 우리는 뱃속의 여러 장기들에서 이 음식들을 소화하고 분해하고 찌꺼기는 분류해서 대변(똥ㅋㅋㅋㅋㅋㅋㅋㅋㅋ)으로 변환하여 배출합니다.

조금 감이 오시나요?
함수 어떤 특정한 일을 하는 마술상자 같다고 표현합니다.
여러 인자들을 받아들여서 이것을 함수 고유의 특정한 방법을 거치고 가공하여 다시 뱉어냅니다. 이것이 함수의 역할입니다.

그래서 받아들이는 값들을 인자값, 그리고 뱉어내는 값들이 반환값입니다.

하지만, 사람과는 약간 다르게 함수라는 녀석은 먹지 않고도 뱉어낼 수 있고, 먹어도 뱉어내지 않을 수도 있습니다.
인자값이 없는 함수도 있고, 리턴값이 없는 함수도 있다는 말이죠..^^
또, 먹지도 뱉지도 않는 함수들도 있습니다.

먹는게 없는 함수는 인자없이 이렇게 () 괄호만 있구요, 뱉는게 없는 함수는 반환값 자료형의 종류가 void로 표기되어 있습니다.

이런 저런 함수들을 보다보면 자연스레 알게되실거예요~

자, 그럼 본격적으로 함수 구현을 해 봅시다.

그 전에.........

Xcode 말고 다른 개발툴로 한 번 진행해 보겠습니다.

MS사의 Visual Studio 2008입니다.

제가 회사에서 Xcode말고 Visual Studio 2008을 쓰게 되어서 그런건 절대 아닙니다. 네.....ㅋㅋㅋㅋㅋㅋㅋㅋ

일단 이녀석에는 솔루션이라는 개념과 프로젝트라는 개념이 있습니다.

프로젝트는 하나의 프로그램이라고 생각하시면 되고, 솔루션은 그 프로그램들을 관리하기 쉽게 관련 프로그램들을 모아 볼 수 있는 녀석이라고 생각하면 쉽습니다.

더 쉽게 말하자면 하나의 프로그램은 책이고, 솔루션은 책꽂이 입니다..ㅋㅋㅋ

# 함수 사용해 보기
 

자, 그럼 이제 솔루션과 함께 프로젝트를 생성해 봅니다!

File - New - Project를 선택합니다.
단축키는 친절하게 Ctrl + Shift + N 이라고 되어있네요~


자 Project types는 Visual C++, Templates는 Win32 Console Application으로 지정하고 
프로젝트 이름은 FuncExample, 솔루션 이름은 WithYagom으로 해줬습니다. 다른 옵션사항은 아래 그림과 같이 해주시면 되구요, OK누릅니다~


그럼 다음을 눌러주시구요~


여기서 Console application, Empty project로 지정해 주시고 Finish!!


자, 그럼 빈 프로젝트가 생성이 되었습니다.
그럼 이제 헤더파일을 만들어 봅시다.
Header Files에서 오른쪽 버튼 클릭! 
Add - New Item을 클릭.


Categories는 Code, Templates는 Header File(.h)입니다.
이름을 이쁘게 FuncExample.h로 해 주시고 Add


이제는 구현소스파일(.c)를 만들어 줍시다. 마찬가지로 Source Files에서 오른쪽 버튼 클릭 
Add - New Item...


C++ File(,cpp)를 선택하시고, 이름을 써줄때 확장자를 꼭 c로 써주세요~ 
안그러면 기본적으로 C++파일로 생성이 되어버립니다.


자, 그렇게 만들고 나서 컴파일을 한 번 해봅니다.
Build - Compile 클릭!
또는 컨트롤 + F7


에러가 안뜨죠? 당연힠ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아무것도 안적었는데 ㅋㅋㅋ 에러가 안나죠~
이제 C의 기본인 메인 함수를 만들어 봅시다~

일단 헤더파일(FuncExample.h)에서 아래와 같이 코드를 작성합니다.
우리는 지금 main함수의 원형을 헤더파일에 쓰고 있는거예요~


그리고 소스파일(FuncExample.c)로 와서 아래와 같이 main함수를 구현해줍니다.


다시 컴파일을 하고 빌드를 해 봅시다~
빌드의 단축키는 F7


에러가 난다면 소스를 잘못 입력하신거니깐 찬찬히 다시 입력해 봅시다~
빌드를 성공했으면 이제 실행시켜 봅니다~
Debug - Start Debugging
또는 F5


컴퓨터 성능이 좋은 분이라면 아마 콘솔창(까만 도스창같은녀석)이 순식간에 떴다가 사라지실 거예요~
정상입니다~ㅋㅋㅋ

그럼 이제 myFirstFunction이라는 함수를 만들어 봅니다.
그리고 메인함수 안에서 그 함수를 세 번 호출해 줍니다.
아래 getchar()는 아직 무슨뜻인지 신경쓰지 않으셔도 됩니다~


자, F5키를 눌러서 실행을 시켜보면 이런 창이 뜨는데 디버깅 하기 전에 빌드하겠냐고 물어보는 거예요~ 당연히 해야죠 ㅎㅎ

제대로 잘 실행이 되었네요~
스페이스바 빼고 아무키나 누르시면 종료됩니다~


이렇게 간단한 함수 하나 순식간에 만들어 보았는데요~

이번엔 함수를 여러개 만들어 봅시다~

아래와 같이 코드를 작성해 주시고~ 실행을 시켜봅시다~!
제가 주석을 달아놓지 않아서 처음엔 좀 헷갈리실 수도 있겠지만, 위에 함수에 대한 설명을 보면서 이해하시면 될거예요~


짜잔~ 이런 결과화면이 출력이 되네요~^^*



어떠셨나요?
함수에 대해 조금 감이 오시나요?
조금 더 설명을 하고 싶기도 하지만...
지금 너무 졸려요 ㅠ_ㅠ

궁금한 점이나 잘못된 점이 있다면 바로바로 댓글 남겨주세요~
물론 응원의 글이라면 더더욱 좋구요..ㅋㅋㅋㅋㅋㅋㅋ

댓글과 추천과 사랑이 저에게는 아주 큰 힘이 된답니다!!ㅋㅋ

그럼 다음에 또 봐요~^^*

by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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

저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

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
C <9>. 반복문(2) do-while  (7) 2012.02.06
Posted by yagom

오늘의 주제

1. 포인터 실습 


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

지난 번에는 포인터의 개념에 대해 간략히 살펴봤어요~
포인터라는 녀석을 알아도 헷갈릴때도 있고, 이해가 안될 수도 있지만, 꼭 잘 이해하고 계셔야 해요 ㅎㅎ
만날 똑같은 소리지만... 잘 이해하고 계셔야 나중에 좋습니다.
기초가 중요하니까요^^

자 그럼 오늘은 간단히 코드로 실습해 보도록 합니다~
스따뚜~~~~~~~~~~~~


# 포인터 실습

자, 지난번에 빼뜨렸고, 요번에도 빠뜨린 내용이 있는데 포인터는 선언해 줄때 그녀석이 어떠한 형식의 변수의 주소를 가지게 될지 앞에 표현해 주는 것입니다.

int *ptrSomebody = &somebody;

이런식으로 표현이 되어있으면 somebody는 int형 변수이여야 한다는 뜻이지요.

물론 void 포인터라는 특이한 개념도 있지만, 일단 이렇게 알아두세요 ㅎ

자 그럼 간단한 코드로 실습해 보겠습니다~

간단하게 새로운 프로젝트를 만들어 주시구요~


프로젝트명은 Pointer로 해 줍니다.


굳이 하드에 공간낭비 할 필요없이 Source Control은 꺼 주셔도 됩니다.
뭔지 알고 계시는 분들은 쓰셔도 상관없구요 ㅎㅎ


자..! 그러면 이렇코롬 코드를 넣어주고 실행!!!


뭐...별다른 설명은 필요 없을 거 같네요 ㅎㅎㅎ

결과 디버그창 보시면 이해 되실거예요.

지난번에 썼던 개념들( 2012/03/23 - [C] - C <10>. 포인터 (1)개념잡기 )과 함께 비교해 보면 좋겠어요~

참..! 그리고 예제에는 int값과 int포인터만 선언해서 해봤는데

여러분들은 double, float, char 등등 많이많이 해보세요~

절대 제가 귀찮아서 그런건 아녜요^^

그럼 뿅!!


by yagom

twitter :@yagomsoft

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

RSS Feed 받기   


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

저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

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
C <9>. 반복문(2) do-while  (7) 2012.02.06
C <8>. 조건문(3) 3항 연산자  (7) 2012.01.28
Posted by yagom

오늘의 주제

1. 포인터의 개념 


열 번째 시간입니다.^^

지난 번에는 반복문에 대하여 알아보았습니다.
정말 기초적인 문법들이라 꼭 알아두셔야 합니다~^^
앞으로 계속 쓰일거니깐요 ㅎ

자 그럼 오늘은 또 중요한 개념 포인터에 대해서 알아볼까요?ㅎ
출바알~~~~~~~~~~~~


# 포인터란?

포인터란 무엇일까요?
우리말로 하면 가리키는놈?ㅋㅋ 뭐 이런뜻이겠죠?
네 여기서도 똑같은 뜻입니다.

무언가를 가리키는 녀석을 포인터라고 부릅니다.

자, 포인터를 설명하기 전에 잠시 변수에 대해서 다시 생각해 봅니다.

우리가

int a = 15;

이렇게 선언을 해주면 컴퓨터는 메모리의 적당한 공간에 15라는 값을 저장하게 됩니다.
그것을 저는 이렇게 표현해 보겠습니다.
요로코롬 메모리 공간이 있다고 생각해 봅니다.


저기 메모리의 한 블럭을 하나의 상자라고 생각해 봅시다.
이렇게 사과박스 모양의 상자가 하나 있습니다.
속이 텅 비어있지요~
비어있는 메모리 공간이라고 생각합니다^^


비어있는 메모리 공간에 우리가 뭔가를 채워주려 합니다.
그냥 우리끼리 생각한대로 박스에 뭔가를 채워넣는다고 생각합시다.

어느 농부가 박스에다가 사과를 다섯개 담고 그 위에다가 메모를 해 둡니다.
이 박스가 위치한 주소는 '사랑시 행복구 고백동 1055번지' 라고 적고, 여기에는 '사과'가 들어있다. 그리고 그 사과 이름은 '마이애플'이다.
그리고 메모에는 없지만 내용물을 들여다 보니 5개가 들어있는 것을 알 수 있습니다.
 



이해 되시나요? 농부가 한 일이 컴퓨터가 해 준 일이라고 생각해 보면, 컴퓨터는 메모리에 값을 집어 넣어놓고 저렇게 기억을 해 둡니다.
그럼 요것을 컴퓨터가 하는일로 표현해 봅시다.
메모리의 공간(박스 속)에 '15'라는 숫자를 넣어놓고 그 상자의 종류는 'int' 정수형 이며, 이름은 'a'이다. 그리고 주소는 0x50F3A32E라고 기억합니다. 


이것이 우리가 변수를 메모리에 생성했을때 일어나는 일입니다. 조금 감이 오시나요?ㅎㅎ

그런데!!! 포인터는!!
저기 박스 안에 값이 다른 녀석의 주소값이 들어가게 되는 것입니다.
그것이 무슨 말이냐...?
감이 오시나요?

변수라는 녀석들은 자신의 메모리 영역에 '값'을 가지게 되죠.
위에 우리가 선언했던 int a는 15라는 값을 가지죠.

그리고

int *ptrA = &a;

이런식으로 선언을 해주게 되면,  "ptrA라는 이름을 가지는 int를 가리키는 포인터형에 a의 주소를 집어 넣겠다." 라는 뜻이 됩니다.
즉, 포인터형 변수는 그녀석이 가리키게 될 녀석의 변수형 포인터가 되고, 값은 가리키는 녀석의 주소를 가지게 됩니다.

그림으로 표현 해 봅니다.
이녀석은 포인터 박스입니다.
자신도 '사랑시 행복구 고백동 1055번지'라는 메모리 주소를 가지고 있고, 자신의 상자 속에는 다른 변수의 주소를 담고 있습니다.
다른 변수의 주소는 '솔로시 불행구 차임동 5043번지' 네요~


요것을 컴퓨터가 하는 것으로 바꿔보면?
int형 변수를 가리키는 포인터 ptrSolo는 0x50F3A32E번지에 할당이 되었고, 그 메모리 안에 0x305E438A라는 다른 변수의 주소값을 가지고 있네요.


포인터는 이렇게 다른 변수의 주소를 저장하고 있는 주소값을 가지는 변수라고 생각하시면 되겠습니다~

자.. 그럼 포인터가 왜 필요한가??
그것은 다음에 함수라는 녀석과 함께 알게 되실거예요~
일단 포인터의 개념이 이해될 때 까지 개념을 충실히 알아두시길 바랍니다^^*

이렇게 이론 설명을 마치고 그럼 다음 번에는 직접 간단히 몇줄 코딩으로 실습 해보도록 할게요~ ^0^




by yagom

twitter :@yagomsoft

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

RSS Feed 받기   


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

저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

C <12>. 함수  (4) 2012.04.02
C <11>. 포인터 (2)간단실습  (0) 2012.03.27
C <10>. 포인터 (1)개념잡기  (3) 2012.03.23
C <9>. 반복문(2) do-while  (7) 2012.02.06
C <8>. 조건문(3) 3항 연산자  (7) 2012.01.28
C <7>. 조건문(2) switch  (6) 2011.12.14
Posted by yagom

C <9>. 반복문(2) do-while

C 2012.02.06 12:30

오늘의 주제

1. do-while 반복문 
2. 단항연산자와 괄호 



아홉번째 시간입니다.^^

이제까지 반복문과 조건문에 대해 조금 알아보았는데요, 오늘은 반복문 중에 do-while이라는 녀석에 대해서 잠시 알아보도록 할게요~
더불어서 쪼끔 골치아픈 녀석도 함께 알아봅니다~
스따뚜~~~~~~~~~~~~


# do-while

일단 뭐 항상 그렇듯이 코드를 한 번 입력해 봅니다^^
코드 설명은 아래에서~


일단 실행시키지 마세요!!

do-while 반복문은

do {

일단 실행할 조건

} while ( 다음번 실행 조건 );

이렇게 작성합니다. 

일단 먼저 실행 하라(do) 어떠한 조건이 나올 때까지(while) 이거 겠죠?ㅎㅎ

즉, 중괄호 {} 안에 있는 내용은 일단 do-while 반복문이 시작됨과 동시에 실행이 됩니다.

그 후에 while의 괄호 () 안에 있는 조건을 확인 한 후 조건이 성립되면 계속 do의 중괄호 안의 내용을 실행하고, 조건에 맞지 않다면 반복을 종료합니다.

이제 이 정도면 이해가 되시려나요?

# 단항연산자와 괄호
 

그런데 저렇게 왜 여러개를 제가 만들어 놓았을까요?
자세히 보시면 조금씩 다르다는 것을 알게 되실텐데요~
단항연산자들이 각각 다른 위치에, 다른 모양으로 입력되어 있죠?ㅎ

위에서 do-while문의 특징은 설명드렸으니, 저 반복문들이 실행될때, printf로 i가 몇까지 찍혔을 때 반복문이 종료될지 알아맞혀 보시기 바랍니다 ㅎㅎㅎ

제가 일일히 설명해 드리지 않겠습니다. 직접 생각해보고 추리해보고 맞혀보아야 실력이 금새 늘어납니다!!
귀찮아서 그런게 아녜요 ㅎ
물론 답은 저 아래에 올려드릴게예요.

잘 생각해 보시고 실행시켜 보시기 바랍니다.^^

생각하다가 모르는 부분이 있다면 검색보다는 책을 한 번 찾아보시길 추천드리구요, 책이 없다면 검색을 통해 생각을 정리해 보시길 바랍니다.^^

답은 저 쪼 아래~

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
답!!!!!!!!! 은 더 아래에 ㅋㅋㅋㅋㅋㅋㅋ
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.


 


자, 예상과 다 맞나요?
물론 아닐수도 있습니다. 특히 맨 아래꺼! ㅎㅎㅎ
왜 그런지는 책 또는 인터넷에서 연산자 우선순위에 대해 알아보시면 될 것 같네요^^

혹시나 요청하시는 분이 계시다면 연산자 우선순위에 대해서도 알아보겠습니다!

아직은 아무도 뭐 요청같은거를 안하셔서요 으하하하 (웃는게 웃는게 아니야~)

그럼 이만 뿅~!  



by yagom

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓
저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

C <11>. 포인터 (2)간단실습  (0) 2012.03.27
C <10>. 포인터 (1)개념잡기  (3) 2012.03.23
C <9>. 반복문(2) do-while  (7) 2012.02.06
C <8>. 조건문(3) 3항 연산자  (7) 2012.01.28
C <7>. 조건문(2) switch  (6) 2011.12.14
C <6>. 조건문(1), if, else  (6) 2011.12.11
Posted by yagom

오늘의 주제

1. 3항 연산자 


여덟 번째 시간입니다.^^

오랜만에 뵙겠습니다!
블로그를 잠시 쓰지 못했습니다..ㅠㅠ
계속해서 조건문에 대해 알아보고 있는데, 잘 보고 계신지 모르겠습니다...^^
이번이 조건문에 마지막 내용입니다~

자 그럼 긴말 없이 시작~~~~~~~~


# 3항? 연산자?

말 그대로 항이 3개인 연산자 입니다.

( 조건 ? 참일 때의 값 :  거짓일 때의 값 )

이런식으로 쓰게 됩니다.

감 안오시죠?ㅋㅋㅋ 당연합니다~

간단히 예를 들겠습니다.

max = ( 1>2 ? 1 : 2) ;

한국말로 차근차근 풀어서 말씀드리겠습니다.

'1이 2보다 큰가? 이것이 참이라면 1을 max에 넣고, 이것이 거짓이라면 2를 max에 넣어라' 입니다.

또 하나더...

printf( "%d" , ( a>b ? a : b ) );

a가 b보다 큰가? 그렇다면 a를 출력하고, 아니라면 b를 출력하라.

자...

백마디 말보다 직접 해보시면 되겠죠?ㅋ

저번까지 쓰던 프로젝트를 다시 열어서 몇 줄 추가해 봅니다~



자... 이제까지 잘 따라오셨으면 이해 하셔야 합니다잉~

%c는 문자형 char를 출력하는 녀석이라는 것은 알고 계시죠?

잘 이해 안가시면 C <3>. 변수. Variable를 참고하시길 바랍니다..ㅋㅋ

자 결과 화면 입니다~

 
그럼 조건문은 여기서 끗!!! 

의문사항이나 궁금하신 사항은 댓글 남겨주세용^^*

by yagom

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓
저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

C <10>. 포인터 (1)개념잡기  (3) 2012.03.23
C <9>. 반복문(2) do-while  (7) 2012.02.06
C <8>. 조건문(3) 3항 연산자  (7) 2012.01.28
C <7>. 조건문(2) switch  (6) 2011.12.14
C <6>. 조건문(1), if, else  (6) 2011.12.11
C <5>. 반복문(1), 단항 연산자  (2) 2011.12.08
Posted by yagom

C <7>. 조건문(2) switch

C 2011.12.14 13:40

오늘의 주제

1. switch문 사용해 보기

일곱 번째 시간입니다.^^

지난 번에는 if 조건문에 대해 알아보았습니다.
이번에는 또다른 조건문인 switch문에 대해 알아보도록 할게요 ㅎ

스따뚜~~~~~~~~~~~~


# switch

자, 일단 만들어 봅시다. 지난번 if문 할 때 만들어 놓았던 프로젝트를 열어 봅시다.
이번에는 switchNumbers() 라는 함수를 만들거예요.
빨간네모를 따라 코드를 작성해 봅시다.ㅎㅎ


위의 코드의 실행 결과 화면입니다.


switch문의 작성법은 이렇습니다.

switch(대상 변수)
{
    case 
정수 혹은 문자 :
           실행할 명령문
           break;
    case 
정수 혹은 문자 :
           실행할 명령문
           break;
    case 정수 혹은 문자 :
           실행할 명령문
           break;
    default :
           실행할 명령문
           break;  
}


자, switch문은 주로 정수형의 변수가 어느 특정 조건을 만족하는지 검사할 때 쓰입니다.

if문과 다른 점은 크거나 작다에 대한 비교를 하기 보다는, 딱 어떤 변수가 어떤 수일때 실행. 을 목표로 하는 조건문입니다.

눈치 채신 분들도 계시겠지만, case 안에 해당되는 수가 없으면 default에 있는 명령어를 실행합니다.

그리고 모든 case아래에 break 명령어가 있는 것이 보이실 텐데요, break문이 없으면 아래에 있는 모든 것들을 다 실행하라는 의미로 받아들여집니다.

한 번 break 없애고 실행해 보세요 ㅎㅎㅎ 어떤 참사하 일어나는지..^^

위의 코드에서는 i가 어떤 수인지 알아보는 코드가 되겠네요.

i가 5 또는 10 또는 17 중에 하나에 해당되면 거기에 맞는 명령이 실행될테구요, 만약 해당되는 것이 없으면 default에 있는 것을 실행합니다.

if조건문과 switch조건문의 특징을 잘 숙지하시고 알앚게 효율적으로 사용하시면 될 것 같습니다^^

사실 if문 보다 switch문의 사용법이나 규제가 좀 더 까다롭지만, if - else if - else if - else...를 한없이 늘어놓는 것 보다 훨씬 간편하게 사용하실 수도 있습니다.

즉, 때에 따라 적절히 ^^


by yagom

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓
저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

C <9>. 반복문(2) do-while  (7) 2012.02.06
C <8>. 조건문(3) 3항 연산자  (7) 2012.01.28
C <7>. 조건문(2) switch  (6) 2011.12.14
C <6>. 조건문(1), if, else  (6) 2011.12.11
C <5>. 반복문(1), 단항 연산자  (2) 2011.12.08
C <4>. 실수 표현 방법  (2) 2011.12.04
Posted by yagom

C <6>. 조건문(1), if, else

C 2011.12.11 12:25

오늘의 주제

1. if문 사용해 보기 

여섯 번째 시간입니다.^^

지난 번에는 반복문과 단항연산자에 대해 알아보았습니다.
연습은 잘 하고 계신지요?
정말 중요한 것이니 몇 번을 보고, 다른 싸이트를 검색하고, 직접 계속 둘러보면서 꼭 몸으로 익히도록 하세요~!

자 그럼 오늘은 조건문 중에서도 if문에 대해 알아보도록 할게요^^
스따뚜~~~~~~~~~~~~


# if, else

조건문에 해당하는 녀석들은 몇몇 있습니다만, 오늘은 if와 else를 사용하는 if문에 대해 조금 알아보도록 할게요 ㅎㅎ

자 프로젝트 하나 만들어 주시고~


이쁘게 코드를 작성해 봅시다 ㅎㅎㅎ


실행 결과입니다.


동작에 대해서는 대충 눈치 채셨지요?ㅎㅎㅎ
너무나 쉽습니다~

그런데 처음 보는 녀석이 있죠~

main함수 밖에 나가있는 녀석들이 생겼네요 ㅋㅋㅋ
이 녀석들을 우리는 '함수'라고 부릅니다. 함수는 나중에 더 많이 다루겠지만, 지금은 아~ 그런 녀석이구나 하고 아시면 됩니다.
다음 시간에도 이 함수라는 녀석을 하나 더 만들어 볼거지만요, 지금 단계에서는 별거 없습니다 ^^

똑같은 일을 하는 녀석들을 매번 복사 붙여넣기 하면 귀찮고 코드도 길어지잖아요 ㅎㅎㅎ
그래서 우리가 원하는 일을 해 줄 녀석들을 미리 만들어 놓고 필요할때 너 이거해! 이렇게 시키는게 함수예요~
아... 뭐 일단 대충 이렇게 알아두시구요 ㅎㅎ
코트를 지긋이 바라보시면 어떻게 만들고 쓰는지 감이 좀 오실거예요 ㅎㅎㅎ

if-else문을 사용하는 방법은

if (조건)
{
      조건이 성립하면 실행한 후 아래 else if 나 else를 무시하고 그 아래로 이동
}

else if(조건)
{
     만약에 위에서 조건이 맞지 않았다면 실행 후 아래 있는 것 무시하고 if문 탈출
}
 
else
{
     위의 조건들이 모두 충족되지 않았을 때 실행
}


이렇게 사용하게 되는데요 if는 if 단독적으로 사용할 수도 있고, 위에 처럼 else if 또는 else와 짝을 이뤄 사용할 수도 있습니다.

즉, if는 혼자만 존재할 수도 있습니다.

....
if(조건)
{
   실행 코드
}
...
이런식으로 작성해도 무방합니다.

하지만 else if나 else는 위에 if가 존재해야지만 사용할 수 있죠^^ 상식적으로도 그게 맞겠죠?ㅎㅎㅎ

또한 if문 안의 실행할 내용이 한 줄 뿐이라면

if (조건)  실행할 한 줄

이런식으로 작성해도 무관합니다만, 코드의 가독성을 위해서 대괄호 {}를 이용하여 표시해 주는 것이 더 바람직 합니다^^

또, 위에서 보면 조건 중에 i == j 와 같은 녀석이 있는데요, i = j 라고 표현하면 j의 값을 i에 복사하라는 의미이기 때문에 i == j 라고 표현하여 i가 j와 같은가에 대한 조건을 만들어 주는 것입니다.

참고로, i = j 는 대입연산자라고 부릅니다.

이정도로 설명이 되었을런지는 모르겠습니다.

잘 이해가 되지 않는 부분은 댓글로 질문 주세요^^

by yagom

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓
저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

C <8>. 조건문(3) 3항 연산자  (7) 2012.01.28
C <7>. 조건문(2) switch  (6) 2011.12.14
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
Posted by yagom

오늘의 주제

1. for문 
2. while문 

2. 단항 연산자 



다섯 번째 시간입니다.^^

지난 번에는 실수 표현방법을 알아보았습니다.
깨알같지만 은근 자주 쓰이고 중요한 녀석일겁니다 ㅎㅎㅎ

자 그럼 잔소리는 이제 생략하고 오늘은 반복문을 살짝 보도록 하겠습니다^^
일단 반복문의 종류는 for, while, do while등등 몇가지가 있는데 오늘은 for문과 while문 두 가지를 해 볼게요 ㅎㅎ
반복문은 세 번에 걸쳐서 포스팅 할 예정입니다. 물론 연달아 하지는 않습니다^^

조건문도 두 번에 할거예요 ㅎㅎㅎ
스따뚜~~~~~~~~~~~~


# 반복문이란?


반복문은 말 그대로 반복문입니다.
어느 조건이 충족이 된다면 계속 계속 끝까지 돕니다 ㅋㅋㅋ
심지어 어느 조건이 계속 충족되지 않는다면 멈추지 않습니다.
설명은 끗!


자, 일단 새로운 프로젝트를 생성해 봅시다.


오해하시는 분들이 가끔 계신데, 꼭 Xcode 사용하실 필요 전혀 없습니다 ㅎㅎㅎ
그냥 제가 사용하는 툴이기 때문에 이거 쓰는거구요, Visual Studio를 쓰던지, TurboC를 쓰던지 아무 상관없습니다.ㅎㅎ


# for

자, 메인함수 안에 이렇게 작성을 해 줍니다.

 
일단 처음에 선언해준 i는 반복문에서 어떤 조건을 만들어 주기 위해서는 유동적인 변수가 필요하기 때문에 하나 만들어 준거예요.ㅎ
일단 i를 선언해 준 후, 쭈욱 작성해 봅시다.
for문의 작성요령은 이렇습니다.

for ( 변수 초기화 ; 조건 ; 한바퀴 후 진행할 작업) 
{
   반복문 동안 실행될 내용...
}

자 이런식으로 작성을 합니다.
세미콜론 양옆으로 세 개의 무언가가 들어가죠?
사실 전부 다 작성하지 않아도 무관합니다.
하지만, 작성하지 않는다면 설정된 조건이 없기 때문에 반복문이 무한정으로 돌거예요 ㅎㅎㅎ

첫 번째 변수 초기화는 for문이 처음 시작하는 때 한 번만 실행됩니다.
즉, i=0이라는 것을 넣었을 때 이것은 딱 for문 처음 들어왔을때만 0으로 초기화 된다는 말이예요 ㅎ

그리고 두 번째 조건은 for문이 실행될 조건을 명시하는거예요. i<5라고 작성하였으면 i가 5보다 작으면 이 for문을 실행하여라 라고 말하는 것이죠.

세 번째 한바퀴 후 진행할 작업은 말 그대로 for문이 실행될 내용들을 쭈욱 실행 한 후 다시 조건을 검사하기 전에 진행할 작업을 말합니다.

다시 정리해보면

코드에서 for문을 똻!!!!!!!!!! 마주쳤다!!!!!! 그럼 컴퓨터가 동작하는 순서는

변수 초기화 - 조건 체크 - 반복문 내용 실행 - 한바퀴 후 진행작업 진행 - 조건 체크 - (조건이 충족되면)반복문 내용 실행 - 한바퀴 후 진행 작업 - 조건체크 - (조건이 충족되지 않으면)for문 탈출

이해되시나요?

뭐 말은 필요없죠...ㅋㅋ 코드를 실행해 봅시다.


자... 코드는 각자 다 다른데 실행 결과는 똑같죠?ㅎ
코드 작성법은 다 자기 스타일 입니다 ㅎㅎ
자... 그런데 여기서 의문이 하나 생기셔야 할텐데요...ㅋㅋㅋ
음... 맞춰볼까요?
i++은 뭐고 ++i는 뭐지??? 그리고 i++이 printf안에 들어가 있는데 이건 도대체 뭐지?ㅋㅋㅋ

자... 요 밑에 설명해드릴게요~

# while


자, while문입니다.
 
while문의 작성법은

while ( 조건 )
{
    실행될 내용....
}


요렇게 작성하시면 됩니다.

훨씬 간편하죠?ㅎㅎㅎ
간편한 만큼 불편한 점도 존재하죠^^
for문과 while문과 둘 중 하나 자신이 더 편한거 골라서 사용하시면 되겠습니다 ㅎㅎㅎ
물론 나중에 또 다른 반복문도 있어요 ㅎ

while의 동작과정을 보면

while을 똻!!!!!!!!!!!만나면!!!!!!!!!!

조건체크 - 실행 - 조건체크 - 실행 - 조건 안맞으면 탈출!!

뭐 이런 식입니다 ㅎㅎㅎ

자, 코드 작성하고 다 돌려 보셨나요? 그럼 이제 궁금증을 좀 풀어보는 시간을 가져볼까요?
사실 요 밑에꺼 안보고는 위에 코드 이해 못하실거예요...ㅎㅎ 대충 눈치 채신 분들도 계시겠지만요 ㅎ

자 그럼 내려가 봅시다~

# 단항 연산자

자, 뜬금없이 단항 연산자가 무엇이냐?

단항. 즉 항이 하나인 연산자 입니다.
실생활에선 없죠?ㅎ

실생활에선 이항연산자가 거의 대부분이니깐요 ^^
C에선 심지어 3항 연산자도 있어요 ㅎㅎㅎ
고거는 조건문 할때 같이 해드릴게요. 혹시 빼먹으면 말씀해주세요 ㅎㅎㅎ

위에서 썼던 i++은 단항연산자 입니다.
이항 연산자는 우리가 흔히 아는 +, -, *, / 등이예요. 이것은 필히 항이 두개가 필요하죠. 1+2 처럼 말예요.

다시 돌아와서 단항연산자는 두 가지가 있습니다. 변수의 앞에 붙는 것과 뒤에 붙는 것.
++i처럼 앞에 붙게되면, ++i가 속한 그 한 줄을 시작하기 전에 i에 1을 더해줍니다.
반대로 i++처럼 뒤에 붙게되면 i++이 속한 그 한줄을 끝낸 후 i에 1을 더해줍니다.
이해되시나요?

--i와 i--도 마찬가지 입니다.

자, 이렇게 설명을 해 드리면 코드가 조금씩 감이 오실까요?ㅎ

만약에 한 줄에 아무것도 작성하지 않고 i++;이라고 작성해도 i에 1이 더해지는 효과를 봅니다.
반대로 ++i;해도 결과는 똑같죠. 왜냐면 그 한 줄에서 i++이나 ++i가 처음이자 마지막이니까요 ㅎ
즉, i=i+1을 귀찮게 안하려고 요런식으로 표현하기도 합니다. 또 i=i+1을  i+=1이라고 표현하기도 합니다.
i=i-1을 i-=1이라고도 표현하구요...ㅎㅎ

궁금한 점이 있으시면 언제든지 질문 주세요~! ^^

by yagom

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

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓
저작자 표시 비영리 변경 금지
신고

'C' 카테고리의 다른 글

C <7>. 조건문(2) switch  (6) 2011.12.14
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)  (2) 2011.11.29
Posted by yagom

C <4>. 실수 표현 방법

C 2011.12.04 13:00


오늘의 주제


1. 실수 표현 방법


네 번째 시간입니다.

이번에는 사실 그다지 중요하지 않은 포스팅입니다.
그냥 해보는 깨알같은 팁!?ㅋㅋㅋ
서론 필요 없고 실습 시작입니다~!

# 실수 표현 방법

일단 새로운 프로젝트를 만들고 아래와 같은 코드를 입력하여 봅니다.


결과 출력 화면입니다.


간단하게 코드를 설명하자면...

일단 printf안에 %%라고 표현 한것은 로그에 %가 찍히게 하기 위함입니다...
뭐~ 그냥 그렇다구요 ㅎㅎ

%lf는 double형 실수를 표현하기 위한 출력 형식 지정자라는 것은 알고 계시죠?ㅎㅎ
그냥 %lf하면 컴파일러나 프로세서마다 다르겠지만 3532.0483940000... 이런식으로 대책없이 나오는 것이 보통입니다. 
그래서 좀 더 깔끔하게 출력을 하고 싶으신 분들이 있으실 겁니다.

%.3lf 라고 해주면 소수점 3자리 까지만 출력하라는 의미입니다.

마찬가지로 %.9lf해주면 소수점 9자리까지 출력하라는 의미입니다. 당연히 자리수가 없으면 나머지 자리에 0을 채워넣고 출력해주죠.

%10.3lf의 뜻은 총 10개의 칸에 표현하되 소수점은 3자리만 표현하라는 의미입니다. 물론 점(.)도 한 칸을 차지합니다. 다시 쉽게 설명하면 정수자리 6개와 소수자리 3개를 표현 할 때 이런식으로 작성하여 줍니다.

하지만 %3.3lf와 같이 부족한 칸 안에 표현하라고 하면 무시하고 그냥 원래대로 표기해 버립니다.

%10lf 하게되면 총 10개의 칸에 수를 표현하라는 의미입니다. 하지만 입력되어있는 숫자가 정수자리 4자리 + 점 1자리 + 소수자리 6자리 = 총 11자리 이기 때문에 10칸을 초과하죠? 그래서 그냥 무시하고 출력해 버립니다. 

하지만 %15lf하면 총 11자리 중에 4칸이 남기 때문에 좌측에 공백을 4칸 남기고 출력을 해 줍니다.

%-15lf 하면  총 15칸을 쓰지만 좌측정렬을 하라는 의미입니다.

%+15lf는 의미가 없습니다... 이상한 출력이 되지요?ㅎ 기본적으로 우측 정렬로 되어있기 때문에 의미 없는 표현이 되겠습니다..^^

별 의미 없어보이지만, 나름 팁이라고 생각하고 한 번 쯤 봐두시는 것도 나쁘지 않으실거예요^^

참, double형 뿐만 아니라 float형에서도 lf만 f로 바꿔서 해보시면 됩니다.ㅎ

이상 깨알같은 팁 포스팅이었습니다~!

다음에 뵈어요^^

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)  (2) 2011.11.29
C <1>. Hello, World!  (9) 2011.11.25
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)  (2) 2011.11.29
C <1>. Hello, World!  (9) 2011.11.25
Posted by yagom


티스토리 툴바