728x90

 

For each문

= 향상된 for문

= 개선된 for문

 

배열이나 컬렉션의 요소(element)에 대해 특정 작업을 반복적으로 가져오기 위해 사용

for(타입 변수명 : 배열or컬렉션){
		반복할 코드
}

 

특징

자바5.0(JDK 1.5)이상 사용가능

일반적인 for문과 달리 배열과 컬렉션에 저장된 요소들을 읽어오는 용도로만 사용 가능

for each 문은 따로 반복횟수를 명시적으로 주는 것이 불가능하며,

순차적으로 반복될 때만 사용가능

for each문 안에 선언된 변수는 for문 내에서만 사용가능(지역변수 취급)

 

 

장점

1.심플, 가독성Good

2.배열 인덱스 문제 해결

ex) ArrayIndexOutOfBoundsException 예외발생 해결

 

 

단점

1.인덱스를 사용불가x

2.배열 & ArrayList 값을 사용가능하나 수정불가x

 

 

로직

배열or컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽혀져 변수에 저장됨

변수명을 출력하면 해당 인덱스 배열 요소값이 출력

배열or컬렉션을 처음부터 하나씩 변수명에 대입하여 바디 부분을 실행함

즉, 배열or컬렉션[0]의 값을 변수명에 다시 담아 바디부분을 실행하고 총길이 만큼 for문이 도는 것

 

ex)

for(int num : arrList){
		System.out.println(num);
}

 

아래처럼 a를 al을 두가지 반복 시키면 헷갈리는 부분이 있어서 정리해봤다

  • a를 반복시킬 경우 : 변수 al 전체를 al의 길이만큼 반복
  • al을 반복시킬 경우 : 변수 al의 요소 하나씩 순서대로 al길이만큼 반복

 

 

ex)구체적 예시

 

728x90
반응형
728x90

 

깊은복사는 값 자체를 가져다 사용 

얇은 복사는 주소를 가져다 사용

 

 

1.얕은 복사(shallow copy)

주소값 동일 (같은 주소값 참조)

값 자체 동일

int[] arr1 = new int[3];
int[] arr2 = arr1;

new 연산자가 공간 생성 & 주소값 생성하고,

heap의 주소값이 대입연산자 때문에 주소값0x100이 stack의 변수로 들어가게 됨

 

arr1의 값은? 0x100

대입연산자에 의해서 arr1에도 0x100이 들어가 있음

arr2 = arr1;에 의해 arr2에도 arr1과 같이 0x100의 주소값이 들어감

즉, 같은 주소값을 참조하는 것이며 같은 주소값을 참조하기에 둘이 같이 값을 공유한다

arr1[0] = 10;
System.out.println(arr1[0]); // 10
System.out.println(arr2[0]); // 10

 

 

아래처럼 그림으로보면 같은 곳을 화사룦가 가리키고 있다

 

 

public void method01() {
		
		// 1.얕은 카피(shallow copy) 
		
		int[] originArr = {1,2,3,4,5};
		int[] copyArr = originArr;
		
		System.out.println(originArr);  // 결과값 : [I@74a14482
		System.out.println(copyArr);	// 결과값 : [I@74a14482
		System.out.println();
		
		for(int i=0; i<originArr.length; i++) {
			System.out.print(originArr[i]+" ");  // 1 2 3 4 5 
		}
		System.out.println();
		for(int i=0; i<copyArr.length; i++) {
			System.out.print(copyArr[i]+" ");    // 1 2 3 4 5 
		}
		System.out.println();
		System.out.println();
		
		// 원본 배열값 변경
		originArr[0] = 99;
		
		for(int i=0; i<originArr.length; i++) {
			System.out.print(originArr[i]+" ");  // 99 2 3 4 5 
		}
		System.out.println();
		for(int i = 0; i < copyArr.length; i++) {
			System.out.print(copyArr[i]+" ");    // 99 2 3 4 5
		}
		System.out.println();
		// 변경된 값이 똑같이 반영
	}

 


 

2.깊은 복사(deep copy)

새로운 배열을 만들어 기존 데이터를 모두 복사해오는 것

새로 만들어 복사하기에 원본과 복사본의 주소값이 다르고, 원본값이 변해도 복사본에 영향x

 

deep copy 3가지 방법

A. for문 이용

B. System.arraycopy()

C. Arrays.copyof()

 

A. for문 이용

public void method02() {
		
// 2.깊은 카피(deep copy) 
// 	  1) for문 이용

int[] originArr = {1,2,3,4,5};
int[] copyArr = new int[5];

System.out.println(originArr); // 결과값 : [I@74a14482
System.out.println(copyArr);   // 결과값 : [I@33909752

for(int i=0; i<originArr.length; i++) {
	System.out.print(originArr[i]+" ");
}
System.out.println();
for(int i=0; i<copyArr.length; i++) {
	System.out.print(copyArr[i]+" ");
}
System.out.println();
System.out.println();


for(int i=0; i<originArr.length; i++) {
	copyArr[i] = originArr[i];
}

for(int i=0; i<originArr.length; i++) {
	System.out.print(originArr[i]+" ");
}
System.out.println();


//


originArr[0] = 99;

for(int i=0; i<originArr.length; i++) {
	System.out.print(originArr[i]+" ");
}
System.out.println();
for(int i=0; i<copyArr.length; i++) {
	System.out.print(copyArr[i]+" ");
}
System.out.println();
System.out.println();

}

 

B. System.arraycopy()

배열길이 자동 수정 X

복사된 값의 나머지 공간은 해당 배열의 데이터 타입의 기본값으로 채워진다

 

ex) int 배열값을 복사하고 나머지 공간은 0으로 채워진다

double 배열값을 복사하고 나머지 공간은 0.0 char 배열값을 복사하고 나머지 공간은 공백 String 배열값을 복사하고 나머지 공간은 null

 

System.arraycopy()의 형태

System.arraycopy(src, srcPos, dest, destPos, length);
// src : 원본 배열
// srcPos : 포지션. 원본배열에서 복사를 시작할 위치
// dest : 복사 배열
// destpos: 복사 배열에서 붙여놓기를 시작할 위치
// length : 얼만큼 복사를 해올지에 대한 복사 길이

 

public void method03() {


// 2.깊은 카피(deep copy) 
// 	  2)System.arraycopy()


int[] originArr = {1,2,3,4,5};
int[] copyArr = new int[10];


// 원본 배열의 0(index)번째부터 원본배열 길이만큼 복사한 것을 복사 배열 3번째서부터 붙여넣기
// System.arraycopy(src, srcPos, dest, destPos, length);

System.arraycopy(originArr, 0, copyArr, 3, originArr.length);
// 인덱스 3번째부터 넣기에 앞의 셋은 000이고 오리진arr5개값 뺴고 나머지도 0으로 채워짐

for(int i=0; i<originArr.length; i++) {
    System.out.print(originArr[i]+" ");  // 1 2 3 4 5 
}
System.out.println();
for(int i=0; i<copyArr.length; i++) {
    System.out.print(copyArr[i]+" ");  // 0 0 0 1 2 3 4 5 0 0 
}

 

C. Arrays.copyof()

Arrays.copyOf(original, newLength)
	- original : 원본
	- newLength : 얼마만큼 복사할지

배열 길이 자동 수정 O

배열 길이만큼 복사해오기에 System.arraycopy()처럼 공간이 남지않는다 원본 길이보다 길게 복사할 경우, 남는 공간은 원본의 데이터타입 기본값으로 채운다

public void method04() {

    // 3) Arrays.copyof()

    int[] originArr = {1,2,3,4,5};
    int[] copyArr = new int[10];

    for(int i=0; i<originArr.length; i++) {
        System.out.print(originArr[i]+" ");
    }
    System.out.println();
    for(int i=0; i<copyArr.length; i++) {
        System.out.print(copyArr[i]+" ");
    }
    System.out.println();


    // Arrays.copyof()
    // Arrays.copyOf(original, newLength)
    // original : 원본
    // newLength : 얼마만큼 복사할지

    Arrays.copyOf(originArr, originArr.length);

    // Arrays.copyOf 위에 마우스 포인터 올리고 나오는 '노란색 설명'
    // int[] java.util.Arrays.copyOf(int[] original, int newLength)
    // java util.Arrays
    // 맨 앞에 값 int[]의 의미: 반환값 데이터타입이 무엇인지 알려줌. 즉 int[] 인트 배열을 반환함


    copyArr = Arrays.copyOf(originArr, originArr.length); //copyArr에 담음 

    for(int i=0; i<originArr.length; i++) {
        System.out.print(originArr[i]+" "); // 1 2 3 4 5 
    }
    System.out.println();
    for(int i=0; i<copyArr.length; i++) {
        System.out.print(copyArr[i]+" ");   // 1 2 3 4 5
    }
    System.out.println();

    // 원본 배열값 변경
    originArr[0] = 99;
    for(int i=0; i<originArr.length; i++) {
        System.out.print(originArr[i]+" "); // 99 2 3 4 5 
    }
    System.out.println();
    for(int i=0; i<copyArr.length; i++) {
        System.out.print(copyArr[i]+" ");   // 1 2 3 4 5
    }
    System.out.println();
}

 

 

 

728x90
반응형
728x90

array 초기화 3가지

 

1) 인덱스 이용

 

2) 중괄호{ } 이용

 

3) for문 이용

 

import java.util.Scanner;

public class practice_everyday13 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		
		int[] arr0; 		// 배열선언
		arr0 = new int[5];	// 배열할당
		
		// array 초기화 3가지
		// 1)인덱스
		int[] arr = new int[3];
		arr[0] = 1;
		arr[1] = 2;
		arr[2] = 3;
		
		for(int i=0; i<arr.length;i++) { // 출력용 for문
			System.out.print(+arr[i]);
		}
		
		// 2)중괄호 {}
		int[] arr2 = {1,2,3};
		
		for(int i=0; i<arr2.length;i++) { // 출력용 for문
			System.out.print(+arr2[i]);
		}
		
		// 3)for문 초기화
		int[] arr3 = new int[4];
		for(int i = 0; i<arr3.length; i++) {
			arr3[i] = i*10+1; 			// for문 초기화
			System.out.println(arr3[i]);
		}
		
	}
	
		
}

 

728x90
반응형
728x90

 

 

 

public class practice_everyday01 {
	public static void main(String[] args) {	
		
		int[] arr = new int[4];
		for(int i = 0; i<arr.length;i++) {
			System.out.println(arr[i] += (10+i));
		}
			
	}
}
728x90
반응형
728x90

문제

 

<풀이과정>

 

 

<정답>

 

 

728x90
반응형
728x90

011. for문 - list와 for문의 변수 작동원리 이해

 

 

종종 for문이 반복되면서 이게 식안에서 어떻게 작동되는지 햇갈릴 때가 있었다. 어떤 때는 잘 알겠고 어떤 때는 햇갈려서 뭘 모르는지 잘모르는 상태였는데 계속 보다보니 

range를 사용하면 숫자여서 이해하기가 좀 쉬웠는데 변수명이 들어간다거나 다른 자료형이 들어가면 햇갈리는 걸 발견했고, 어떻게 작동하는지 방법을 찾아내서 팁을 공유할까한다.

 

<문장 안에서 해당 코드가 어떻게 작동하는지 확인하는 팁!>

print() 함수를 알고 알고 싶은 코드 중간중간에 넣어서 해당 값이 어떤건지 출력하게끔해서 중간중간 값을 체크하면 어떻게 돌아가는지 알 수 있다. for문 뿐만 아니라 다른 곳에서 가능!!

 

 

 

728x90
반응형
728x90

010. for문 - dict와 for문의 받는값 & tuple

위는 for문에 연산자 in으로 딕셔너리 값을 받아서 값을 도출하는 식이다

 

for문에 딕셔너리 값을 받으면 뭘로 값이 나올까?

키값이 나온다

 

for문의 결과값을 밸류값으로 받고 싶다면?

변수명.values()

 

for문의 결과값을 키값, 밸류값 둘 다 받으려면?

변수명.items()

 

for문에서 tuple은 for문의 변수를 두개 써도 된다

ex) for a,b in dData:

예처럼 a와 b 두개의 변수를 써도 된다. 튜플로 변수을 지정할 때 괄호를 생략해도 튜플로 인식하는거랑 같다

(원래는 양쪽 다 괄호를 쳐줘야한다)

 

 

728x90
반응형

+ Recent posts