티스토리 뷰

반응형

안녕하세요. 오늘은 Swift에서 표준입력받는법을 알아보려고해요.

지금 Swift로 백준사이트에서 A+B라는 문제를 풀려고 했어요..

그리고 let a, let b해주고 이제 입력을 받아볼까..했는데 도무지 생각이 안나는 겁니다.

뭐가요? 입력받는법...이요..ㅎㅎ



자고로 모든언어를 배울 때 기본적인 입출력은 가장 먼저 배우잖아요???????

Hello World! 출력 한 번 해보고..

근데 배운 기억이 없는 겁니다........ㅎㅎ

하핫~~~!!!~!~~



iOS로 Swift를 배워서 그런거같아요..iOS는 텍스트 필드 그런게 있으니 뭔가 입력을 당연하게 생각했나봐요

그래서 저와같은 분들을 위해 글을 쓰려고 합니다.....ㅎㅎ.....입출력 정도는 알아두자구요..!!



자, 일단 결론은 readline()이라는 함수를 사용하면 편합니다. 다른 복잡한 입출력 방법이 하나 있는 것 같은데, 굳이 편한 readline을 두고...

오늘은 readline에 대해서만 알아볼거에요ㅎㅎㅎ



그리고...일단 오늘의 주제는 어떻게든 '입력을 받는다'잖아요?

그래서 플레이그라운드에서


해보는데....받으라는 입력은 안받고.............

키보드 뭘 눌러도 아무 반응이 없는 거에요 ㅠㅠㅠ

그래서 

아! 플레이그라운드에서는 안되고^^ iOS만드는 프로젝트에서 가능한가보다~~

하고


했는데...안되는 거에요 ㅎㅎ

생각해보니 iOS앱 만들때도 이렇게 클래스 밖에 뭘 한 기억은 없는 것 같아서 이것도 아닌가 보다 했죠.

그래서 찾아보니..



플레이그라운드는 샌드박스이기 때문에 input이 없다..라고 하네요. 

(샌드박스(sandbox)란 외부로부터 들어온 프로그램이 보호된 영역에서 동작해 시스템이 부정하게 조작되는 것을 막는 보안 형태이다. )


그리고 입력을 받을 수 있는 방법은 actual application을 이용하는 거라고 합니다.

여기서 actual application..이란...



바로 이것이죠..

저는 맨날 C++코딩을 여기서 하는데 Swift가 된다는 사실을 몰랐네요.. 당연히 될텐데....왜몰랐찌..ㅎㅎ

아무튼 클릭해서 next를 눌러주시고



언어를 Swift로 선택해서 프로젝트를 만들어줍니다. 


그러면!!



이런 화면을 보실 수 있게 될겁니다ㅎㅎㅎ 반갑게 Hello, World!가 적혀있네요.

한번 실행해볼까요? 


ㅎㅎㅎ



그러니까!! 하고싶은 말은 프로젝트를 command line tool로 만들되, 언어를 Swift로 선택해서 만들어주신 뒤에~~ 예제를 같이 해보자구요 ㅎㅎ..







Standard Input in Swift ( readline )




이름을 한번 볼게요. read+line의 합성어 같죠? 읽다+줄 
한번 보면 "줄을 읽다"라는 소리같죠?
네 맞습니다. 이 readline은 한 줄을 읽어들이는 함수입니다~~~~
너무 쉽죠!!!!ㅎㅎㅎ

자 그럼 위에서 실패했던......예제를 한번 해볼까요? XD

import Foundation


let a =  readLine()

print(a)

참고로 Foundation을 import안해도실행은 잘되네요..ㅎㅎ 하지만 뒤에 가서는 필요하니 빼지는 말아주세요.


자.. 뭐가나오시나요? 




정수를 넣으면 Optional("정수")이 나오고,

 



문자를 넣으면 Optional("문자")가 나오네요.


ㅡㅡ저 Optional 없앨 수 없나



ㅎㅎ없앨 수 있습니다. 강제 언래핑으로요!!

a옆에 !만 붙혀주면,



ㅎㅎ위에서 Optional("")이라고 나온 이유는 바로 readline이 Optional을 리턴해주기 때문입니다.




자..하지만...


우리는 배웠죠. 제 옵셔널 정리 글을 보시면 강제 언래핑(!)사용은 줄이는 것이 좋습니다. 

치명적인 에러를 낼 수 있기 때문이죠.

그래서 뭘 해주자고 그랬죠?

~~~


네. 옵셔널 바인딩을 이용해 한번 해줘봅시다.



import Foundation

let a =  readLine()


if let a = a{

    print(a)

}


다 a니까 헷갈리시나요? ㅎㅎㅎㅎㅎ 이렇게도 된다는 것을 보여드리기 위해...

헷갈리신다면 




import Foundation

let a =  readLine()

if let sol = a{

    print(sol)

}

 

이렇게 하셔도 됩니다. 

결과는?




잘 나오는 군요ㅎㅎ

여기서 sol변수는 옵셔널이 아니라는 점!!

위에서는 a!로 값을 뽑아냈지만 여기서 sol!을 하게되면



오류가 난답니다 ㅎㅎ

sol이 String?타입(옵셔널)이 아니라 String타입이기 때문이죠

옵셔널이 아닌 타입에 옵셔널 어노테이션을 붙힐 수는 없겠죠!?

ㅎㅎ


여기까지 잘 따라오셨나요?

우리는 이제 한줄을 입력받는 법을 배운거에요!ㅎㅎ


자..그렇다면..A+B 라는 문제는 어떻게 풀 것이냐...

C++같은 경우, 하나씩 받을 수 있기 때문에 변수가 2개 필요하겠죠? 

(물론 한번에 받을 수 있겠지만 복잡해지겠죠?)


하지만...Swift같은 경우..

우리는 readline을 써야합니다.

한줄을 다 입력받는 것이죠. 


ㅠㅠ..


자..그럼 어떻게 해야할까요?

C++로 생각해볼까요?

변수를 하나만 쓰고 입력을 받는다고 생각해봅시다. 그럼 int로는 못받고(입력이 스페이스로 나눠져있기 때문)

String을 사용하여 받아야겠죠? 그리고 뭐 변수가 두개가 주어진다는 것은 자명하니 크기만큼 if문으로 검사하면서 할 수도 있겠네요.

아니면, 저 거슬리는 " "를 없애는 방법도 있겠구요!!

우리는 한번 저 스페이스를 없애봅시다 ㅂㄷㅂㄷ



import Foundation


var a = readLine();


if let a = a {

    var array = a.components(separatedBy: " ")


}

자! 어떤가요 


음...seperatedBy : " "? 아 여기에 적힌 것으로 나눈다는 소리구나.. 

한번 잘 나눠졌나 확인해볼까요? 



오오 잘 출력이 됐어요.

하지만 여기서 궁금증이 생길 수 있습니다. a는 분명히..아까 String?이라는 타입이었지 배열이 아니었어요.

a를 받은 a도 (if let sol = a라고 했을 시 sol은 String이었지 ) 배열이 아니었어요. 근데 저희는 출력할 때 완전 배열을 출력하듯이 인덱스를 줬는데 출력이 잘 되었죠?

그 이유는 바로  components함수에 있습니다. 


components의 정의를 보시면, 리턴타입이 뭔가요? String이긴 한데...[String]이죠??

네. 배열입니다. components라는 함수는  separator로 받은 String으로 나눠준 배열을 리턴해줍니다.

그래서 인덱스로 접근이 가능하게 되는것이죠.

오.. 10.0부터 가능한 함수네요 ㅎㅎ..


그럼 이제 푸는 방법을 알았으니 A+B문제를 풀어봅시다. 


짠 ㅎㅎ




저 방법 말고도 다른 방법은 많아요!! ㅎㅎ 

자. 오늘은 Swift에서 사용자 입력을 받아보는 예제를 같이 했는데, 도움이 되셨나요?

XD

모두 즐거운 코딩하세요!

반응형