사전 목표.
- 함수를 최대한 많이 만들어서 활용해 볼 것.
- 이때 왜 이렇게 작성했고 왜 이런식으로 구현했는지 알아보기 쉽게 작성할 것.
사전 준비.
struct parrot {
let name: String
var weight: Int
var temp: Double
var time: Int
var condition: Int
var counting: Int
//지난 시간에 공부했던, 제대로 초기화하기 위해서 초기화 해줌
init(name: String, weight: Int, temp: Double, time: Int, condition: Int, counting: Int) {
self.name = name
self.weight = weight
self.temp = temp
self.time = time
self.condition = condition
self.counting = counting
}
}
var baechu = parrot(name: "배추", weight: 95, temp: 38, time: 80, condition: 70, counting: 11)
var mungchi = parrot(name: "뭉치", weight: 115, temp: 35.5, time: 29, condition: 60, counting: 7)
먼저 구조체 문법을 사용하여 parrot이라는 구조체를 생성하였다.
parrot이라고 지은 이유는, 변수를 내 앵무새들의 이름으로 할 것이기 때문이다ㅋㅋㅋㅋ
그리고 지난번에 공부했던 이니셜라이저를 사용해서, 초기화 해주었다.
그 다음 baechu와 mungchi라는 변수를 선언했고, 값을 미리 넣어주었다.
왜냐하면 이번에는 함수를 최대한 많이 사용해 볼 생각이기 때문이다.
덕분에 이번 과제를 수행하고 나서 함수에 대한 이해도가 매우 높아졌다.
배추와 뭉치 변수를 보자.
var baechu = parrot(name: "배추", weight: 95, temp: 38, time: 80, condition: 70, counting: 11)
var mungchi = parrot(name: "뭉치", weight: 115, temp: 35.5, time: 29, condition: 60, counting: 7)
구조체 parrot를 집어넣었고, 그 값들은 위와 같이 초기화 하였다.
값은 그냥 생각나는 대로 막 집어넣었다 ㅋㅋ
다만 넣을때 일부러 if문을 통과 혹은 탈락 시키기 위해 의도적으로 값을 조절하기도 하였다.
첫번째 문제.
코드
func workoutTime(codeName: parrot, time: Int) {
if time >= 60 {
print("\(codeName.name)는 \(time)분 운동했습니다!\n\(codeName.name)는 운동을 많이 했습니다.")
} else {
if time < 60 {
print("\(codeName.name)는 \(time)분 운동했습니다!\n\(codeName.name)는 운동을 더 해야합니다.")
}
}
}
workoutTime이라는 함수를 생성하였다!
파라미터로는 codeName, time을 생성하였다.
파라미터의 타입으로는 parrot이라는 이름으로 선언한 구조체와, Int가 되시겠다.
호출은 이런식으로 이루어진다.
workoutTime(codeName: baechu, time: 30)
workoutTime(codeName: mungchi, time: 100)
workoutTime 함수에는 time이라는 파라미터를 추가했기 때문에,
호출을 할때, baechu라는 변수의 이름과, time이라는 파라미터의 값을 입력해야한다.
여기서 codeName: parrot으로 선언했기 때문에,
parrot 이라는 구조체가 사용됐고, 호출할때 각각 baechu, mungchi라는 변수의 이름을 호출했다.
위의 사전준비에서 보면 알 수 있듯이, baechu와 mungchi는 parrot이라는 구조체를 사용해서 선언한 변수이다.
print문을 보자.
\(codeName.name) 여기서 codeName은 parrot.
그리고 호출은 baechu, 그리고 baechu라는 변수는 parrot이라는 구조체를 이용하여 선언되었다.
\(codeName.name)는 그래서 baechu라는 변수의 name이라는 파라미터를 의미하는 것이다.
mungchi의 경우도 마찬가지.
앞으로 계속 이런식으로 동작할 것이니 이해하고 넘어가야 한다.
어쨌든, 그래서 호출할 때 time의 값을 넣어주었다.
그럼 baechu, mungchi라는 값을 선언했을 때 넣은 값들은 새로 넣은 값들로 초기화 되게 된다.
출력값은...
만약 새로운 값을 넣지 않고 기존에 선언한 값으로만 구현시키고 싶다면?!
요렇게 코드를 조금만 바꿔주면 된다.
func workoutTime(codeName: parrot) {
if codeName.time >= 60 {
print("\(codeName.name)는 \(codeName.time)분 운동했습니다!\n\(codeName.name)는 운동을 많이 했습니다.")
} else {
if codeName.time < 60 {
print("\(codeName.name)는 \(codeName.time)분 운동했습니다!\n\(codeName.name)는 운동을 더 해야합니다.")
}
}
}
호출은
workoutTime(codeName: baechu)
workoutTime(codeName: mungchi)
무엇이 달라졌을까?
먼저 함수의 파라미터에서 time이 삭제되었다.
그리고 기존 time에서, codeName.time으로 변경되었다.
time이라는 파라미터가 있었기 때문에 그것을 사용하는 것이었지만, 없어졌기 때문에,
구조체 parrot의 time이라는 변수를 가져다가 쓰는 것이다.
다시한번 말하지만, codeName: parrot이라는 파라미터를 선언했기 때문에, codeName.time은 구조체 parrot의 time을 의미한다.
호출에서 또한 마찬가지이다.
time이라는 파라미터의 값은 더이상 입력해서는 안된다.
왜냐? 삭제했기 때문이다.
출력값은 baechu, mungchi라는 변수를 선언했을 때의 값으로 동작한다.
두번째 문제.
func compareweight(target1: parrot, target2: parrot) {
if target1.weight > target2.weight {
print("\(target1.name)의 몸무게가 더 많이 나갑니다.")
} else if target1.weight < target2.weight {
print("\(target2.name)의 몸무게가 더 많이 나갑니다.")
} else {
print("\(target1.name)과 \(target2.name)의 몸무게는 같습니다.")
}
}
호출은
compareweight(target1: baechu, target2: mungchi)
첫번째 문제의 설명을 이해하고 왔다면, 두번째 문제부터는 매우 쉽다.
값은 처음에 변수를 선언할 때 입력했던 값들을 사용한다.
파라미터는 단순히 target1, target2. 두개를 선언하였다.
당연이 하나는 배추 하나는 뭉치가 될 것이다.
target1.weight를 보자.
파라미터를 선언할때 target1: parrot으로 선언했기 때문에
여기서 weight는 구조체 parrot의 weight를 사용한다.
.name 또한 마찬가지.
결국 코드를 해석하면 배추와 뭉치의 몸무게를 비교하는 것이다.
그리고 상황에 따라 프린트문을 출력한다.
세번째 문제.
func situation(codeName: parrot) {
if codeName.temp >= 36.5 && codeName.condition >= 70 {
print("\(codeName.name)는 운동이 가능한 상태입니다.")
} else if codeName.temp >= 36.5 && codeName.condition < 70 {
print("\(codeName.name)는 컨디션 문제로 운동이 불가합니다.")
} else {
if codeName.temp > 36.5 && codeName.condition >= 70 {
print("\(codeName.name)는 체온 문제로 운동이 불가합니다.")
} else {
print("\(codeName.name)는 체온과 컨디션 문제로 운동이 불가합니다.")
}
}
}
호출은
situation(codeName: baechu)
situation(codeName: mungchi)
원래 문제에서는, 두가지 조건을 충족할 시 운동이 가능하다고 출력하라고만 했다.
하지만 뭔가 조금 더 해보고 싶어서 else if문을 사용해서 조금 더 추가해보았다.
똑같이 codeName은 parrot이라는 구조체와 연결.
파라미터를 따로 선언하지 않았으므로, parrot이라는 구조의 name, temp, condition을 사용한다.
&&은 and라는 의미이다. &&의 앞뒤의 조건이 모두 만족해야만 통과~~@!
나머지는 첫번째 두번째 문제들의 코드와 같은 원리로 작성하였다!
문제점이 있었다.
분명히 코드를 다 작성했고, 에러메시지 또한 없었는데, 출력이 되질 않았다..!
당시의 코드를 보겠다.
func situation(codeName: parrot) {
if codeName.temp >= 36.5 && codeName.condition >= 70 {
print("\(codeName.name)는 운동이 가능한 상태입니다.")
} else if codeName.temp >= 36.5 && codeName.condition < 70 {
print("\(codeName.name)는 컨디션 문제로 운동이 불가합니다.")
} else {
if codeName.temp > 36.5 && codeName.condition >= 70 {
print("\(codeName.name)는 체온 문제로 운동이 불가합니다.")
}
}
}
최종 코드와 비교해보면 무엇이 다를까??
그렇다.
마지막에 else문 안에 if 문이 하나 더 들어있고,
else문을 하나 더 추가하여 해결하였다.
else문이 필요했던 이유는,
첫번째 조건, 온도와 컨디션 모두 pass
두번째 조건 온도는 pass, 컨디션은 fail
세번째 조건 온도는 fail, 컨디션은 fail
그리고 네번째 조건 온도와 컨디션 모두 fail.
네번째 조건을 구현하지 않았었다.
그리고 선언했던 변수 mungchi의 값들이 모두 fail이었기 때문에 출력되지 않은 것이다.
에러는 없지, 코드를 다시봐도 문제될 것이 없지, 그래서 다시작성해보기를 반복, 변수의 값을 바꿔도 보았는데,
변수의 값을 바꾸고 나니 해결이 되었다.
그때 깨달았다.
"아 한가지 조건을 구현하지 않았구나...!" ㅋㅋㅋㅋㅋㅋㅋ
네번째 문제.
func count(target1: parrot, target2: parrot) {
if (1...10).contains(target1.counting) {
print("\(target1.name)의 운동 횟수가 유효합니다.")
} else {
print("\(target1.name)의 운동 횟수가 유효하지 않습니다.")
}
if (1...10).contains(target2.counting) {
print("\(target2.name)의 운동 횟수가 유효합니다.")
} else {
print("\(target2.name)의 운동 횟수가 유효하지 않습니다.")
}
}
호출은
count(target1: baechu, target2: mungchi)
같은 원리이다.
다만 다른점은, (1 ... 10).
1부터 10까지 범위를 나타내는 의미이다!
위의 설명들을 이해했다면, 네번째 문제의 코드를 이해하는데도 문제가 없을 것이다!
다섯번째 문제.
var letsCountBaechu = (baechu.time >= 30) ? "\(baechu.name)의 운동 시간이 적절합니다." : "\(baechu.name)의 운동 시간이 부족합니다."
var letsCountMungchi = (mungchi.time >= 30) ? "\(mungchi.name)의 운동 시간이 적절합니다." : "\(mungchi.name)의 운동 시간이 부족합니다."
호출은
print(letsCountBaechu)
print(letsCountMungchi)
마지막 문제이다.
삼항 연산자를 사용하여 운동시간에 따라서 다른 메시지를 출력하는 코드이다.
삼항 연산자를 사용하기 위해 함수를 사용하지 않고 각각의 변수로 구현하였다.
운동 시간에 대한 값은 baechu.time, mungchi.time으로 해당 변수들에서 바로 가져왔다.
삼항 연산자를 간단하게 설명하자면,
question ? answer1 : answer2
위와 같은 형태를 가진 연산자가 삼항 연산자이다.
question의 답이 ture면 answer1을, false면 answer2의 값을 사용하는 연산자이다!
전체 코드
struct parrot {
let name: String
var weight: Int
var temp: Double
var time: Int
var condition: Int
var counting: Int
//지난 시간에 공부했던, 제대로 초기화하기 위해서 초기화 해줌
init(name: String, weight: Int, temp: Double, time: Int, condition: Int, counting: Int) {
self.name = name
self.weight = weight
self.temp = temp
self.time = time
self.condition = condition
self.counting = counting
}
}
var baechu = parrot(name: "배추", weight: 95, temp: 38, time: 80, condition: 70, counting: 11)
var mungchi = parrot(name: "뭉치", weight: 115, temp: 35.5, time: 29, condition: 60, counting: 7)
// 1.
func workoutTime(codeName: parrot) {
if codeName.time >= 60 {
print("\(codeName.name)는 \(codeName.time)분 운동했습니다!\n\(codeName.name)는 운동을 많이 했습니다.")
} else {
if codeName.time < 60 {
print("\(codeName.name)는 \(codeName.time)분 운동했습니다!\n\(codeName.name)는 운동을 더 해야합니다.")
}
}
}
// 2.
func compareweight(target1: parrot, target2: parrot) {
if target1.weight > target2.weight {
print("\(target1.name)의 몸무게가 더 많이 나갑니다.")
} else if target1.weight < target2.weight {
print("\(target2.name)의 몸무게가 더 많이 나갑니다.")
} else {
print("\(target1.name)과 \(target2.name)의 몸무게는 같습니다.")
}
} // target뒤의 .name은 위의 구조체 human의 name이라는 변수를 의미하는 것이다. | 그리고 구조체 밖에 baechu와 mungghi라는 변수를 선언했고, human 구조체를 사용했다.
// 3.
func situation(codeName: parrot) {
if codeName.temp >= 36.5 && codeName.condition >= 70 {
print("\(codeName.name)는 운동이 가능한 상태입니다.")
} else if codeName.temp >= 36.5 && codeName.condition < 70 {
print("\(codeName.name)는 컨디션 문제로 운동이 불가합니다.")
} else {
if codeName.temp > 36.5 && codeName.condition >= 70 {
print("\(codeName.name)는 체온 문제로 운동이 불가합니다.")
} else {
print("\(codeName.name)는 체온과 컨디션 문제로 운동이 불가합니다.")
}
}
}
// 마지막에 else 안써서 정상작동 안했었음. 모든 경우를 구현해야지만 정상작동함
// 4.
func count(target1: parrot, target2: parrot) {
if (1...10).contains(target1.counting) {
print("\(target1.name)의 운동 횟수가 유효합니다.")
} else {
print("\(target1.name)의 운동 횟수가 유효하지 않습니다.")
}
if (1...10).contains(target2.counting) {
print("\(target2.name)의 운동 횟수가 유효합니다.")
} else {
print("\(target2.name)의 운동 횟수가 유효하지 않습니다.")
}
}
// 5.
var letsCountBaechu = (baechu.time >= 30) ? "\(baechu.name)의 운동 시간이 적절합니다." : "\(baechu.name)의 운동 시간이 부족합니다."
var letsCountMungchi = (mungchi.time >= 30) ? "\(mungchi.name)의 운동 시간이 적절합니다." : "\(mungchi.name)의 운동 시간이 부족합니다."
// 1.
workoutTime(codeName: baechu)
workoutTime(codeName: mungchi)
// 2.
compareweight(target1: baechu, target2: mungchi)
// 3.
situation(codeName: baechu)
situation(codeName: mungchi)
// 4.
count(target1: baechu, target2: mungchi)
// 5.
print(letsCountBaechu)
print(letsCountMungchi)
'개발일지' 카테고리의 다른 글
팀프로젝트 회의와 와이어프레임 작성 (0) | 2024.10.21 |
---|---|
기초 문법 복습 - String과 Character (0) | 2024.10.09 |
은행 계좌 관리 시스템을 구축해보자!(willSet, didSet) (2) | 2024.09.26 |
직사각형의 넓이와 둘레를 계산해보자. (0) | 2024.09.26 |
성적 관리 시스템 만들기 (0) | 2024.09.25 |
살아남는 iOS 개발자가 되기 위해 끊임없이 노력하고 있습니다.