오늘의 주제

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. ModalViewController 사용하기 



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

정말 오랜만의 포스팅입니다.ㅠㅠ
일단 감격의 눙물을 좀 닦고..ㅠ

요즘 제가 서식지를 좀 옮기기도 했고 이런저런 일들이 많이 겹쳐서 이제서야 짬을내 포스팅을 하네요ㅠ_ㅠ

맥북도 재구매 하였습니다 !

그럼 사설은 여기까지..ㅋㅋ

지난 번에는 addSubview:, removeFromSuperview, setHidden 등을 알아보았습니다.
개념이해는 잘 되셨는지요?
위에 메소드들은 개발문서를 보면 아시겠지만 view를 떼었다 붙였다 없앴다 보였다 하면서 화면을 바꿔줄 수 있는 녀석들입니다.

하지만 이번에는 view controller를 인자로 받아서 처리하는 메소드들을 다뤄봅니다.

물론 개념이 확립되어 계신 분들이라면 view controller자체는 화면에 보이지 않는다는 사실은 알고 계시겠지요? ^^*
어찌되었든 화면에는 view controller 안에 속해있는 view가 보이는 것이지요.

이해가 안되시면 이전 포스팅 :
2011/11/15 - [iOS Dev/함께해보기] - iOS개발하기 #7. 화면구조, Cocoa Touch Objects (2) 을 참고하세요~

자, 출발해 볼까요?ㅎ


# 네비게이션 컨트롤러 생성

자 지난번에 사용했던 프로젝트를 그대로 사용 합니다~

일단 두번째 탭의 화면을 네비게이션 컨트롤러 화면으로 바꿔 보겠습니다.

말이 좀 애매하긴 한데요, 일단 해봅시다^^

AppDelegate 구현파일로 가 봅니다.

우린 Second탭의 화면을 네비게이션 화면으로 바꿔주려 하는 것입니다.
아래 코드를 보면 viewController1과 viewController2가 생성되고 탭바 컨트롤러의 viewControllers에 세팅이 되고 있는것을 볼 수 있습니다.
자, 그럼 우리가 바꿔줘야겠죠? 

[##_http://blog.yagom.net/script/powerEditor/pages/1C%7Ccfile27.uf@121721474F60C3A406BA43.png%7Cwidth=%22824%22%20height=%22547%22%20alt=%22%22%20filename=%221.png%22%20filemime=%22image/jpeg%22%7C_##]
아래와 같이 코드를 살짝 바꿔줘 봅니다.
우리는 네비게이션 컨트롤러 myNaviViewController를 생성해서 viewController를 rootViewController로 설정하여 초기화 했습니다.
그 후에 viewController2대신에 탭바컨트롤러의 뷰컨트롤러에 넣어줍니다. 


실행서 보면 짜잔~~~~~~
네비게이션 컨트롤러가 대신 들어갔습니다.
어떻게 아냐구요? 파란 막대가 생겼죠?
근데 이게 네비게이션 컨트롤러가 생긴거라고는 확신할 수는 없어요.
그럼 네비게이션 컨트롤러의 동작을 확인해보면 확신할 수 있겠네요?
네~ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
 

[##_http://blog.yagom.net/script/powerEditor/pages/1C%7Ccfile10.uf@171721474F60C3A708BDF7.png%7Cwidth=%22396%22%20height=%22744%22%20alt=%22%22%20filename=%223.png%22%20filemime=%22image/jpeg%22%7C_##]
# push, pop viewcontroller 그리고 modal viewcontroller
 

자, 그럼 이제 동작을 하게 만들어 봅니다.
일단 SecondViewController.xib에 버튼 두 개를 올려놓고 이름을 이쁘게 넣어줍니다~


자, 그럼 버튼에 연결될 메소드를 생성해 줘야 하는데요, 저번에 소개해 드린바와 같이 이렇게도 생성이 가능합니다.
버튼에서부터 헤더파일의 interface내부에 오른쪽버튼(또는 컨트롤키)를 누른상태로 드래그 앤 드랍!!
그리고 Connection은 Action으로 해주시고, 이름은 이쁘게^^ 지금은 너무나 간단한 기능을 구현할 것이기 때문에 Arguments는 None으로 해줍니다. (Argument에 대한 자세한 설명은 다음에...^^)


헤더 파일에 보면 이렇게 이쁘게 정의되어있는 것을 확인할 수 있습니다.


게다가 구현파일에 와서 보면 거기에도 이쁘게 메소드가 만들어져 있습니다 ㅎㅎㅎ 아이 좋아~

그 속 안을 알차게 채워넣어 봅시다~^^


pushButtonClick메소드 안에는 임시 뷰 컨트롤러 하나를 생성해서 검은색 배경으로 설정을 해주어서 pushViewController 메소드를 실행합니다.
여기서 [self navigationController]는 이 SecondViewController를 컨트롤 해주는 네비게이션 컨트롤러를 뜻합니다.(우리 아까 AppDelegate에서 만들어 주었었죠?) 그녀석에서 새로운 뷰 컨트롤러를 집어넣겠다고 말해주는 겁니다. 

modalButtonClick메소드 안에는 네비게이션 컨트롤러를 이용한 것이 아닌 모달 뷰를 이용한 화면전환을 구현합니다.
모달 뷰가 뭐냐구요? 백이면 백 그냥 이따 실행해 보시면, 아~~~~~~~ 이거~~~~~~~ 하십니다.ㅋㅋㅋ
여기서는 약간 다른것이 아래 버튼을 코드로 구현해 놓은 부분인데요... 제가 뷰 컨트롤러 xib파일 하나를 더 만들기 귀찮아서 그런건 절대절대 아니구요..ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
그냥 버튼을 코드로 넣게되면 이렇게 넣는구나~~~ 그냥 한번 보시라고 넣어보았습니다. 암~ 그럼요~ 한번 쓰고 버릴 뷰 컨트롤러 xib파일 만들기 귀찮아서 그런거 절대 아녜요 ㅋㅋㅋ
여하튼 
presentModalViewController: animated: 메소드를 사용하여 모달뷰를 화면에 올릴 수 있습니다.
아래 버튼구현부에서 addTarget을 보시면 @selector안에 dismissModalViewControllerAnimated: 메소드가 들어가 있는 것을 보실 수 있습니다.
메소드 이름만 봐도 아~~~~~~~이게 뭐구나~~~~~~ 눈치 채셨길 빕니다. ㅋㅋㅋ

그럼 실행해 봅시다~

[##_http://blog.yagom.net/script/powerEditor/pages/1C%7Ccfile29.uf@1571B23D4F60C8153A8C3C.png%7Cwidth=%22396%22%20height=%22744%22%20alt=%22%22%20filename=%228.png%22%20filemime=%22image/jpeg%22%7C_##]
Modal 버튼을 눌렀을 때 Modal이 올라온 상태입니다.


Push버튼을 누르면 네비게이션 컨트롤러가 tempViewController 인스턴스 하나를 화면에 push합니다.
상단에 Second버튼은 Second 화면으로 pop 한다는 뜻이겠지요?ㅎ
화면을 push하면 pop해서 다시 뒤로 갈 수 있는 것입니다.
 


오늘 포스팅은 제가 쓰고도 뭐라고 횡설수설 했는지 모르겠습니다...

정말 정신없이 썼네요.

피곤해 죽겠어요ㅠㅠ

여튼 요거 개념 잘 해두시면 유용하실 거에요~

궁금한 것은 댓글 남겨주세요^^* 

어쩌면 생각보다 빨리 답변이 올라올지도 모르잖아요?ㅎㅎ


by yagom

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

RSS Feed 받기   


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

댓글을 달아 주세요

  1. Elian 2012.03.15 21:50  댓글주소  수정/삭제  댓글쓰기

    오늘 바빠서 못 보고 있다가 지금 딱! 들어오니 새 글이 딱!!

    잘 읽었습니다. 감사합니다 ^^

  2. Berry 2012.04.27 16:44  댓글주소  수정/삭제  댓글쓰기

    계속해서 강좌 잘 보고있습니다
    하나 궁금한게 생겼습니다!
    정말 간단한 부분일지도 모르겠지만
    PushButtonClick에서 검은색 바탕의 뷰를 생성하여서
    새로 뿌려주는것까진 알겠는데
    어느부분에서 Second라는 아이콘을 만들며 뒤로 돌아가는 기능을 하게하는지 이해가 잘 가지않습니다
    네비게이터를 설정하면 저절로 네비게이터바에서 처리해주는건가요 ?
    아니면 다른곳에 숨겨져 있는 기능인가요 설명좀 부탁드릴꼐요 !

    한가지만 더 질문 드릴꼐요
    버튼에 걸어둔 옵션(터치 업 인사이드 같은)을 해제시키려면 어떻게 해야하나요 ?
    혼자해보려다가 잘 안되서 급기야 버튼을 지우기까지 해봤는데 아직도 모르겠네요 ㅠㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.04.27 18:00 신고  댓글주소  수정/삭제

      1. 네비게이션 컨트롤러에서 자동으로 BackButton이 생성이 됩니다~^^ 물론 이 버튼도 커스터마이징 가능합니다.

      2. xib파일 안에서 말씀하시는 건가요? 아님 코드상에서 말씀하시는 건가요?
      음.. 위의 예제에서 본다면 xib에서 File's Owner 녀석을 우클릭 해보면 연결되어 있는 메소드 들이 나옵니다. 거기에 마우스를 올리면 옆쪽에 x표시가 생길거예요. 그녀석을 누르면 연결된 메소드가 해제 됩니다.

      위 예제상에서 해본 것은 아니지만 혹시나 해서 코드상에서 없애려면
      - (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
      메소드를 사용하시면 됩니다~^^

      충분히 설명이 되셨는지 모르겠네요..^^
      궁금하시면 언제든지 말씀해 주세요 ㅎ

    • Berry 2012.04.28 02:39  댓글주소  수정/삭제

      아하 그렇게 되는거였군요 ㅎㅎ
      친절한 설명 감사드립니다
      지금은 해볼수가 없고
      내일 아침에 바로 해보고
      안되는건 여쭤봐야겠네요 ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.04.30 09:56 신고  댓글주소  수정/삭제

      잘 해결 되셨는지 모르겠네요~^^
      또 들러주세요 ㅎ

    • Berry 2012.05.02 12:41  댓글주소  수정/삭제

      잘 해결되었습니다
      사정이 생겨 오늘에서야 해보는군요 ㅎㅎ
      오늘도 으쌰으쌰 힘을내며
      강좌 하나씩 밟아나가겠습니다 !
      좋은하루되세요 ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.05.02 13:12 신고  댓글주소  수정/삭제

      잘 해결되셨다니 정말 다행입니다~^^*
      좋은 하루 되시길~!

  3. 인절미후후 2012.05.21 15:00  댓글주소  수정/삭제  댓글쓰기

    이글에만 추천이 적네요 ㅎㅎ
    한 세번 넘어가는것 같은데 다시 볼수록 새로운 걸 알게 되는거 같아요 ㅎㅎ 잘보고 갑니다.

  4. 밤가시 2012.05.28 19:36  댓글주소  수정/삭제  댓글쓰기

    강좌 하나하나 정주행해서 실습해보고 있는데요..
    이 강좌에서 Close 버튼을 직접 구현한것 같이
    Push 버튼을 눌렀을때 tempView 의 Back 버튼도 구현해 보고 싶어서 아래와 같이 modal버튼에 있는 것을 약간 응용했습니다.

    UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [closeButton setFrame:CGRectMake(50.0f, 50.0f, 220.0f, 70.0f)];
    [closeButton addTarget:tempView action:@selector(popViewControllerAnimated:) forControlEvents:UIControlEventTouchUpInside];
    [closeButton setTitle:@"Back" forState:UIControlStateNormal];
    [tempView.view addSubview:closeButton];

    push 했으니깐 버튼 눌렀을때 Pop 해야 할것 같아서 selector의 action 을 저렇게 지정하였는데
    계속 에러를 내면서 죽어버리네요.
    어떻게 구현해야 하나요?? ^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.05.28 23:44 신고  댓글주소  수정/삭제

      ^^* 질문주셔서 고맙습니다~!
      이미 해결하셨을지 모르겠지만 버튼의 타겟이 잘못되었네요~!
      해당 메소드의 타겟은 뷰 컨트롤러가 아니라 그 뷰 컨트롤러를 컨트롤하는 네비게이션 컨트롤러 입니다.
      그러므로 타켓에 네비게이션 컨트롤러가 들어가야 맞습니다.^^*

  5. Favicon of http://www.freeism.co.kr BlogIcon freeism 2012.06.05 11:25  댓글주소  수정/삭제  댓글쓰기

    버튼 이벤트 생성할 때, 계속 오류가 나서 봤더니..

    - (IBAction)pushButtonClick: (id)sender;
    - (IBAction)modalButtonClick: (id)sender;

    로 해주면 정상적으로 동작하네요. xcode 버전 문제일지도 모르겠네요^^

  6. 궁금궁금 ~~ 2012.06.12 17:57  댓글주소  수정/삭제  댓글쓰기

    xcode 쌩초보 입니다 이렇게 저렇게 이해해보면서 따라하고 있는데
    modal버튼을 누르면 아래와 같은 에러와 함께 어플이 죽어 버리네요
    2012-06-12 17:50:51.263 ChangeViews[6215:f803] -[SecondViewController ModalBtnClick]: unrecognized selector sent to instance 0x688d680
    2012-06-12 17:50:51.325 ChangeViews[6215:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SecondViewController ModalBtnClick]: unrecognized selector sent to instance 0x688d680'
    어떤점이 잘못 된 걸까요 몇번이나 봐도 소스는 똑같은데..ㅜㅜ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.12 18:44 신고  댓글주소  수정/삭제

      SecondViewController.h에서
      - (IBAction)pushButtonClick:(id)sender;
      - (IBAction)modalButtonClick:(id)sender;

      SecondViewController.m 에서도
      - (IBAction)pushButtonClick:(id)sender;
      - (IBAction)modalButtonClick:(id)sender;
      로 변경해 주시구요...ㅎ

      만약에 그렇게 해도 되지 않으면... 처음부터 다시...^^; 는 농담이구요 ㅋ

      SecondViewController.xib 파일에서 File's Owner를 오른쪽 클릭한 후에 버튼에 연결되어있는 액션을 없애주시고 다시 한 번 연결해 보시기 바랍니다.

      혹시 안되면 다시 댓글주세요^^;

  7. 컴맹 2012.08.24 01:02  댓글주소  수정/삭제  댓글쓰기

    전 운이 좋은지 에러 없이 잘되네요 ㅎㅎ (잘 되도 불안하군요)
    다음 강좌인 map view 를 하려고 하는데 이번강좌의 소스를 사용한다고 해서 복습할겸 다시 와서 보고 갑니다~~
    덕분에 더 잘 알게 되었네요 ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.08.24 10:02 신고  댓글주소  수정/삭제

      안녕하세요 컴맹님~
      ㅎㅎ 잘 되도 불안한 것은 정말 좋은자세입니다 ㅎㅎㅎ
      언제 어디서 버그가 튀어나올지 모르니 항상 확인하고 또 확인해 봐야겠지요 ㅎㅎㅎ
      찾아주시고 덧글 주셔서 정말 고맙습니다:)
      또 놀러오세용 ㅎㅎ

  8. chosamong 2012.08.26 13:58  댓글주소  수정/삭제  댓글쓰기

    정말 정말 감사합니다.
    강좌를 차근차근 따라가면 정말 정말 기본기 튼튼한 자신을 보게 될 것 같은 기대감 ~ ^^;

    그런데 저는 왜 IB화면과 코드화면 나누기가 상하로만 되지요 ?
    야곰샘처럼 좌우로 놓고 싶은데 어떻게 하는지 모르겠어요.

    강좌는 진짜로 정말로 감사합니다. 꾸우벅 <(__)>

  9. 꾸앵 2012.10.11 11:46  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    ios 입문 3일차 초보 개발자입니다.
    현재 xcode 4.0 버전을 쓰고 있고 ios application 에서 windows-based application 으로 프로젝트 생성후

    탭바를 만들었습니다.
    4개의 탭 중에 3번째 탭에 모달뷰를 띄워서 로그인창을 넣고 로그인이 되면 모달뷰를 내리는 방법으로 프로젝트를 진행하려 하고있습니다.
    헌재 탭바 아이템번호를 찾아서 해당 번호일때는 모달뷰를 띄우게 코딩진행중인데
    모달버튼 클릭시 실행되는 코드를 그쪽으로 옮겼습니다
    헌데 self presentModalViewcontroller:tempViewCon animated:YES 에 노란줄이 가 있습니다.

    모달뷰를 만들고 쓰지 않았다는거 같은데 왜 그런걸까요...
    ios입문 3일차라... 모르는게 너무 많아요 ㅠ

    버전마다 너무 틀려서 강의를 봐도 다른게 많고...
    view-based windows-based 스토리 보드.. 당최 내가 할려는걸 어떤걸로 해야하는지도 모르겠고 ㅠㅠ
    @_@

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.10.11 17:32 신고  댓글주소  수정/삭제

      안녕하세요 꾸엥님 :)
      블로그를 방문해 주셔서 정말 고맙습니다.

      사용하신 메소드는 iOS6에서 사라진 메소드이기 때문에 경고가 뜨는 것 같습니다.

      iOS가 변경됨에따라 사라지거나 생기는 메소드들이 있습니다. 그 중에 하나라서 iOS6 이전에서는 동작하지만 iOS6부터는 동작하지 않습니다.

      http://winplz.tistory.com/entry/xCode-45-for-iOS-60-%EB%8B%AC%EB%9D%BC%EC%A7%84-%EC%A0%90

      이 포스팅을 참고해 보시면 도움이 될 것 같습니다 ^^*

    • 초보자99 2012.12.09 18:06  댓글주소  수정/삭제

      저도 같은 증세인데 링크 참고해도 어떻게 해결해야될지 모르겠습니다
      ㅠㅠ 솔루션을 제공해주시면 좋겠습니다.
      ------------------
      아 그래서
      [self presentViewController:tempViewCon animated:YES completion:nil];
      이렇게 수정했습니다. 따로 빨간글자나 노란글자는 보이지않습니다만, 괜찮은걸까요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.12.09 22:19 신고  댓글주소  수정/삭제

      네~ 맞습니다:)

  10. kimsdn 2012.11.25 06:04  댓글주소  수정/삭제  댓글쓰기

    복습중인데.. 한가지 질문드릴께요

    닫기버튼을 하드코딩 하지않고 xib파일에서 직접 만들고 붙일경우

    액션을 어떻게 줘야하나요??

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.25 20:12 신고  댓글주소  수정/삭제

      지금 올라온 모달뷰 같은 경우는 컨트롤러 자체도 코딩으로 만들어 줬기 때문에 버튼도 코딩해 준것이구요, 만약에 뷰컨트롤러 자체는 xib로 만들게 되면 위쪽의 2,3번 캡쳐 화면과 같이 연결해 주시면 됩니다.
      물론 버튼을 따로 빈 xib파일에 넣어서 하는 방법도 있지만, 보통 그런방법은 매우 귀찮아지고 머리아파지고 잘 사용하지 않기 때문에 생략하도록 하겠습니다..^^;

  11. hyung 2012.12.07 09:42  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님! 질문하나 드리겠습니다.

    저는 지금 UIViewController -> UITableViewController로 pushViewController 하고 싶은데 어제부터 잘 안되네요 ㅠㅠ

    저기 델리게이트 선언부분에
    sel.tabBarController들어간 부분 있잖아요..?
    아마 그쪽을 잘못 선언 해준거 같은데
    탭바가 아닌 경우는 뭐라고 해줘야 할까요?

  12. 헌트리스 2012.12.07 10:33  댓글주소  수정/삭제  댓글쓰기

    초보 질문입니다!!

    modalClickButton 만들 때,

    클릭버튼을 하면 새로운 모달창이 뜨는 거라고 생각하면 되죠?

    modal 이라는 개념이, 새로운 UIViewController 창을 띄우는 것인가요?

    push 와 modal 의 용어 정의 차이를 잘 모르겠습니다 ㅠ


    그리고,

    presentModalView... 이 명령어가 안먹힌다고 하여

    [self presentViewController:(UIViewController *)tempViewcon animated:YES completion:nil];

    로 수정하였습니다. 그런데 닫는 부분에서

    [closeButton addTarget:tempViewCon action:@selector(dismissViewControllerAnimated:YES completion:nil) forControlEvents:UIControlEventTouchUpInside];

    로 적었는데 에러가 나는군요 ㅠ 이 부분 수정을 어떻게 해야 하나요~?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.12.07 19:30 신고  댓글주소  수정/삭제

      [closeButton addTarget:tempViewCon action:@selector(dismissViewControllerAnimated: completion:) forControlEvents:UIControlEventTouchUpInside];

      으로 해보세요:)

  13. Aldo 2012.12.17 12:32  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, 너무고맙게 잘 보고 배우고있어요~^^
    질문 하나 할개요, 질문같지도 않은 질문이겠지만...
    첫번째로 올리신 이미지에서, 빨간상자 안의 아랫부분에

    self.tabBarController.viewControllers = [NSArray arrayWithObject:viewController1, myNavyViewController????, nil];

    ????여기에 들어가는 문자가 대체 뭐에요?? 1도 아니고 l도 아니고 !도 아니고, ...
    제가 사정상 아이패드로 게시글을 보는데, 해상도가 안따라줘서 저 문자를 제대로 못보여주는지도 모르겠지만...
    암튼, 모르겠어요 뭔글씨인지ㅠㅠ

  14. 김민국 2013.01.30 19:32  댓글주소  수정/삭제  댓글쓰기

    좋은강좌보고 열심히 공부하고있습니다!
    너무감사해요!^^

    질문하나 드릴게요 ㅎㅎ

    - (IBAction)pushButtonClick {

    UIViewController *tempViewCon = [[UIViewController alloc] init];
    [tempViewCon.view setBackgroundColor:[UIColor blackColor]];
    [[self navigationController] pushViewController:tempViewCon animated:YES];
    }

    여기서 self navigationController 이부분에서 네비게이션 객체가 있는데
    AppDelegate에서 secondViewController를 네비게이션컨트롤러에다가 추가해줬자나요

    이부분때문에
    세컨드뷰컨트롤러 객체에 네비게이션 객체가 있는건가요???

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.01.31 20:34 신고  댓글주소  수정/삭제

      어떤 뷰 컨트롤러 객체가 네비게이션 컨트롤러에 push되면 자동으로 그 객체의 네비게이션 컨트롤러 프로퍼티에 등록되게 됩니다 ㅎ

  15. 퐝칭칭 2013.03.28 15:52  댓글주소  수정/삭제  댓글쓰기

    이번 강좌도 잘보고갑니다 ^^ 추천꾸욱~
    근데 저는 modal view 화면에서 버튼안에 close 텍스트가 안뜨네요
    디버깅 과정에서

    경고 메시지 : 'presentModalViewController.animated:'is deprecated: first deprecated in iOS 6.0

    이렇게 뜨고요 이거 버전문제 때문인가요 ?
    아님 버전이랑 관계없이 다른문제 인가요 ?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.03.29 03:26 신고  댓글주소  수정/삭제

      덧글 고맙습니다 :)

      버튼 안에 글씨가 나오지 않는 것은 버전에 큰 관계가 없을거예요.

      혹여 오타가 있나 유심히 살펴보세요~

      경고메세지가 출력되는 이유는 iOS 6.0 부터 사라진 메소드를 호출했기 때문입니다.

      [self presentViewController:tempViewCon animated:YES completion:^(){}]; 으로 작성해보시면 경고문구가 없어질 거예요..ㅎ

      그리고 버튼또한 dismissModalViewControllerAnimated: 가 아니라

      dismissViewControllerAnimated:completion: 으로 바꿔서 넣어보세요~

  16. Hide 2013.11.11 21:36  댓글주소  수정/삭제  댓글쓰기

    감사합니다.


오늘의 주제


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 받기  


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

Posted by yagom

댓글을 달아 주세요

  1. Sio 2012.07.11 15:08  댓글주소  수정/삭제  댓글쓰기

    실수 표현할때 많이 버벅였는데 도움이 됬습니다~~~*^^*
    잘보고갑니다~!

  2. chosamong 2012.08.24 20:40  댓글주소  수정/삭제  댓글쓰기

    지금은 절대 기억 못하는
    까마득한 옛날의 기억
    다시 돼 새겨 보네요

    실력이 마구 업그레이드 되면 바로 써먹을 가르침 ^^
    횡설수설 되네요

    캄사. 꾸우벅


오늘의 주제


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

댓글을 달아 주세요

  1. hun 2012.04.05 16:23  댓글주소  수정/삭제  댓글쓰기

    아..마지막 쯤 한줄때문에 댓글을 안 달수가 없네요..

    폭풍 댓글 질문 ㅜㅜ 화이팅이에요!!^^

  2. 네모누리 2012.07.16 18:37  댓글주소  수정/삭제  댓글쓰기

    많은 도움이 되었습니다. 감사합니다

  3. 감사 2012.07.17 02:25  댓글주소  수정/삭제  댓글쓰기

    감사합니다 덕분에 공부 잘 되었어요

  4. 2012.07.31 14:12  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  5. chosamong 2012.08.24 20:33  댓글주소  수정/삭제  댓글쓰기

    여기도 촉풍 댓글
    폭 (폰에서 글쓰니 수정 어렵~)

    여기저기 캄사 <(__)>

  6. chosamong 2012.08.25 12:02  댓글주소  수정/삭제  댓글쓰기

    스트링형 선언과 쓰는 것은 없네요.
    게으른 학생 한번에 보고 시포서 ㅎ

    좀 무례한 댓글 용서를 ... OTL

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.08.27 00:57 신고  댓글주소  수정/삭제

      NSString *string = [[NSString alloc] initWithString:@"String입니다"];
      라고 사용하시면 되겠네용..ㅎㅎㅎ
      NSString *abc = @"abc";
      라고 사용하셔도 됩니다 ㅎㅎ

  7. leahtree 2012.11.20 02:07  댓글주소  수정/삭제  댓글쓰기

    아직도 변수라는 개념이 어플리케이션을 만들때 구체적으로 어떻게 쓰이는건지 이해가 되지 않습니다..ㅠ
    변수에대한 개념은 이해가 되는데요 어떻게 활용되는건지 감이 잡히지 않으니 답답해서 이렇게 글 남깁니다!

    정말 잘 읽고 있습니다! 감사해요 :)

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.20 09:19 신고  댓글주소  수정/삭제

      음... 앞으로 하다보면 아주 쉴 새 없이 쓰게 되실테니 너무 걱정하지 않으셔도 될거예요^^
      아주 자연스럽게 체득하게 되실겁니다 ㅎ

  8. leahtree 2012.11.24 00:04  댓글주소  수정/삭제  댓글쓰기

    감사합니다 :)

  9. hyung 2012.11.29 09:23  댓글주소  수정/삭제  댓글쓰기

    개념 다시한번 정독중입니닷!

  10. 하이앟 2013.09.26 18:00  댓글주소  수정/삭제  댓글쓰기

    Integer can be converted to character 옆에 0 나와야 할 것 같은데 안나오네요.
    val_integer에 다른 숫자 넣어보니 거꾸로된 물음표가 나오네요.. 왜 이런거죠?ㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.09.27 10:07 신고  댓글주소  수정/삭제

      int val_integer = 100;
      으로 변경하고 해보세요 ^^
      아마 알파벳 d가 출력될 것 같습니다 :)
      혹은 printf 함수 안에 오타가 있는지 잘 확인해 보셔요 ㅎ

    • 하이앟 2013.09.29 00:24  댓글주소  수정/삭제

      제가 터무니없이 작은 수를 넣어서 그렇게 됐었나봅니다. ㅎ
      답변 감사요~:)

  11. 조용연 2014.04.25 15:22  댓글주소  수정/삭제  댓글쓰기

    블로그에 좋은 내용이 많네요.
    잘 보고 있습니다~!!

  12. 공유결합 2017.01.14 13:47  댓글주소  수정/삭제  댓글쓰기

    NSLog 뒤에 @는 왜쓰는건가요?


오늘의 주제


1. 코드에 주석쓰기

두 번째 시간입니다.

안녕하세요! 야곰입니다.ㅎㅎ


# 주석

주석이 무엇인가 궁금하시죠?ㅎ
다른 블로그나 책에서 한 챕터를 잡고 주석을 설명하는 경우는 거의 없습니다만..
주석은 생각 외로 굉장히 중요한 역할을 하며, 프로그래밍의 첫 습관을 들일때 매우 중요한 녀석이라고 생각합니다. 물론 실무에서도 굉장히 중요합니다.
그래서 주석은 한 챕터로 잡고 설명하려 합니다!!
오늘 포스팅은 짧습니다만, 꼭 기억해 두셔야 할 포스팅입니다^^*

주석.. 코멘트.. 같은 말입니다!
주석은 코드에 아무런 영향을 미치지 않지만, 이 코드가 어떤 코드인지, 무슨 역할을 하는 것인지에 대한 설명을 적어놓는 메모 같은 것입니다.

그런데 이게 왜 중요하냐구요?
정말 간단한 프로그램이라면 굳이 필요 없을지도 모르지만, 나중에 백줄, 천줄, 만줄 ... 길어지는 프로그램이라면 내가 짜 놓고도 이 부분이 어떤 부분이었는지 기억하지 못하는 경우가 허다합니다 ㅋㅋㅋ
나는 기억력이 좋아서 아닐거라구요?
훗...!절대 그렇지 않습니다!
십수년 프로그래밍 한 고수분들도 꼭 적어두는 것이 주석입니다.
정말 코드 짜기도 바빠 죽겠는데 그런거 적을 시간이 어디있냐구요?
그래도 해야 합니다!!
나중에 현업에 가서 협업을 할때에도 굉장히 중요합니다.
내가 짜놓은 코드는 내가 해석하기 쉬울지 몰라도 다른 사람이 같이 일하면서 내 코드를 볼 때, 이해가 가지 않으면 일이 그만큼 늦어지고 심지어는 프로젝트가 망가지기도 하니까요.
제가 여기서 중요하다고 백만번 말해도 모자랄 만큼, 주석을 다는 것은 정말 중요한 습관입니다.
처음부터 주석을 다는 습관을 들여 놓으셔야지 나중에 후회하지 않고, 힘도 덜 드실것을 저는 장담합니다!!

이렇게 말하니까 주석 다는 것이 정말 어려운 것 같지만, 사실은 정말 간단합니다!
한 번 보시죠 ㅎㅎ

자... 화면에 보이는 저 녹색 글씨들 보이시죠? 저것들이 모두 주석입니다.
프로그램을 실행시켰을 때는 전혀 티가 나지 않지만, 작업하는 프로그래머는 보게 되는 저것이 주석입니다.
컴파일 할때 컴파일러가 주석은 모두 제외하고 컴파일 하게 됩니다.


위의 코드 실행 결과 화면입니다.
녹색으로 주석처리된 녀석들은 화면에 나오지 않죠???
코드 해석이 어려우시면 지난번 포스팅을 다시 한 번 보고 오세요^^


자... 조금 수정해서 보여드릴게요~!
어떻게 뭐가 달라졌는지 비교해 가면서 보세요^^


 결과 화면입니다~!

 
로그에 찍힌겁 보시면 깨알같은 팁도 있죠?ㅎㅎㅎ
여기에 직접 쓰지 않을테니 한 번 사용해 보세요^^ 


중요한 주석 처리하는 방법은 간단합니다!


// 주석......
이런식으로 주석을 작성하게 되면 한 줄이 주석처리 됩니다.
즉, 한 줄을 자신이 쓰고 싶은 말들을 써놓을 수 있죠.


또한, 
/* 주석...
여러줄
쓸 수 있는
주석... */ 


이런식으로 처리를 하게 되면 여러줄을 주석처리 할 수 있습니다.

참 쉽죠잉!?

위에 예시로 작성한 코드에서는 주석을 위나 아래에 달아놓았는데, 코드 바로 옆에 붙여 써도 무방합니다~
무슨말인지 잘 이해가 안가시면 직접 해보세요 ㅎㅎ
다시 한 번 말씀드리지만, 컴퓨터 안고장납니다잉 ㅋㅋ 폭발 안합니다잉 ㅋㅋㅋ
주석 다는 스타일을 같이 협업하는 사람끼리 정하거나, 자신만의 스타일로 작성해도 됩니다. 딱히 정해진 틀은 없어요^^ 

앞으로 제가 포스팅을 할 때 마다 주석을 일일히 달며 하지는 못할 거예요.
하지만, 여러분은 제 포스팅을 보며 공부 하실때마다 코드에 꼭 주석을 달아주세요!!
부탁드립니다~!
이것은 정말 중요한 습관임을 다시 말씀드립니다!
그래서 일부러 한 챕터를 내서 포스팅을 한거예요~

그럼 긴 잔소리는 여기까지만 하고 다음 번에 뵙도록 해요^^*

뿅!


by yagom

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

RSS Feed 받기  


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

댓글을 달아 주세요

  1. 사슴 2014.01.26 10:42  댓글주소  수정/삭제  댓글쓰기

    우와 정말 감사합니다. 도움이 많이 되네요!!


오늘의 주제


1. Hello, World 콘솔에 찍어보기


첫 번째 시간입니다.

안녕하세요! 야곰입니다.ㅎㅎ
iOS 개발 포스팅을 하다보니 조금 더 상세히 알고 싶거나, 기초를 좀 더 다지고 싶으신 분들이 있을 것 같아 이렇게 Objective-C 언어도 포스팅을 시작합니다.
사실 C 또는 C++만 잘 알고 있어도 iOS개발에 큰 무리는 없습니다.
물론 다른 언어를 써 보신분들도 마찬가지 일거구요.
절차지향적인 언어를 쓰던 분들은 헷갈리는 부분들이 있을텐데, 그것은 iOS 포스팅 중간중간 설명을 넣구요~
뭐, 여하튼!
절차지향 언어인 C언어를 하니 객체지향 언어인 Objective-C를 한 번 해볼까 합니다.
물론 C++, C#, JAVA 등등 많은 언어들이 있지만!
여기는 iOS 개발부터 시작한 블로그니깐욬ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
별다른 이유 없구요~ 한 번 해봅니다.
혹여나 필요한 다른 언어 있으시면 댓글 남겨주세요^^
잡소리 그만두고 이제 시작하도록 하겠습니다 ㅎㅎㅎ


# Hello, World !!
자, Objective-C 컴파일을 위하여 Xcode를 설치해 주세요~
 Xcode 설치 방법은 제 블로그 포스팅을 참고하시면 됩니다.

iOS개발하기 #1. 개발준비(1)  에서 '# Xcode설치' 를 참고하시면 되겠습니다^^


Xcode를 설치한 후 첫 실행화면입니다. 
Create a new Xcode project 를 선택해 줍니다.


여러 템플릿 중에 Mac OS X 템플릿 중 Application탭의 Command Line Tool을 선택하고 Next


Product Name을 MyFirstC로 지정해 주었습니다. 여러분들이 원하는 프로젝트명을 넣어주세요..^^
프로젝트는 하나의 프로그램이 완성되기 위한 단위라고 생각하시면 되겠습니다.
Type은 Foundation으로 지정해 줍니다.
Next를 누르시고 저장을 위한 위치를 지정해 주세요.

자, 프로젝트가 생성이 되었습니다.
대책없이 그냥 실행시켜 봅시다 ㅋㅋㅋ
화면 좌측 상단에 보시면 Run버튼이 있는데 클릭해 봅시다. 또는 단축키 커맨드+R입니다.


실행 결과 입니다.
뭔가 뿅 튀어나올 줄 알았는데 별거 없죠..?ㅋㅋㅋ
예.. 좀 시시하긴 합니다 ㅋㅋㅋ
화면 하단에 새로 올라온 창이 있는데, 디버그 영역입니다. 거기서 로그가 쫙 찍혀 나오는 곳이 디버그 콘솔입니다. 디버그 콘솔을 보면 뭐라뭐라 막 써있는데, 거기서 잠깐 보니 Hello, World! 라고 찍혀있는게 보입니다 ㅋㅋ
와우~
콘솔은... 음... 뭐 도스창, 아니면 터미널 등등 뭐 다 같은 개념으로 보시면 될거예요~
아! 디버그창이 제것과 같이 생기지 않았다면 화면 확대해서 잘 보세요 ㅋㅋ
제 디버그 콘솔 오른쪽 위에 보면 보기 옵션 버튼들이 있습니다.
두 개의 창이 나오는 가운데 녀석을 선택해 주세요~


근데 콘솔에서 우리는 Hello, World!만 보고 싶은데 시스템과 프로젝트 로그까지 찍혀나오니 어지럽지요?ㅎㅎ
그래서 우리가 보고싶은것만 보도록 합시다.
디버그 콘솔 왼쪽 위쪽에 All Output을 Target Output으로 변경해 줍니다.


그러고 나면 원하는 Hello, World!만 보여요 ㅎㅎㅎ


Xcode화면 좌측 파일 네비게션 영역에서 main.c파일을 클릭해 봅니다.


코드를 보면 NSLog(@"Hello, World!"); 이라고 작성되어 있을 텐데요~
아래 화면처럼 더 타이핑 해주고 실행해 봅시다.
아 그리고 줄마다 맨 끝에 붙는 것은 세미콜론 (;) 입니다.
우리가 글에서 쓰는 마침표라고 생각하시면 될거 같아요~
그렇다고 무조건 쓰는건 아니지만 대부분 코드안에서 줄이 끝날때 찍어주셔야 할거예요~


실행 결과 화면입니다.
별거없죠?ㅎㅎ 


  오늘은 간단히 콘솔화면에 출력하는거 하면서 놀아보았습니다 ㅎㅎ
그런데 화면에 보이는 초록색 글씨는 뭘까요?
하나도 안중요해 보여도, 무지하게 중요한 녀석중에 하나라고 할 수 있기에, 다음 번에는 그녀석에 대해 간략히 알아보도록 할게요~ 
다음번에 뵈어요^^* 

by yagom

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

RSS Feed 받기 


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

Posted by yagom

댓글을 달아 주세요

  1. 컴맹 2012.09.25 07:43  댓글주소  수정/삭제  댓글쓰기

    아~ 나머지 강의도 이렇게 쉬우면 얼마나 좋을까~~~~ㅎㅎ
    아이폰 어플만들기 위해서, XCode를 배우다보니 Object C문법을 좀더 잘알고 있어야될것같아요.ㅠㅠ
    좋은 강의 잘보고 갑니다.~~^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.10.03 21:53 신고  댓글주소  수정/삭제

      ㅎㅎ Objective-C를 제대로 하려면 머리 많이 아파지죠~
      그래도 정말 iOS 완벽하게 다루고 싶다면 Objective-C도 마스터 해봐야겠죠?ㅎ

  2. Favicon of http://www.facebook.com/suyongchoi7972 BlogIcon 합본취리42 2012.09.28 00:19  댓글주소  수정/삭제  댓글쓰기

    C언어만 배웠는데ㅠㅠObjective C도 될지 모르겠네요ㅠㅠ
    네이버에서 찾아가 즐찾해서 배워봅니다..ㅎㅎ
    계속 배워볼께요ㅋㄷ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.10.03 21:55 신고  댓글주소  수정/삭제

      ㅎㅎ 제 블로그에 있는 내용들은 크게 어렵지 않으실 겁니다~
      블로그에 있는 내용들은 정말 많이 부족하기 때문에 다 보시고 더 알고싶은 내용들이 생기시면 Objective-C책을 한 권 사보시는 것도 나쁘지 않을 것 같습니다.
      즐겨찾기까지!!!
      영광입니다 ㅎㅎ 종종 들러주세요 :)

  3. ppange 2012.10.24 01:36  댓글주소  수정/삭제  댓글쓰기

    최고의 강의인것 같아요..
    왜 진작 이 사이트를 몰랐을까요..
    그동안 인터넷 강의에 허비한 돈을 생각하면 ㅠ.ㅠ
    Objective C 책 중에서 추천해 주실 만한 책이 있을까요?
    아직 책은 안사봤거든요.. ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.10.24 18:14 신고  댓글주소  수정/삭제

      안녕하세요 ppange님~!
      강의라고 하기도 부끄러운 것들이죠^^;
      찾아주시고 이렇게 덧글까지 남겨주시니 황공할 따름입니다.
      Objective-C책이 많은 편은 아니지만, 책 나름대로의 스타일이 있다보니 나에게 맞는 스타일의 책을 찾아보시는 것이 좋을 것 같습니다.
      직접 서점에 가셔서 책을 훑어보시는 것을 추천드립니다 :)
      두껍고 내용이 많다고 입문서로 좋은 것만은 아닙니다.
      처음에 쉽고 가볍게 접근 할 수 있으면서 알찬 내용을 가진 책을 골라서 시작하시고, 책마다 부족한 부분들은 어디든지 있으니 더 배우고픈 욕심이 생기면 다른 책들도 찾아보는 식으로 학습해 나가는게 좋지 않을까 싶습니다 ^^*
      큰 도움이 되어드리지 못해 죄송합니다 ㅠ

  4. 명상가 2013.01.05 14:59  댓글주소  수정/삭제  댓글쓰기

    잘보았습니다~

    C 해보신분이면 별다른 어려움 없이 기분좋게 프로그래밍 할 수 있겠네요~

  5. 파워팰리스 2013.03.05 17:34  댓글주소  수정/삭제  댓글쓰기

    우와~! 최강 강좌입니다.
    책보다더 눈에 확들어와 너무 도움이 된 강좌였습니다.

    계속 안드로이드쪽으로 하다가 오늘부터 obj-c로 넘어왔는데요,
    자바랑은 좀 달라 모르는것이 많지만,
    하나 하나 저에게 큰 도움이 되네요 감사합니다.^_^