각 요소들을 객체(Object)로 만든 후, 객체들을 조립해서 소프트웨어를 개발하는 기법이다. 쉽게 생각해서 컴퓨터로 예를 들면 컴퓨터의 모든 부품을 적절히 연결하고 조립해서 컴퓨터가 제대로 작동하도록 만드는 것이라고 볼 수 있다.
"학생이 밥을 먹는다"라는 예문을 생각해보자. 학생이라는 객체와 밥이라는 객체가 협력해서 문장이 구현이 된다. 객체 지향 프로그래밍도 마찬가지로 각 객체가 어떤 기능을 제공하고 객체 간 협력을 어떻게 구현할 것인지 생각해야한다.
출처 : Do it! 자바 프로그래밍 입문-박은종
2. 클래스
앞서 1탄에서 자바 프로그램은 클래스 단위이기 때문에 자바 프로그램을 만드는 것은 자바 클래스를 만드는 것과 같다고 하였다. 그렇다면 클래스는 뭘까
클래스는 공통된 연산을 갖는 객체의 집합이다
C언어에서 구조체랑 비슷하다.
C언어에서 구조체는 여러가지 자료형을 한번에 관리하기 위해 사용한 것이라면 Java에서 클래스는 여러가지 자료형과 함수(자바에서는 메서드라고 부름)를 한번에 관리하기 위해서 사용한다.
간단하게 예를 들어 생각해보자.10이라는 자료를 변수로 저장하고 싶다면 자료형을 뭘로 해야할까?int형 같은 정수형 자료형을 사용하면 될 것이다.그렇다면 책이라는 것을 변수로 저장하려면 자료형을 뭘로 해야할까?그럴때 나오는 개념이 바로 클래스이다.
책이라는 객체안에는 제목, 가격, 출판사, 저자등의 다양한 자료들이 들어가 있다.
자바에서는 아래와 같이 클래스라는 녀석을 이용해서 서로 다른 자료형들과 함수(자바에서는 메서드)를 한꺼번에 담는다.
public class Book{
public String title;
public int price;
public String company;
public String author;
}
위의 예시에서 title, price, company, author같이 클래스안에 들어있는 변수를 필드 또는 멤버변수 또는 객체변수 또는 속성 또는 인스턴스 변수라고 한다
<Book>
String title
int price
String company
String author
위와 같은 느낌으로 생성된다.
3. 메서드
클래스에 포함되는 함수를 메서드라고 한다
일단 함수는 C언어에서도 봤었다.
형태는 거의 동일하다
아래 예시에서
int는 반환값
add는 메서드 이름
int a, int b는 매개변수이다.
int add(int a,int b) {
return a+b;
}
4. 자바의 메모리 구조와 변수
아래 예문의 출력 결과를 예상해보자.
package test;
public class Test {
public static void main(String[] args) {
int a=3;
System.out.println(hello(a));
System.out.println(a);
}
public static int hello(int a) {
a=7;
return a;
}
}
// 클래스 블록
public class 클래스명 {
// 메서드 블록
public static void main(String[] args) {
System.out.println("Hello java");
}
//public이 접근제어자
//static이 정적메서드와 변수
//void가 리턴자료형
//main은 메서드명
//String[] arg는 메서드의 매개 변수
}
소스코드의 가장 바깥쪽 영역은 클래스 블록이다. 클래스명은 원하는 이름으로 지을 수 있다. 단, 클래스명은 소스파일의 이름(클래스명.java)과 동일하게 사용해야 한다.
자바 프로그램은 클래스 단위이기 때문에 자바 프로그램을 만드는 것은 자바 클래스를 만드는 것과 같다.
이제 메서드블록을 살펴보자.
1) 접근 제어자
메서드 블록 부분에서 public이라고 되어 있는 부분은 접근제어자라고 하는데 이 자리에는 public, private, protected 또는 아무것도 오지 않을 수 있는데 지금은 이런게 있다고만 알고 넘어가자.
2) 정적메서드와 변수
그 다음은 static 키워드가 올수도 있고 오지 않을 수도 있다는 의미이다. static 이라는 키워드가 붙게 되면 static 메서드가 되는데 이것도 일단 이런게 있다고 알고 넘어가자.
3) 리턴자료형
그 다음 void는 메서드가 실행된 후 리턴되는 값의 자료형을 의미한다.
리턴값이 있을 경우에는 반드시 리턴 자료형을 표기해야 하며 만약 리턴값이 없는 경우라면 void 로 표기해야 한다. 이 항목은 둘 다 생략할 수는 없고 void 또는 리턴자료형이 반드시 있어야만 한다.
4) 메서드
메서드는 클래스에 포함되는 함수를 말하며 메서드명은 원하는 이름으로 지을수 있다.
메서드 명 이후의 괄호() 안의 값들은 메서드의 입력 인자를 뜻한다.
입력 인자의 갯수는 제한이 없으며 입력 인자는 "입력자료형"+"매개변수명" 형태로 이루어 진다.
String[] args는 메서드의 매개 변수이다. String[]은 배열 자료형이란 의미이고, args는 String[]자료형에 대한 변수명이다. args라는 이름은 인수를 의미하는 arguments의 약어로 관례적인 이름이다. args 대신 다른 이름을 사용해도 상관없다.
[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음 C언어 기출문제 모음 비전공자용 C언어 요약 1탄 비전공자용 C언어 요약 2탄(조건문, 반복문, 배열) 비전공자용 C언어 요약 3탄(함수, 포인터) 비전공자용 C언어 요약 4탄(포인터 심화, 구조체)
목차 1. 포인터와 1차원 배열 2. 포인터와 2차원 배열 3. 포인터와 문자 배열 4. 포인터와 문자열 배열 5. 함수 심화(Call by Value, Call by Reference) 6. 구조체
1. 포인터와 1차원 배열 우선 배열의 이름은 배열의 시작주소이다.
아래 예문을 보자.
#include <stdio.h>
int main() {
int array[3] = { 10,20,30 };
printf("%x %x %x \n", array, array + 0, &array[0]); //배열 0번째 요소의 주소 출력
printf("%d %d %d \n", *array, *(array + 0), *&array[0]); //배열 0번째 요소의 값 10 출력
}
*array는 array(배열 이름) 주소가 가리키는 값인 10이 출력된다 *(array+0)은 array주소에 0칸 이동한 주소가 가리키는 값인 10이 출력된다 *&가 동시에 있으면 생략이 가능하다. 즉 *&arr[0]=array[0] 따라서 역시 배열의 0번째 인덱스인 10이 출력된다
결국 array==array+0==&array[0]이라는 의미이다
다만 여기서 주의점은 int형 배열이라 요소 1개의 크기는 4바이트이고 array,array+0, &array[0]으로 출력되는 값은 동일하지만 array만 0번째 요소가 아니라 배열 전체를 가리키기 때문에 12바이트(int형이 3칸있으니 12바이트)가 된다
다음과 같이 포인터변수 p에 array(배열이름)으로 배열의 시작주소를 저장하면 포인터변수를 배열처럼 사용할 수 있다 아래 예문은 위의 예문과 결과값이 100% 동일하다
#include <stdio.h>
int main() {
int array[3] = { 10,20,30 };
int* p = array; //포인터 변수에 배열의 시작 주소를 저장
printf("%x %x %x \n",p,p+0,&p[0]); //배열 0번째 요소의 주소 출력
printf("%d %d %d \n", *p,*(p+0),*&p[0]); //배열 0번째 요소의 값 출력
}
다 필요없고 위 같은 경우 포인터변수 p랑 array랑 똑같다고 생각해주면 된다
2. 포인터와 2차원 배열 1차원배열에서는 *(array+i)==array[i]==*&array[i]는 값이라고 배웠는데 2차원 배열에서는 *(array+i)==array[i]==*&array[i]가 주소를 가리킨다
int array[2][3] = { 10,20,30,40,50,60 }라는 2차원 배열이 있을 때 테이블 같은 구조를 연상하지만 실제는 일직선으로 나란히 돼있는 것을 일단 상기시키고 가보도록 하자.
2차원배열에서도 1차원배열에서 처럼 &array[0][0] 이런식으로 하면 각 배열의 요소의 주소, *&array[0][0] 하면 각 배열의 요소의 값이 잘 출력된다.
그렇다면 아래 예문은 어떤 결과가 나올까?
#include <stdio.h>
int main() {
int array[2][3] = { 10,20,30,40,50,60 };
(1)printf("%x\n", array);
(2)printf("%x\n", array[0]);
(3)printf("%x\n", *(array + 0));
(4)printf("%x\n", &array[0][0]);
(5)printf("%x\n", array+1);
(6)printf("%x\n", array[1]);
(7)printf("%x\n", *(array + 1));
(8)printf("%x\n", &array[1][0]);
(9)printf("%d\n",sizeof(&array[0][0])); //4 출력(32비트 운영체제의 경우)
//64비트 운영체제의 경우 8로 출력된다
(10)printf("%d\n", sizeof(array[0])); //12 출력
(11)printf("%d\n", sizeof(array)); //24 출력
}
(1)~(4)까지는 array[0][0]의 주소를 출력하고 (5)~(8)까지는 array[1][0]의 주소를 출력한다
결과값은 동일하지만 4번과 8번의 경우는 arr[0][0], array[1][0] 처럼 특정한 요소의 주소를 가리키지만 나머지는 아래 그림과 같이 특정행을 가리킨다. 따라서 (9)는 특정요소를 가리키므로 4가 출력되고 (10)은 행을 가리키므로 12가 출력되고 (11)은 배열 전체를 가리켜서 24가 출력된다
*(array + 0)이 형태만 조금 더 살펴 보자 먼저 array는 배열 전체를 가리키지만 위치는 array[0][0] 시작주소에 가 있다
두번째 *(array+0)는 array에서 +0한 곳의 값을 읽는 것인데 2차원배열에서는 이 값이 행의 주소를 가리킨다 배열에서 특정 행을 가리키지만 위치는 array[0][0] 시작주소에 가 있다
세번째 array[0]+0은 배열에서 특정 행의 특정 요소 가리키지만 역시 위치는 array[0][0] 시작주소에 가 있다 따라서
모두 출력되는 값은 동일하지만 크기는 다르다 이해한 것을 토대로 아래 출력결과를 예상해보자.
하나도 이해가 안된다면 그냥 외우면된다. 1차원 배열에서는 값을 가리켰던 녀석들이 2차원 배열에서는 주소를 가리키는 것이다
1차원 배열과 동일하게 2차원 배열도 포인터를 써서 똑같이 쓸 수 있지 않을까? 생각할 수있지만 아래처럼 코드를 짜면 에러가 난다. int *p는 1차원 포인터 변수이므로 2차원 배열을 저장해도 1차원처럼 작동되기 때문이다. 따라서 이 경우에 필요한 것이 바로 배열 포인터이다.
#include <stdio.h>
int main() {
int array[2][3] = { 10,20,30,40,50,60 };
int* p = array;
printf("%d\n",p[0][0]);
return 0;
}
2-1.배열 포인터 배열 포인터는 배열을 가리키는 포인터 변수이다. 배열 포인터는 다음과 같이 선언한다.
앞에 int는 자료형이고 (*p)는 배열 포인터 변수 이름이고 [3]은 열 길이이다 이렇게 배열포인터로 선언을 하면 2차원 배열처럼 포인터도 접근할 수 있게 된다
#include <stdio.h>
int main() {
int array[2][3] = { 10,20,30,40,50,60 };
int(* p)[3] = array; //포인터 변수에 배열의 시작 주소를 저장
printf("%d\n", array[0][0]);
printf("%d\n",p[0][0]);
return 0;
}
2-2 포인터 배열 주소를 저장하는 배열
포인터 배열은 다음과 같이 선언한다
앞에 int*는 자료형이고 pointer는 포인터배열 변수 이름이고 [3]은 배열 길이이다
#include <stdio.h>
int main() {
int a = 10, b = 20, c = 30;
int* p[3] = {&a,&b,&c};
printf("%d\n", *p[0]);
printf("%d\n", *p[1]);
printf("%d\n", *p[2]);
printf("%d\n", **(p+0));
printf("%d\n", **(p+1));
printf("%d\n", **(p+2));
return 0;
}
#include <stdio.h>
int main() {
char array[4] = "ABC";
printf("%s\n", array); //ABC 출력
printf("%s\n", array+1); //BC 출력
printf("%s\n", array+2); //C 출력
return 0;
}
이런 문자열을 배열이 아니라 포인터로 바꾸면 아래와 같다
#include <stdio.h>
int main() {
char array[4] = "ABC"; //배열 방식
printf("%s\n", array);
printf("%s\n", array+1);
printf("%s\n", array+2);
char* p = "ABC"; //포인터방식
printf("%s\n", p);
printf("%s\n", p + 1);
printf("%s\n", p + 2);
return 0;
}
5. 함수 심화(Call by Value, Call by Reference)
함수에서 이때 까지 사용했던 방식이 Call my Value인데 그것은 값을 복사하는 방식이다.
#include <stdio.h>
int func(int);
int main() {
int a = 10;
printf("%d\n",func(a)); //11출력
printf("%d\n",a); //10출력
return 0;
}
int func(int a) {
a = a + 1;
return a;
}
main 함수에서 변수 a를 선언하면서 초기화 한 후 a변수를 인수로 전달하면서 매개변수 a로 값이 복사된다 값을 복사하는 방식으로 main()함수의 지역변수 a 값 변동에는 영향을 미치지 않는다
다음은 새로 배우게 될 Call by Reference(주소 참조) 방식이다 주소를 인수로 받아서 값을 바꾸기 때문에 main()함수의 지역변수 a에도 영향을 미친다
#include <stdio.h>
int func(int*);
int main() {
int a = 10;
printf("%d\n",func(&a)); //11 출력
printf("%d", a); //11 출력
return 0;
}
int func(int* a) {
*a = *a + 1;
return *a;
}
int func(int* a)인 이유는 주소를 전달받기 때문이다 쉽게 생각해서 포인터변수를 선언할 때 int *p=&a; 이런식으로 선언하는 것을 생각하면 된다 주소를 받기 때문에 함수의 매개변수 형태가 포인터변수가 되는 것이다
6. 구조체 하나 이상의 변수를 묶어 그룹화하는 사용자 정의 자료형이다 배열이 같은 자료형만 담을 수 있다면 구조체는 다른 자료형도 담을 수 있다
아래와 같은 형식으로 구조체를 정의한다 struct : 구조체 키워드 student : 구조체 이름
int score, char name은 구조체 멤버 변수
struct student
{
int score;
char name;
};
구조체 정의를 하고 구조체 변수 선언을 동시에 하는 방법은 아래와 같다.
struct student
{
int score;
char name;
}p1, p2, p3;
따로 선언하는 방식은 아래와 같다.
#include<stdio.h>
struct student
{
int score;
char name;
};
int main(){
struct student p1, p2, p3;
return 0;
}
구조체 변수에 .(도트 연산자)를 이용하면 각 변수별 멤버변수에 접근할 수 있다 p1.score이라고 하면 p1의 score에 접근이 가능해지며 p1.score=30; 이라고 하면 p1.score 자리에 30이 저장된다
#include<stdio.h>
struct p {
int* x;
int* y;
};
int main(){
int a = 5;
int b = 4;
struct p p1;
p1.x = &a;
p1.y = &b;
printf("%d %d\n", a, b);
printf("%d %d\n", *p1.x, *p1.y);
return 0;
}
함수에서 사용되는 변수는 지역 변수, 전역 변수, 정적(static) 변수, 외부(extern) 변수, 레지스터(register) 변수가 있다.
이 중에 지역 변수, 전역 변수, 정적(static) 변수만 공부해보도록 하자.
1) 지역 변수(Local Variable)
main() 함수, 조건문, 반복문의 중괄호({}) 내부와 함수의 매개 변수(Parameter)로 사용되는 변수를 의미한다
아래의 예문 출력결과가 무엇인지 예측 해보자.
#include<stdio.h>
int hello(void);
int main() {
int k = 20;
printf("%d\n",hello());
printf("%d", k);
return 0;
}
int hello(void) {
int k = 100;
return k;
}
#include<stdio.h>
int hello(void);
int main() {
int k = 20;
printf("%d\n",hello()); //100출력
printf("%d", k); //20 출력
return 0;
}
int hello(void) {
int k = 100;
return k;
}
위 예문을 보면 int k=20으로 초기화를 시킨후 hello라는 함수를 호출해서 k는 100이라고 바뀐줄 알았는데 그게 아니고 20이 그대로 호출되었다.
즉, main()함수의 k와 hello()함수의 k는 다르다는 것이다.
심도있게 알기 위해서는 메모리에 대해 알아야한다.
지역변수라서 함수가 종료되면 메모리 공간이 소멸된다.
2) 전역 변수(Global Variable)
중괄호 외부에 선언되는 변수로 어느 지역에서도 사용이 제한되지 않는 프로그램 어디에서든 접근이 가능한 변수이다
중괄호가 시작되면 메모리가 생성되고 해당 중괄호에서 빠져나오면 메모리가 소멸되는 지역변수와 달리 전역변수는 프로그램이 시작되면 메모리에 생성되고 프로그램이 종료되면 메모리가 소멸된다
그래서 전역 변수는 프로그램이 종료되지 않는 한 계속해서 메모리에 존재하고 영역에 제한받지 않으며 사용된다
그리고 전역 변수는 초깃값을 지정해주지 않아도 자동으로 값을 0으로 가진다.
전역 변수의 잘못된 사용과 남용은 공유 자원에 대한 잘못된 접근으로 부작용을 낳을 수 있는데 시스템의 변경과 유지 보수를 어렵게 하는 원인이 될 수있으므로 전역 변수의 사용은 최대한 피하는 것이 바람직하다
3) 정적 변수(Static)
전역 변수의 단점을 부분적으로 보완한 변수
정적변수는 변수의 자료형 앞에 static 키워드를 넣어서 만든다
static int a;
정적 변수는 전역 변수처럼 프로그램이 종료되지 않는 한 메모리가 소멸되지 않고 초깃값을 지정하지 않아도 자동으로 0으로 가지며 또한 정적 변수는 초기화가 단 1회만 수행된다.
다음 수행결과가 무엇일지 생각해보자.
#include<stdio.h>
void hello(void);
int main() {
int k = 20;
hello();
hello();
hello();
return 0;
}
void hello(void) {
static k = 1;
int t = 0;
k++;
t++;
printf("%d %d\n", k, t);
}
static 변수 k는 한번만 초기화되므로 k가 정상적으로 계속 증가하는 것을 볼 수 있지만
지역변수 t는 계속 초기화가 진행이 돼 모든 값이 1임을 확인할 수 있다.
3. 재귀함수(Recursive Function)
함수 내에서 자기 자신을 호출하는 함수
재귀 함수의 경우 계속적인 자기 자신의 함수 호출로 시간과 메모리 공간의 효율이 저하될 수 있다.
다음 코드의 결과값을 생각해보자.
#include<stdio.h>
int fact(int);
int main() {
int a=4;
printf("%d",fact(a));
return 0;
}
int fact(int n) {
if (n <= 1)
return 1;
else
return n * fact(n-1);
}
포인터 변수의 크기는 주소를 가리키기 때문에 항상 4byte의 동일한 크기를 가진다. (32bit 운영체제 한정)
1) 주소 연산자(&) 주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의주소값을 반환한다.
2) 참조 연산자(*) 참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가리키는주소에 저장된 값을 반환한다.
dereference라고 하여 역참조연산자라고도 한다.
다 필요없고 포인터는 하나만 알면 된다.
*p는 선언할 때를 제외하고 무조건 값을 가리킨다고 생각하면 되고 &는 주소를 가리킨다고 생각하면 된다.
아래는 대충 이해를 돕기위해 만든 표이다. (주소는 그냥 임시로 준 값이다)
#include <stdio.h>
int main() {
int a=3;
int b=&a;
int *c=&a;
printf("%d\n",a); //그냥 변수 a를 출력
printf("%d\n",b); //b에 저장된 a의 주소의 값을 출력
printf("%d\n",c); //포인터 변수 c에 저장된 a의 주소 출력
printf("%d\n",*c); //포인터 변수 c에 저장된 a의 주소의 값 출력
return 0;
}
1. 다음은 MySQL을 이용하여 회사 사원의 인적 사항을 관리하기 위한 DB 테이블(테이블명 : worker)의 구조이다.
필드명
데이터형
null
추가 사항
설명
num
int
not null
primary key, auto_increment
일련번호
id
char(20)
not null
아이디
name
char(10)
not null
이름
gender
char(1)
not null
성별(남성: M, 여성 : F)
age
int
not null
나이
department
char(20)
not null
근무 부서
phone
char(20)
not null
휴대전화 번호
address
char(100)
집 주소
① worker 테이블을 일괄 생성하기 위한 worker.sql 파일의 빈칸을 채우시오.
create (가) worker ( num int not null (나), id char(20) not null, name char(10) not null, (다) char(1) not null, age int, department char(20) not null, phone char(20) not null, (라) char(100), primary key ( 마 ) );
3. 다음은 회사 사원의 인적 사항을 관리하기 위한 DB 테이블(테이블명: employee)의 구조이다.
필드명
데이터형
설명
num
int
일련번호
id
char(20)
아이디
name
char(10)
이름
gender
char(1)
성별(남성: M, 여성: F)
age
int
나이
department
char(20)
근무 부서
hp
char(20)
휴대전화 번호
address
char(100)
집 주소
① employee 테이블을 생성하는 명령의 빈칸을 채우시오.
create table employee( num int, (가) char(20), name char(10), gender (나), age int department char(20), (다) char(20), address char(100), primary key( (라) ) );
② employee 테이블의 구조를 보는 데 사용하는 명령을 쓰시오.
③ employee 테이블에 email 필드를 char(30) 데이터형으로 추가하는 명령을 쓰시오.
#include<stdio.h>
int main() {
int a = 8, b = 5;
if (a > b)
a = a + b;
else
a = a - b;
printf("%d\n", a);
return 0;
}
비트연산자에서 봤듯이 조건문에서도 연산자가 있다. &&, ||
&&는 2개의 조건이 모두 참이어야 참(1)을 반환한다
||는 2개의 조건중 하나만 참이어도 참(1)을 반환한다
if외에도 또 다른 조건을 추가하고 싶을 때는 else if를 쓰기도 하고 그냥 if를 더 써주기도 하는데
if-else if-else의 경우에는 조건문중 해당하는 1개만 실행되는 반면
if-if-if의 경우에는 해당 조건에 맞는 모든 조건문이 전부 실행된다.
#include<stdio.h>
int main() {
int a = 90;
int count = 0;
if (a >= 90)
count++;
else if (a >= 80)
count++;
else if (a >= 70)
count++;
else
count++;
printf("%d", count);
return 0;
}
#include<stdio.h>
int main() {
int a = 90;
int count = 0;
if (a >= 90)
count++;
if (a >= 80)
count++;
if (a >= 70)
count++;
printf("%d", count);
return 0;
}
#include<stdio.h>
int main() {
int num = 3;
switch (num) {
case 1:
printf("k");
case 2:
printf("o");
case 3:
printf("re");
default :
printf("a");
}
return 0;
}
#include<stdio.h>
int main() {
for (int i = 0; i <= 5; i++) {
printf("%d", i);
}
return 0;
}
위 for문은 따라서 012345가 출력이 된다
다음은 while문이다
while 오른쪽 괄호에 조건식을 넣어준다
i가 5이하일때까지 반복해라
그리고 while문은 증감값을 출력문 아래에 적어준다.
출력결과는 012345이다
#include<stdio.h>
int main() {
int i = 0;
while (i <= 5){
printf("%d", i);
i++;
}
return 0;
}
break를 이용해 해당 조건일 경우 while문이 종료되도록 해줄 수도 있다
아래는 0만 출력된다
#include<stdio.h>
int main() {
int i = 0;
while (i <= 5){
if (i %2==1) break;
printf("%d", i);
i++;
}
return 0;
}
또한 continue라는 키워드를 통해 실행문을 실행하지 않고 건너 뛰라고 할 수도 있다
예를 들어 i==1에서 continue를 만났으면 i==1에서 실행될 예정이었던 모든 구문이 건너뛰기 되고 i==2구문이 시작된다
아래처럼 하면 024가 출력이 된다
#include<stdio.h>
int main() {
int i = 0;
while (i <= 5) {
if (i % 2 == 1) {
i++;
continue;
}
printf("%d", i);
i++;
}
return 0;
}
for 문은 반복횟수를 알고 있을 때, while 문은 반복 조건위주에 따라 반복할 때 사용된다.
마지막으로 do-while문이다
조건에 따라 반복을 계속할지를 결정할 때 사용하는 것은 while 문과 동일한데
조건 중괄호 {} 블럭을 한번 실행하고, 조건을 검사하여 반복을 결정한다
#include<stdio.h>
int main() {
int i = 0;
do {
printf("%d", i);
i++;
} while (i <= 5);
return 0;
}
출력결과는 012345이다
반복문이 중첩될 수 도 있다
그것을 중첩반복문이라고 한다.
간단한 예시를 보겠다.
아래는 이중 for문이다.
#include<stdio.h>
int main() {
int k = 1;
for (int i = 1; i <= 3; i++) {
for (int j = k; j <= k+2; j++) {
printf("%d ", j);
}
printf("\n");
k += 3;
}
return 0;
}
#include<stdio.h>
#include<string.h>
int main() {
char a[6] = "KOREA";
int b = 0;
b = strlen(a);
for (int i = 0; i < b; i++) {
printf("%c", a[i]);
}
return 0;
}
#include<stdio.h>
int a[5][5];
int main() {
int i, j, k = 1;
for (i = 0; i < 5; i++) {
for (j = 4; j >= 0; j--) {
a[i][j] = k;
k++;
}
}
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
printf("%3d", a[i][j]);
}
printf("\n");
}
return 0;
}
#include<stdio.h>
int main() {
int a = 10;
int b = 15;
int c = a++ + --b;
int d = ++a + b--;
printf("%d\n",a);
printf("%d\n", b);
printf("%d\n", c);
printf("%d", d);
return 0;
}