24년 1월 24일 강의를 들은 내용을 기록한 글입니다.
반복문
📘break
반복문 내부에서 특정 조건이 되면 break;
를 사용해서 반복문을 종료시킬 수 있음
■ 예제
1
2
3
4
| while (1) {
if (i > 100) break; // while문 탈출
}
console.log("a는 100보다 큽니다");
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| let a = 0;
while (1) {
console.log(`a의 값은 ${a}%입니다`);
a++;
if (a > 100) break; // while문 탈출
}
console.log("a는 100보다 큽니다");
// a의 값은 0%입니다
// a의 값은 1%입니다
// a의 값은 2%입니다
// ...
// a의 값은 99%입니다
// a의 값은 100%입니다
// a는 100보다 큽니다
|
📘continue
특정조건일 때 continue 이하의 수행은 무시하고, 다시 반복의 시작점으로 감 (스킵)
■ 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| let a = 0;
while (a < 10) {
a++;
if (7 <= a && a <= 9) continue;
console.log(`a의 값은 ${a}%입니다`);
if (a > 10) break; // while문 탈출
}
console.log("a는 10보다 큽니다");
// a의 값은 1%입니다
// a의 값은 2%입니다
// a의 값은 3%입니다
// a의 값은 4%입니다
// a의 값은 5%입니다
// a의 값은 6%입니다
// a의 값은 10%입니다
// a는 10보다 큽니다
|
■ 평가문제
구구단을 출력하되, 짝수단(2,4,6,8단)만 출력하는 프로그램을 만들어라. 단, continue문을 사용할 것
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| let x = 1;
while (x < 9) {
x++;
if (x % 2 !== 0) continue;
let y = 1;
while (y < 10) {
console.log(` ${x} x ${y} = ${x * y}`);
y++;
}
}
// 2 x 1 = 2
// 2 x 2 = 4
// ...
// 4 x 1 = 4
// 4 x 2 = 8
// ...
// 6 x 1 = 6
// 6 x 2 = 12
|
함수
📘함수 사용 목적
- 나누어서 처리하기 위한 목적
- 코드의 가독성 향상
- 코드의 유지보수 및 확장 용이
📘함수의 종류
■ 표준함수
■ 사용자 정의 함수
- 사용자가 자신이 원하는 기능을 직접 만들어 사용하는 함수
- 표준함수의 기능에는 한계가 있기 때문에
📘함수 형태
- 데이터 타입: 함수가 리턴하는 값의 타입
- 함수이름: 함수 기능과 밀접한 이름으로 만드는 것이 좋음
- 인수목록: 함수에 필요한 값을 전달할 때 사용
- 함수내용: 중괄호
{}
사이 안에 작성
1
2
3
4
| // c 언어
자료형 함수이름(인수) {
// 함수내용
}
|
1
2
3
4
| // javascript
function 함수이름(인수) {
// 함수내용
}
|
■ 예제 - 더하기 기능 함수
1
2
3
4
5
| // c 언어
int Add(int a, int b) {
return a + b
}
|
1
2
3
4
5
| // javascript
function Add(a, b) {
return a + b;
}
console.log(Add(10, 20)); // 30
|
📘void 타입
결과를 리턴하지 않는 함수
■ 평가문제
1. 사각형 넓이를 구하는 함수를 작성해보자
사각형의 넓이는 가로의 길이 * 세로의 길이를 구하면 된다. 사용자로부터 두 정수를 각각 입력 받아 함수의 전달인자로 전달하고 사각형의 넓이를 출력하는 함수를 작성하자
1
2
3
4
5
| function calcArea(a, b) {
return a * b;
}
console.log(calcArea(2, 5)); // 10
|
2. 두 수를 비교하여 최대값과 최소값을 구하는 함수를 작성해보자
1
2
3
4
5
6
7
8
9
| function minAndMax(a, b) {
if (a > b) {
return console.log(`최대값: ${a}, 최솟값: ${b}`);
} else {
return console.log(`최대값: ${b}, 최솟값: ${a}`);
}
}
minAndMax(5, 3); // 최대값: 5, 최솟값:
|
3. 사용자가 입력한 금액에 따라 커피의 종류를 출력하는 함수를 작성해보자
- 100원을 넣으면 “블랙커피” 출력
- 200원을 넣으면 “밀크커피” 출력
1
2
3
4
5
6
7
8
9
10
11
12
| function coffeeMachine(price) {
switch (price) {
case 100:
return "블랙커피";
case 200:
return "밀크커피";
default:
return "100원과 200원만 넣어주세요";
}
}
console.log(coffeeMachine(100)); // 블랙커피
console.log(coffeeMachine(200)); // 밀크커피
|
변수의 범위
📘지역변수
- 같은 이름이어도 다른 영역의 함수에 속해있으면 독립된 다른 변수
- 스택 구조로 저장됨
- 호출된 순서 역순으로 소멸됨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| function main() {
const val = 0;
console.log("지역 영역: main");
func1();
}
function func1() {
const local = 0;
console.log("지역 영역: func1");
func2();
}
function func2() {
const local = 0;
console.log("지역 영역: func2");
}
|
📘전역변수
- 함수 바깥쪽에 선언된 변수
- 프로그램이 시작할 때 메모리 상에 저장이 되고, 프로그램이 종료될 때 메모리 상에서 소멸됨
1
2
3
4
5
6
7
8
9
10
| // c 언어
void Add(int a, int b) {
global a + b
}
int main(){
int a = 10;
int b = 20
Add(a,b);
printf("%d\n",global)
}
|
📘static 변수
- 정지된, 고정상태라는 의미
- 지역변수처럼 중괄호 영역에서 선언되지만, 중괄호를 벗아니더 메모리 상에 고정되어 소멸되지 않음
- 한번 생성이되면 소멸되지 않다가 프로그램이 종료될 때 소멸됨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| #include <stdio.h>
void func(void){
int value = 0;
value++;
printf("%d\n",value); // 1 1 1 1 1
}
int main(){
int i = 0;
while(i < 5){
func();
i++;
}
return 0;
}
|
- 함수가 호출되는 횟수를 출력하고 싶었으나,
func
의 value가 매번 0으로 초기화되기때문에 1만 출력이됨 - value 앞에
static
을 작성해 static 변수로 만들면 함수가 호출되는 횟수가 제대로 출력됨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| #include <stdio.h>
void func(void){
static int value = 0;
value++;
printf("%d\n",value); // 1 2 3 4 5
}
int main(){
int i = 0;
while(i < 5){
func();
i++;
}
return 0;
}
|
■ 평가문제
책읽기 마라톤 기능을 가진 프로그램을 구현해보자.
책읽기 마라톤이란 내가 읽은 책들의 페이지 수를 누적 계산하는 기능이다. 그날 그날 읽은 책들의 페이지 수를 사용자로부터 입력받으면 최종 누적된 페이지 수에 새로 입력된 페이지 수가 추가로 더해지고, 다시 갱신된 최종 페이지 수가 출력되는 것이다. 한번의 출력이 끝나면 다시 읽은 책의 페이지 수를 사용자로부터 입력받고, 누적된 최종 페이지 수를 출력한다. 이 과정을 사용자가 -1을 입력할 때까지 계속 반복한다.
- page 여러개 한꺼번에 입력받아서 계산하는 함수
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| const inputs = [30, 20, 40, -1];
function solution(input) {
let count = 0;
input.forEach((page) => {
console.log(`읽은 책의 페이지 수 ${page}`);
if (page === -1) return console.log("더 분발하세요");
count += page;
console.log(`최종 누적 페이지 수 ${count}`);
});
}
solution(inputs);
// 읽은 책의 페이지 수 30
// 최종 누적 페이지 수 30
// 읽은 책의 페이지 수 20
// 최종 누적 페이지 수 50
// 읽은 책의 페이지 수 40
// 최종 누적 페이지 수 90
// 읽은 책의 페이지 수 -1
// 더 분발하세요
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| const inputs = [30, 20, 40, -1];
let count = 0;
function solution(page) {
console.log(`읽은 책의 페이지 수 ${page}`);
if (page === -1) return console.log("더 분발하세요");
count += page;
console.log(`최종 누적 페이지 수 ${count}`);
}
inputs.forEach((input) => {
solution(input);
});
|
배열
- 같은 속성을 가진것들을 나열해 놓은 것
- 요소가 순서대로 모여있는 것
📘배열의 선언 구조
- 배열의 타입:배열 요소들의 타입
- 배열 이름: 각 배열 요소에 접근하기 위한 배열 이름
- 배열 길이: 변수의 개수
1
2
3
4
| int arr[5]
// - 배열의 타입: int
// - 배열 이름: arr
// - 배열 길이: 5개
|
📘배열의 초기화
- 보통은 배열의 길이 생략
- 초기값의 개수를 보고 컴파일러는 배열의 길이를 계산함
1
| int arr[] = {1,3,5,7,9}
|
1
| int arr[5] = {1,3,5,7,9}
|
■ 예제
1
2
3
4
5
6
7
8
9
10
11
12
| int main()
{
int total = 0;
int arr[5] = { 1, 2, 3, 4, 5};
int i = 0;
while(i < 5){
total += arr[i];
i++;
}
printf("%d\n",total);
return 0;
}
|
📘배열의 복사
- 같은 타입끼리 복사가 가능
- 배열도 배열끼리 복사가 가능
- 배열의 요소끼리 복사를 해야함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| int main()
{
int i;
int arr1[5] = { 1, 2, 3, 4, 5};
int arr2[5];
for(i = 0; i <5;i++){
arr2[i]= arr1[i];
}
for (i = 0; i < 5; i++) {
printf("arr1[i]: %d\n", arr1[i]);
printf("arr2[i]: %d\n", arr2[i]);
}
return 0;
}
|
1
2
3
4
5
6
7
8
9
| // Error! assignment to expression with array type
int main()
{
int arr1[5] = { 1, 2, 3, 4, 5};
int arr2[5];
arr2 = arr1;
return 0;
}
|
■ 평가문제
앞에서 작성한 예제를 참고하여 배열 arr1의 값을 배열 arr2에 복사하되, 배열 요소를 역순으로 저장하도록 하고, 복사된 arr2의 요소값을들 출력하도록 하라.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| int main()
{
int i;
int j = 4;
int arr1[5] = { 1, 2, 3, 4, 5};
int arr2[5];
for(i = 0; i <5 ;i++){
arr2[j]= arr1[i];
j--;
}
for (i = 0; i < 5; i++) {
printf("%d\n", arr2[i]);
}
return 0;
}
|
📘문자열 변수
1
| char str[] = "Hello World";
|
■ 예제
1
2
3
4
5
6
| int main()
{
char str[] = "Hello World";
printf("%s\n",str); // Hello World
return 0;
}
|
■ null 문자가 필요한 이유?
- 문자열 끝에는 null문자가 반드시 추가됨
- 사람은 문자와 쓰레기값을 구분하지만, 컴퓨터는 구분이 불가능
- 컴퓨터가 문자열의 끝을 인식하기 위해 null을 표시함
1
2
| "Beautiful"의 공간은 9개가 아니라, 10개
-> Beautiful\0
|
포인터
- 변수의 메모리 주소를 저장하는 변수
- 메모리: 주소를 통해 메모리에 접근하여 값을 읽고 쓸 수 있음
사용방법
- 포인터변수 선언할 때 일반 변수명 앞에
*
기호 붙이기 &
기호를 사용하여 변수의 주소값을 얻을 수 있음
1
2
| int b = 100;
int *pb = &b;
|