반복문

동일한 코드를 연속적으로 반복하는 구문이다. 크게 for문과 while문이 있다.


반복문 - for

for문은 초기값, 조건, 증감 이라는 3가지 요소로 반복한다. 반복적인 데이터나 시퀀스를 다룰 때 많이 사용 한다.

for 임시상수 in 범위 {

   실행구문

}

for i in 10...20{   //for 반복시킬상수 in 범위
    print(i)
}

print("--------------------")

let r1 = 20...30	//범위를 상수에 담아서 사용할 수 있다.
for i in r1{
    print(i)
}

범위연산자를 통해 for - in 문을 사용하면 증감은 +1로 지정된다.

증감과 범위를 따로 지정하고 싶다면 범위연산자 대신 stride()를 사용하면 된다. 

for 임시상수 in stride(from:초기값, through(혹은 to): 조건, by:증감){

   실행구문

}

throughto의 차이점은 through는 조건값 포함, to는 조건값 미포함이다. 

for i in stride(from: 50, to: 20, by: -3){		//50부터 20까지 3씩 감소 20미포함
    print(i)
}

print("--------------------")

for i in stride(from: 50, through: 20, by: -3){		//50부터 20까지 3씩 감소 20포함
    print(i)		    //i = 12 -> i는 내부 상수이다. 값 변경 불가. + 외부에서 호출 불가
}


for - in 문 이용하여 결과 구하기

중요한 점은 for문의 임시상수 i는 for문 밖에서 호출할 수 없다는 점이다. 따라서 for문에서 이루어지는 계산을 밖으로 가져오고 싶다면 for문 밖에서 선언된 변수를 사용하여 대입해야 한다는 점이다.

var tot = 0

for i in 1...100{
    tot += i
    print(i,":",tot)
}
print("1부터 100까지의 합계 : \(tot)")

//1부터 100까지 짝수들의 합 구하기
var sum = 0
for i in 1...100{
    if i%2 == 0{
        sum += i
    }
}
print("1부터 100까지의 짝수 합계: \(sum)")

print("--------------------")

sum = 0
for i in stride(from: 0, through: 100, by: 2){	//0부터 100까지 2씩 증가. 100포함
    sum += i
}
print("1부터 100까지의 짝수 합계: \(sum)")

이렇게 여러가지 방법으로 같은 결과를 출력할 수 있다.


중첩 for문 - 구구단

for문은 중첩해서 사용이 가능하다. 이렇게 중첩된 반복문의 대표적인 예시가 구구단이다.

print("구구단(1)---------------------------")
for i in 2...9{
    print("\(i)단")
    
    for k in 1...9{
        print("\(i) * \(k) = \(i*k)")
    }
    
    print("\n")
}

임시상수 k가 있는 for문의 입장에서는 i가 외부에서 선언된 상수이다. 즉 k가 있는 for문에서는 임시상수 i를 호출할 수 있다는 얘기이다. 이 점을 이용하여 구구단을 작성할 수 있다.

print("구구단(2)---------------------------")
for i in 2...9{
    print("\(i)단", terminator: "\t\t")				//1단 2단 3단 ....
}

print()

for k in 1...9{
    for i in 2...9{
        print("\(i)*\(k)=\(i*k)", terminator: "\t")		//2*1=2  3*1=3  4*1=4...
    }
    print()
}

구구단을 세로로 출력하는 코드이다. 간단하게 i와 k의 위치를 바꾸어 주면 출력이 가능하다. 콘솔은 좌에서 우로 출력한다는 점을 잘 생각하고 코드를 작성하자.


중첩 for문 - 별 그리기

for문의 다음으로 대표적인 예시가 별을 이용하여 도형그리기이다.

print("별그리기(1)---------------------------")
for line in 0...4{			//별을 몇줄을 그을지.
    for star in 0...line{		//별을 몇개를 그릴지.
        print("*",terminator:"")
    }
    print("")
}

line이 증가함에 따라 한줄에 *을 그리는 횟수가 증가하여 삼각형이 그려진다.

print("별그리기(2)---------------------------")
for line in 0...4 {			//별을 몇줄을 그릴지
    for star in line...4{		//별을 몇개를 그릴지
        print("*",terminator:"")
    }
    print("")
}

for line in stride(from: 4, through: 0, by: -1){		//4부터 0까지 1씩 감소. 0포함
    for star in stride(from: line, through: 0, by: -1){		//별을 몇개를 그릴지
        print("*",terminator:"")
    }
    print("")
}

이번에는 하나는 범위연산자, 하나는 stride()를 이용하여 역삼각형을 그렸다.

두 코드 마찬가지로 line이 증가 혹은 감소 함에 따라 *을 그리는 횟수가 점점 감소하는 코드이다.

print("별그리기(3)---------------------------")
for line in 0...4 {			//별을 몇줄을 그릴지
    for star in line...4{		//별을 그리기 전에 공백을 몇개를 그릴지
        print(" ",terminator:"")
    }
    for star in 0...line{		//별을 몇개를 그릴지
        print("*",terminator:"")
    }
    print()
}

for line in 0...4{			//별을 몇줄을 그릴지
    for star in stride(from: 4-line, through: 0, by: -1){
    //별을 그리기 전에 공백을 몇개를 그릴지
        print(" ",terminator: "")
    }
    for star in 0...line{		//별을 몇개를 그릴지
        print("*",terminator:"")
    }
    print("")
}

앞에 나온 코드를 합치면서 *대신 공백을 출력하면 처음에 그린 삼각형의 반전된 모습을 그릴 수 있다. 

'iOS > TJ' 카테고리의 다른 글

day07_array  (0) 2021.06.02
day06_control flow_loop  (0) 2021.05.27
day04_control flow_conditional  (0) 2021.05.22
day03_operator, casting  (0) 2021.05.18
day02_var  (0) 2021.05.18

control flow

제어 흐름(control flow)이란 코드의 진행 순서를 바꾸는 것이다. 크게 조건문(conditional)과 반복문(loop)으로 나뉘는데, 오늘은 조건문에 대해 적어본다.


조건문 - if

if문에는 크게 3가지 형태가 있다.

if [조건식] {

   [조건이 참일 때 실행 구문]

}

var a:Int = 5

if a >= 5 {
    a = 10
}

print("a:",a)

조건식이 참이기에 a변수에 10이 대입되어 10이 출력된다. 조건식이 성립하지 않았다면 5가 그대로 출력된다.


if [조건식] {

   [조건이 참일 때 실행 구문]

} else {

  [조건이 거짓일 때 실행 구문]

}

var a:Int = 5

if  a > 6 {
    a = 1000
} else {
    a = 2000
}

print("a:",a)

 

 

이번엔 else를 통하여 조건식이 거짓일 경우 실행할 구문을 따로 지정하였다. 조건식 a > 6은 거짓이므로 a에 2000이 대입되어 2000이 출력되었다.


if [조건식1] {

   [조건1이 참일 때 실행 구문]

} else if [조건식2]{

   [조건1이 거짓, 조건2가 참일 때 실행 구문]

} else {

   [조건1, 조건2가 모두 거짓일 때 실행 구문]

}

let score = 70

if score >= 80 {
    print("우수")
} else if score >= 60 {
    print("정상")
} else{
    print("미달")
}

이번에는 조건식을 두개를 적었다. if문의 조건을 판단 후 거짓일 경우 else-if 문의 조건을 판단하여 참일 경우, 거짓일 경우 실행 할 구문을 적었다. 

let score = 50

if score >= 80 {
    print("우수")
} else if score >= 60 {
    print("정상")
} else if score >= 40{
    print("미흡")
} else {
    print("탈락")
}

else-if 문은 원하는 만큼 추가할 수 있다. 단, 선행으로 적은 조건이 거짓일 경우에만 다음 조건으로 넘어가 비교를 하게 되니 순서에 유의하며 작성해야 한다.


조건문 - switch

 

switch문은 대상이 정해진 값과 같은지 비교하여 구문을 실행하는 조건문이다. defualt는 대상이 비교할 값에 모두 해당 하지 않았을시에 실행되는 구문이다.

 

switch 대상(값) {

   case 값1:

      실행구문

   case 값2:

      실행구문

   ...

   default:

      실행구문

}

 

스위프트의 switch구문은 다른 언어와 많이 다른 모습을 보이는데, 기본적으로 break키워드가 생략되어 따로 적을 필요가 없어진다. case를 연속실행하기 위해서는 fallthrough 키워드를 사용한다. 

var score = 70

switch score {
case 80:
    print("80입니다.")
case 70:
    print("70입니다.")
case 40:
    print("40입니다.")
default:
    print("기본값입니다.")
}

score의 70이라는 값이 case 70:에 해당되어 "70입니다"문장이 출력되었다.


var a = 10

switch a {
case 88:
    print("88")
case 10,20,30:       //다중 값을 적을 수 있다. 하나라도 해당되면 구문을 실행한다.
    print("10,20,30입니다.")
case 70...80:       //70이상 80이하 범위 값
    print("70...80입니다.")
case 50..<60:       //50이상 60미만 범위 값
    print("50..<60입니다.")
case 200...:       //200이상
    print("200...입니다.")
case ...150:       //150 이하
    print("...150입니다.")
case ..<170:       //170미만
    print("..<170입니다.")
default:
    print("기본값입니다.")
}

스위프트의 switch문은 또 다른 차별점이 있는데, 바로 case문에 다중 값, 범위, 조건절 등 을 추가할 수 있다는 것이다.

let score = 85
let color = "red"

switch color{
case "red" where score % 2 == 0:	//score가 짝수이면서, color가 red인 경우
    print("red 짝수")
case "red" where score >= 80:		//score가 80이상이면서, color가 red인 경우
    print("red 우수")
case "blue":
    print("blue")
case "green":
    print("green")
case "red" where score >= 60:		//score가 60이상이면서, color가 red인 경우
    print("red 정상")
case "red":
    print("red")
default:
    print("default")
}

 스위프트의 switch에는 where절을 통해 조건을 걸수 있는 것이 큰 특징이다. 단, switch문을 사용할 때 알아 두어야 할 점은 대상이 두 개 이상의 case에 부합하더라도, 먼저 적힌 case의 실행구문만 실행 된다는 점이다.


범위연산자

앞서 나온 범위표현에 대해서 적어본다. 값의 범위를 나타내고자 할 때 사용한다. 

연산자 부호 설명
폐쇄 범위 연산자 A ... B A이상 B이하
반폐쇄 범위 연산자 A ..< B A이상 B미만
단방향 범위 연산자 A ... A이상
... A A이하
..< A A미만

 

'iOS > TJ' 카테고리의 다른 글

day06_control flow_loop  (0) 2021.05.27
day05_control flow_loop  (0) 2021.05.25
day03_operator, casting  (0) 2021.05.18
day02_var  (0) 2021.05.18
day01_print()  (0) 2021.05.13

operator

연산자(operator)는 항을 재료로 계산 후 결과를 반환해주는 것이다. 연산자에 의해 연산되는 값의 수에 따라 단항, 이항, 삼항 등으로 구분하기도 하며, 연산자의 위치에 따라 전위, 중위, 후위 등으로 구분하기도 하는데, 그 중에서도 오늘은 이항연산자와 삼항 연산자에 대해 알아보도록 한다. 

 

산술 연산자

이항 연산자의 한 종류이다. 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 계산이 가능하다.

var a = 20, b = 3

print("a+b: \(a+b)")
print("a-b: \(a-b)")
print("a*b: \(a*b)")
print("a/b: \(a/b)")
print("a%b: \(a%b)")

문자열에는 덧셈연산이 결합연산으로 적용된다. 

var x = "맛있는"
var y:String = "피자"

print("x: \(x)")
print("y: \(y)")
print("x+y: \(x+y)")

한가지 주의해야 할 점은 스위프트의 연산자는 다른 언어와 달리 같은 자료형이어야만 동작한다는 점이다. 따라서 다른 자료형끼리 연산을 할 때에는 자료형 변환을 통해서 자료형을 맞추어 주어야 한다. 산술연산에는 당연히 계산 우선순위가 존재한다. 

 

비교 연산자

Bool을 반환하는 이항연산자이다. 초과, 미만, 이상, 이하, 같다, 다르다를 비교하여 결과값으로 bool형을 반환한다. 

a=10; b=20

print(a , ">", b, ":", a > b)
print(a , "<", b, ":", a < b)
print(a , ">=", b, ":", a >= b)
print(a , "<=", b, ":", a <= b)
print(a , "==", b, ":", a == b)
print(a , "!=", b, ":", a != b)

문자열의 비교도 가능하다. 가나다 순으로 비교를 하며 후위의 글자가 더 높은 것으로 판단한다. 앞글자가 같다면 글자수가 더 많은 글자가 더 높은 것으로 판단한다.

x = "정우성" ; y = "정좌성"

print(x , "<", y, ":", x < y)
print(x , ">", y, ":", x > y)
print(x , "<=", y, ":", x <= y)
print(x , ">=", y, ":", x >= y)
print(x , "==", y, ":", x == y)
print(x , "!=", y, ":", x != y)

bool간의 비교는 ==, != 연산만 가능하다. 

var  qq = true , ww = false

print(qq, "==", ww, ":", qq == ww)
print(qq, "!=", ww, ":", qq != ww)

 

논리 연산자

bool연산자 라고도 한다. AND, OR, NOT 연산이 있다. 

AND 연산은 두 항의 값이 true여야만 true를 반환하며 그외에는 false만 반환한다.  &&로 표현한다.

OR 연산은 두 항의 값이 하나만 true이면 true를 반환한다. 두 항의 값이 false여야만 false를 반환한다.  ||로 표현한다.

NOT 연산은 단항 연산자이다. 항의 값을 반전시켜준다. true를 false로 false를 true로 반환한다.  !로 표현한다.

qq = true ; ww = false

print(qq, "&&", ww, ":", qq && ww)
print(qq, "&&", qq, ":", qq && qq)

print(qq, "||", ww, ":", qq || ww)
print(ww, "||", ww, ":", ww || ww)

print("!",qq, ":", !qq)
print("!",ww, ":", !ww)

 

연산우선순위

여러 연산자를 섞어서 쓰게되면, 우선순위에 따라 연산 순서가 정해진다. 

var height = 195.4
var color = "grey"

print("height >= 185+20 && color == \"red\" : ", height >= 185+20 && color == "red")
print("height >= 185-10 || color == \"red\" : ", height >= 185-10 || color == "red")

산술 > 비교 > 논리 순서로 연산이 이루어진다. 

 

복합할당 연산자

할당(대입)연산과 다른 연산을 한번에 할 수 있도록 결합되어진 연산자다.

a = 8

print("a:", a)
a += 3
print("a += 3:", a )
a -= 3
print("a -= 3:", a )
a *= 3
print("a *= 3:", a )
a /= 3
print("a /= 3:", a )
a %= 3
print("a %= 3:", a )

 

삼항 연산자

조건식 ? A : B

항이 3개이다. 조건식이 참이라면 A를 반환, 거짓이라면 B를 반환한다.

var score = 85
var res = score >= 80 ? "합격" : "불합격"

print(score,":",res)

score가 80이상이라는 조건식을 만족하였으므로 "합격"이 res변수에 대입된 것이다. 

 

casting

형 변환(casting)이란, 서로 다른 자료형과의 연산을 위해, 혹은 변수를 다른 형태로 표현하기 위해 자료형을 변환하는 것을 뜻한다. 보통 자료형(변수) 형태로 사용한다. 

var x = 30
var y = 1.2

var z = x + y   //Binary operator '+' cannot be applied to operands of type 'Int' and 'Double'

서로 다른 자료형은 연산을 할 수 없다는 에러가 표시된다. 

var x = 30
var y = 1.2

var z = Double(x) + y
print("z:",z)

예시와 같이 변수 x를 형변환을 통해 실수형으로 변환하여 두 변수의 연산이 가능해진다.

그렇다면 형변환을 하게 되면 자료는 어떤 식으로 변화가 일어날까?

var x = 30
var y = 1.8

print("Double(x):",Double(x))
print("Int(y):",Int(y))

정수형을 실수형으로 변환 시 큰 문제가 없다. 소수점 .0이 추가될 뿐이다. 하지만 실수형을 정수형으로 변환 시 소수점 이하 자리는 없어지게 된다. 따라서 자료형 변환 시 손실되는 자료가 생기는지 확인이 필요하다.

var h:Int16 = 128
print(Int8(h))

위와 같은 경우도 조심해야 한다. Int16에서는 128을 표현할 수 있지만, Int8의 범위는 127 ~ -128 즉 128은 Int8에는 담을 수 없는 표현 범위의 숫자이다. 형 변환을 시도할 때에는 이러한 여러가지 문제점이 발생 할 수 있다는 점을 알아두자.

'iOS > TJ' 카테고리의 다른 글

day06_control flow_loop  (0) 2021.05.27
day05_control flow_loop  (0) 2021.05.25
day04_control flow_conditional  (0) 2021.05.22
day02_var  (0) 2021.05.18
day01_print()  (0) 2021.05.13

변수의 선언

var 변수이름 : 자료형

변수는 값을 담는 메모리 공간이라고 생각하면 된다. 변수명은 의미를 알 수 있는 것으로 작성해야 코드의 유지보수에 용이하며, 숫자로 시작 불가, 특수기호 불가 *언더바(_) 는 가능, 예약어 불가, 공백 불가하다.

var a: Int	//정수형 변수 (초기화없이)생성
a = 10		//변수 값 10대입(초기화)
print("a:",a) 

단 주의 해야 할 점은 초기화없이 생성만 이루어진 변수는 호출할 수 없다. 값을 대입 하여 초기화를 이루어져야만 호출이 가능하다는 점을 알아두자.

var a : Int
print("a:",a)

 

타입추론

초기화를 하지 않으면 호출이 불가능 하지만, 스위프트에서는 변수의 선언과 동시에 초기화가 일어난다면 자료형은 생략이 가능하다. 이러한 특성을 타입추론이라고 부른다.

var a = 10 //var a : Int = 10과 같은 표현이다.
print("a:",a)

 

자료형 - 숫자

자료형은 크게 숫자, 문자, Bool형이 있다. 숫자에는 정수부와 실수부로 나뉘어있고,

정수부는 Int(Integer), UInt(UnsignedInterger)로 구분된다. 

Int는 음수, 양수 그리고 0을 표현할 수 있고, UInt는 0과 양수만 표현이 가능하다.

스위프트의 Int는 크기에 따라 표현 범위가 바뀐다. 

자료형 범위 크기
Int8 127 ~ -128 8bit
Int16 32,767 ~ -32,768 16bit
Int32 2,147,483,647 ~ -2,147,483,648 32bit
Int64 9,223,372,036,854,775,807 ~ -9,223,372,036,854,775,808 64bit

실수부는 Float, Double로 구분되며, Float는 32bit, Double은 64bit의 크기를 가진다. 

스위프트는 2014년에 출시되었고, 당시의 pc운영체제가 대부분 64bit로 운영되었던 점이 반영되어 타입추론으로 생성된 정수값의 변수는 Int64로 생성, 실수값의 변수는 Double로 생성된다.

 

자료형 - 문자 

문자형태의 자료형의 경우 CharacterString이 있다. 

Character의 경우 한 글자만 저장. String의 경우 문장을 저장한다. 여기서 스위프트가 다른 언어와 다른 점은 Character이건 String이건 큰 따옴표("")로 데이터를 표현한다는 점이다. 

var tt:String = "abc"     //문자열 선언
var ch:Character = "a"   //문자 선언 작은 따옴표가 아닌 큰따옴표다 잘 알아두자. 한글자만 들어가는건 여전하다.

print("tt:",tt)
print("ch:",ch)

한글자(1byte) 데이터를 타입추론으로 변수 생성 시, 데이터를 다루기 더 유연한 String으로 생성된다. 

 

자료형 - Bool

참과 거짓을 나타내는 자료형이다. true, false 둘 중 하나의 값 만을 가진다.

다른 언어와 달리 0, 1 이거나 TRUE, FALSE는 허용하지 않는다. 

var bb :Bool

bb = true   //0,1이 아닌, true, false만 가능하다.
print("bb:",bb)

bb = false
print("bb:", bb)

'iOS > TJ' 카테고리의 다른 글

day06_control flow_loop  (0) 2021.05.27
day05_control flow_loop  (0) 2021.05.25
day04_control flow_conditional  (0) 2021.05.22
day03_operator, casting  (0) 2021.05.18
day01_print()  (0) 2021.05.13

print()

스위프트는 print()함수로 데이터를 출력한다.

print()로 출력하는 대부분의 데이터는 크게 문자와 숫자로 구분할 수 있다. 

 

print("hello")		//문자
print(1234)		//숫자


escape character sequence

문자를 출력할 때 따옴표("")안에 적어 출력할 문자열을 표시하는데 그렇다면 따옴표("")를 출력하려면 어떻게 입력해야할까?

 

print("나폴레옹은 \"불이야\" 라고 외쳤다.")

위와 같이 따옴표 옆에 역슬래시(\)를 붙이면 출력하고 싶은 문자로 인식하게 된다. 

이 외에도 여러가지 표현이 있는데, 몇가지만 적어보자면 아래 3가지 정도가 있다. 

  • \t      탭(들여쓰기) 출력
  • \n     줄 바꿈 출력
  • \\      \ 출력

이러한 문자들을 제어문자열(escape character sequence)라고 한다.

print("깊은\t 산 \n속 작은 옹달 샘 누가 \\와서 먹나요")


terminator

print()함수에는 seperator, terminator 속성이 생략되어있다. 그 중 terminator속성이란, print()안에 적은 데이터 이후 종결어미를 얘기한다. 기본값으로는 \n 즉, print()함수에 줄바꿈이 일어나는 이유는 terminator의 기본값이 \n으로 되어있어서 그런것이다. terminator의 값을 따로 수정하면 줄바꿈이 아닌 다른 표현을 출력할 수 있다.

 

print("아기상어", terminator:"->")
print("뚜루루뚜루")
print("귀여운", terminator:"\t")
print("뚜루루뚜루")
print("바다속")
print("뚜루루뚜루", terminator:"\n")  //print("뚜루루뚜루")와 같은 출력이다.
print("아기상어")

'iOS > TJ' 카테고리의 다른 글

day06_control flow_loop  (0) 2021.05.27
day05_control flow_loop  (0) 2021.05.25
day04_control flow_conditional  (0) 2021.05.22
day03_operator, casting  (0) 2021.05.18
day02_var  (0) 2021.05.18

+ Recent posts