java

enhanced for

윤만석 2024. 3. 8. 20:31

C++ 에서 사용하던 for문을 간략하게 쓸 수 있는 기법 enhanced for문

vector<int> arr;
int arr2[200];

for(auto r:arr){
	cout<<r<<" "; //값을 복사해서 가져옵니다
}

for(auto r:arr2){
	cout<<r<<" ";
}
#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false),cin.tie(NULL);
#define mset(v) memset(v,0,sizeof(v));
#define rep(i,a) for(int i=0;i<a;++i)
#define REP(i,a) for(int i=1;i<=a;++i)

using namespace std;

typedef long long ll;
typedef pair<int, int> pi;
typedef tuple<int, int, int>ti;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
int main() {
	FAST;
	vi a = vi{ 1,2,3,4,5 };
	for (int &r : a) { //참조값을 이용해 값을 수정할 수도 있습니다
		r = 5;
	}
	for (int r : a) {
		cout << r << " ";
	}
    /출력 : 5 5 5 5 5
}

array 뿐만아니라 vector,map,set 같은 std에서도 사용가능하다.

 

 

 

java에서도 그대로 사용가능

int[] ar={1,2,3,4,5};
for(int e:ar){
	System.out.println(e);
}

 

 

주의할 점이 있다!

 

package Devide_And_Conquer;

public class Main {
	
	public static void main(String args[]) {
		Box[] BoxArray=new Box[5];
		BoxArray[0]=new Box(1);
		BoxArray[1]=new Box(2);
		BoxArray[2]=new Box(3);
		BoxArray[3]=new Box(4);
		BoxArray[4]=new Box(5);
		
		for(Box box:BoxArray) { //box 에는 BOXArray요소의 참조변수가 담겼다
			box.setnum(100);
		}
		for(Box box:BoxArray) {
			System.out.println(box.getnum());
            //100 100 100 100 100
		}
		
		int[] IntArray=new int[5];
		IntArray[0]=1;
		IntArray[1]=2;
		IntArray[2]=3;
		IntArray[3]=4;
		IntArray[4]=5;
		for(int i:IntArray) { //i에는 IntArray의 요소가 담겼다!
			i=100;
			//System.out.println(i);
		}
		for(int r:IntArray) {
			System.out.println(r);
            //1 2 3 4 5
		}
		
	}
}

 

배열이 인스턴스의 참조값을 담고있다면, 즉 레퍼런스를 담고있다면

enhanced for문에서 box는 인스턴스의 참조값이 들어간다

마치 c++의 레퍼런스 &와 같은느낌

 

하지만 배열이 int형같은 기본 자료형의 값이 들어간다면

 

i에는 레퍼런스가 아닌 값 그 자체가 들어간다 따라서 i값이 수정되어도 IntArray값은 변화가 없다

'java' 카테고리의 다른 글

interface 정리  (0) 2024.03.11
super ? 상속의 규칙  (0) 2024.03.08
배열의 초기화  (0) 2024.03.08
클래스 변수,메소드 와 인스턴스 변수,메소드의 차이?  (0) 2024.03.07
Short-Circuit Evaluation  (0) 2024.03.06