SturdyCobble's Study Note

[프로그래밍] 3.4 제어문(4) - for (each)문 본문

휴지통/['19.06-'20.07]프로그래밍101

[프로그래밍] 3.4 제어문(4) - for (each)문

StudyingCobble 2019. 8. 11. 22:38

NOTICE : 독학인 만큼, 잘못된 내용이 있을 수 있습니다. 내용 지적은 언제나 환영합니다.

더 이상 이 블로그에는 글을 올리지는 않을 예정입니다. 그렇지만 댓글을 달아주시면 최대한 답변드리고자 노력하겠습니다.


 

 

※이 글은 프로그래밍 언어에 대한 기초적인 이해를 가정하고 있습니다. 최소 프로그래밍 언어 하나 정도를 약간이라도 접해보시는 것을 추천합니다. 또한, 이 글은 심화 내용은 되도록 피하여 서술했습니다.

 

for문이라는 반복문은 while문과 비슷하지만, 여러가지 차이점을 같고 있습니다. 심지어 언어마다도 for문의 사용법이 차이가 있는데요, C에서 사용하는 for문을 그냥 for문으로, Python에서 사용하는 for문을 (for키워드를 사용하지만) for each문이라고 분류하여 설명하겠습니다. (Java에는 두 문법이 모두 존재합니다. C++은 C++11에서 추가되었습니다.)

 

C/C++/Java의 for문은 다음과 같습니다. 제어 변수의 초기 조건을 정해주고, 제어 변수가 얼마만큼 증가 또는 감소될 것인지를 결정하면, 조건식이 성립하는 동안(for) 반복됩니다.

for(제어변수 초기조건;조건식;증감식){
	실행 내용;
}

 참고로 if문과 마찬가지로 실행 내용이 한 문장뿐이면, 중괄호가 필요없습니다. (while, do~while문도 마찬가지 입니다.)

 

 이때, for문 안에 변수를 선언하는 것도 가능합니다.(C/C++의 경우 컴파일러에 따라 지원하지 않을 수 있습니다. 이는 초기의 C언어 문법이 변수를 무조건 블록의 앞에만 선언하도록 하였기 때문입니다.)

 

 아래 예시는 1부터 10까지의 수의 합을 계산하는 예시입니다. 

 

int sum = 0;
for(int i = 1; i <= 10 ; i++){
	sum = sum + i;
}

위 예시는 i가 1일때부터, i가 10일때 까지 반복하여 sum에 i를 더하므로 1+2+3+ ... +10 = 55가 sum에 저장됩니다.

 

반대로 10부터 더하고 싶다면, (결과는 같겠지만) 다음과 같이 작성할 수 있습니다.

int sum = 0;
for(int i = 10; i >= 1 ; i--){
	sum = sum + i;
}

 

만약 무한 반복을 하고 싶다면 다음과 같이 간단하게 작성할 수 있습니다.

for(;;){
	반복할 내용;
}

 

 

Java와 Python에는 for each라는 문법이 또한 존재합니다.(Python의 경우 for문이라고 하면 for each문과 동일한 의미입니다.) 똑같이 for 키워드를 사용하지만, 변수를 증감시키는 대신에 리스트를 받아와서 한 원소씩 가져온다는 점이 다릅니다.

 

for(제어변수 : 리스트){
	실행 내용;
}

for 제어변수 in 리스트:
    실행내용

또한, Java의 경우 배열과 일반적인 Collection 형태(LinkedList 등 뿐만 아니라,튜플, 문자열 등도 가능)는 모두 위와 같이 사용할 수 있으며, Python의 경우 List, Dictionary, Set 또는 문자열과 같이 여러 자료들이 모여있는 형태의 자료형에서 사용이 가능합니다.

 C++의 경우 비교적 최근에 문법이 추가되었으며, 기본 형태는 다음과 같습니다.

for(제어변수 : 리스트(또는 배열, 벡터 등등)){
	실행 내용
}

이를 범위 기반(range-based) for 문이라고 부릅니다. 이때 얼마나 반복해야 하는지에 대한 정보가 있어야 하므로, 크기가 고정된 배열이나 자료들이여야 합니다.

 

예를 들어 리스트의 원소를 모두 출력하는 예시는 for each문으로 다음과 같이 구현할 수 있습니다.

 

 

import java.util.ArrayList;
public class HelloWorld {
  public static void main(String[] args) {
    ArrayList<Integer> list1 = new ArrayList<Integer>();
    list1.add(3);
    list1.add(1);
    list1.add(4);

    for(Integer num : list1){
    	System.out.println(num);
    }
  }
}

list1 = [3,1,4]
for i in list1:
    print(i)

 

Python의 경우 for문을 비롯해 여러가지 상황에서 활용할 수 있는 range함수가 존재합니다. 이는 주어진 시작점과 끝점, 간격에 해당하는 리스트를 만들어 줍니다.

 

for i in range(1,10):
    print(i)

for i in range(1,10,2):
    print(i)

위 예시는 range함수의 두 가지 활용법을 보여줍니다. 첫번째는 시작과 끝을 지정하며, 시작부터 끝 바로 직전까지의 수를 1간격으로 하여 리스트를 생성합니다. 두번째는 시작과 끝, 간격을 지정합니다. (모두 정수여야 합니다.)

 

 아래는 실행 결과입니다.

====================//출력 결과//====================
1
2
3
4
5
6
7
8
9
1
3
5
7
9

 

또한, Python은 리스트 식 안에 for문이 포함되는 다음과 같은 식이 가능합니다.

 

[x*x for x in range(1,100)]

위 식은 1부터 99까지의 수를 각각 제곱하여 리스트에 저장한 형태를 나타내게 됩니다. 일반화하자면 다음과 같습니다.

 

[표현식 for 변수 in 리스트]

 

안 쓸 것같지만, 은근히 많이 쓰는 형태인듯 합니다. 

 

 

C++의 범위기반 for문에 대해 좀 더 언급해보자면, 변수를 일일히 복사하는 과정을 줄이고, 일일히 자료형을 매치시킬 필요를 덜기 위해 다음과 같은 형태로 많이 사용된다고 합니다.

int arr1[10] = [1,2,3,4,5,6,7,8,9,10];
for(const auto& num : arr1)
	cout << num << endl;

모르는 내용이 3개 나왔습니다. const, auto, &. 이 부분에 대해서는 이후 다시 설명하겠습니다.

 

항상 공사중

 

Comments