728x90

 

배열의 복사는 두가지 타입이 있다

1.얕은 복사(shallow copy)

2.깊은 복사(deep copy)

 

 

1.얕은 복사(shallow copy)

int[] sArr = {1,2,3};
int[] cArr = sArr;

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

 

2.깊은 복사(deep copy)

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

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

 

deep copy의 방법3가지

1) for문

2) System.arraycopy()

3) Arrays.copyof()

 

 

1)for문

int[] sourceArr = {10,20,30};
int[] copyArr = new int[3];

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

 

 

2) System.arraycopy()

System.arraycopy(src, srcPos, dest, destPos, length);

src : 원본 배열

srcPos : 포지션. 원본배열에서 복사를 시작할 위치

dest : 복사 배열

destpos: 복사 배열에서 붙여놓기를 시작할 위치

length : 얼만큼 복사를 해올지에 대한 복사 길이

 

int[] sArr = {1,2,3};
int[] cArr = new int[6];

System.arraycopy(sArr, 0, cArr, 0, sArr.length);

 

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

ex)

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

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

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

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

 

 

3) Arrays.copyof()

Arrays.copyOf(original, newLength)

 - original : 원본

 - newLength : 얼마만큼 복사할지

int[] sArr = {1,2,3};
int[] cArr = new int[6];

cArr = Arrays.copyof(sArr, 3);

 

배열 길이 자동 수정 O

배열 길이만큼 복사해오기에 System.arraycopy()처럼 공간이 남지않는다

원본 길이보다 길게 복사할 경우, 남는 공간은 원본의 데이터타입 기본값으로 채운다

 

 

 

전체코드

import java.util.Arrays;

public class Array_review {
	public static void main(String[] args) {
		
		// 배열
		// 같은 자료형의 데이터의 여러개의 값을 저장할 수 있는 공간
		
		// 배열 선언
		int[] arr;
		
		// 배열 할당

		int[] arr1 = new int[3]; // 방법1 : 주로 Java에서 사용
		int arr2[] = new int[3]; // 방법2 : 주로 C에서 사용
		
		// 배열 초기화
		// 1)인덱스
		// 2)중괄호 {}
		// 3)for문 이용
		
		// 1)인덱스
		arr1[0] = 1;
		arr1[1] = 2;
		arr1[2] = 3;
		
		System.out.println(arr1[0]); // 1
		System.out.println(arr1[1]); // 2
		System.out.println(arr1[2]); // 3
		
		
		// 2)중괄호 {}
		int[] arr3 = {1,2,3};
//		int arr3[] = {1,2,3}; // error
		for(int i=0; i<arr3.length; i++) {
			System.out.print(arr3[i]+ " "); // 1 2 3
		}
		System.out.println();
		
		// 3)for문
		// 초기화할 값에 ‘규칙’이 존재할 경우 사용가능
		int[] arr4 = new int[3];
		for(int i=0; i<arr4.length; i++) {
			arr4[i] = i+3;
			System.out.print(arr4[i]+" ");
		}
		System.out.println();
		
		// 배열 수정(크기 변경)?
		int size = 5;
		int[] dArr = new int[size];
		System.out.println("dArr길이:"+dArr.length);
		System.out.println("dArr주소:"+dArr);// [I@6d06d69c
		dArr = new int[5]; // 같은 배열 길이
		System.out.println(dArr); // [I@7852e922 주소값이 다르다
		dArr = new int[4]; // 배열길이 4로 수정. 과연 주소값이 같을까?
		System.out.println(dArr); // [I@4e25154f
		// 전부 다른 주소값이 나왔다. 보이기에는 길이가 수정된 것처럼 보이나
		// 실제로는 새로 만든 값으로 대체시킨 것
		
		
		// 배열 삭제
		// 배열 삭제 = null
		dArr = null;
		// 배열에 null을 넣게되면 기존 주소값이 null로 바뀌면서 연결된 값도 끊어지면서
		// 사실상 삭제 효과가 나타난다
		
		
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
		
		
		// 배열 복사
		// 1)얕은 복사(shallow copy)
		// 2)깊은 복사(deep copy)
		
		// 1)얕은 복사(shallow copy)
		int[] arr5 = new int[2];
		int[] arr6 = arr5;
		// arr5의 주소값이 arr6로 그대로 들어가기 때문에 주소값 자체도 복사된다
		// 즉 arr5와 arr6는 같은 주소값을 갖으며,
		// 같은 주소값을 참조하기에 같은 값을 공유하게 된다
		
		// 검증
		int[] sourceArray = {10,20,30};
		int[] cloneArray = sourceArray;
		//주소값 확인
		System.out.println(sourceArray);//[I@70dea4e
		System.out.println(cloneArray); //[I@70dea4e
		for(int i=0;i<sourceArray.length;i++) {
			System.out.print(sourceArray[i]+" ");
		} // 10 20 30 
		for(int i=0;i<cloneArray.length;i++) {
			System.out.print(cloneArray[i]+" ");
		} // 10 20 30 
		System.out.println();
		// 원본과 클론 배열 둘의 주소값,값이 동일
		
		// 원본 값을 바꿔서 둘의 차이가 있는지 확인해보자
		sourceArray[2] = 40; // 길이는 여전히 3으로 같다
		System.out.println(sourceArray);//[I@70dea4e
		System.out.println(cloneArray); //[I@70dea4e
		
		for(int i=0;i<sourceArray.length;i++) {
			System.out.print(sourceArray[i]+" ");
		} // 10 20 40 
		for(int i=0;i<cloneArray.length;i++) {
			System.out.print(cloneArray[i]+" ");
		} // 10 20 40 
		// 원본과 클론 배열 둘의 주소값,값이 여전히 동일
		
		System.out.println();
		
		//2)깊은 복사
		// 새로운 배열을 만들어 기존 데이터를 모두 복사해오는 것
		// 방법1:for문
		// 방법2:System.array.copy()
		// 방법3:Arrays.copyof()
		
		// 방법1:for문
		int[] sourceArr = {10,20,30};
		int[] cloneArr = new int[3];
		
		// 검증
		// 주소값+값 비교
		System.out.println(sourceArr);// [I@5c647e05
		System.out.println(cloneArr); // [I@33909752
		// 주소값 다름
		for(int i=0;i<sourceArr.length;i++) {
			System.out.print(sourceArr[i]+" ");//10 20 30 
		}
		for(int i=0;i<cloneArr.length;i++) {
			System.out.print(cloneArr[i]+" "); //0 0 0 
		}
		// 값 자체도 다르다
		
		// 원본 값을 바꿔서 둘의 차이가 있는지 확인해보자
		System.out.println();
		System.out.println("========");
		sourceArr[2] = 31;
		System.out.println(sourceArr); // [I@5c647e05
		System.out.println(cloneArr);  // [I@33909752
		// 원본 값 변경 후, 주소값 다름
		for(int i=0;i<sourceArr.length;i++) {
			System.out.print(sourceArr[i]+" ");//10 20 31
		}
		for(int i=0;i<cloneArr.length;i++) {
			System.out.print(cloneArr[i]+" "); //0 0 0 
		}
		// 원본 값 변경 후, 서로 값 영향x
		
		System.out.println();
		for(int i=0;i<sourceArr.length;i++) {
			cloneArr[i] = sourceArr[i];		   // 얇은복사 실행
			System.out.print(cloneArr[i]+" "); // 10 20 31 
		}
		System.out.println();
		System.out.println(sourceArr); // [I@5c647e05
		System.out.println(cloneArr);  // [I@33909752
		// 얕은 복사로 원본과 카피가 값이 같아졌지만 주소값은 여전히 다름
		
		
		// 방법2:System.array.copy()
		// 배열길이 자동 수정x
		// 복사된 값의 나머지 공간은 해당 배열의 데이터 타입의 기본값으로 채워진다
		// ex)
		// int 배열값을 복사하고 나머지 공간은 0으로 채워진다
		// double  배열값을 복사하고 나머지 공간은 0.0
		// char 배열값을 복사하고 나머지 공간은 공백
		// String 배열값을 복사하고 나머지 공간은 null
		//
		// System.arraycopy(src, srcPos, dest, destPos, length)
		// src : 원본 배열
		// srcPos : 포지션. 원본배열에서 복사를 시작할 위치
		// dest : 복사 배열
		// destpos: 복사 배열에서 붙여놓기를 시작할 위치
		// length : 얼만큼 복사를 해올지에 대한 복사 길이
		
		
		int[] sourceArr3 = {10,20,30};
		int[] cloneArr3 = new int[3];
		 
		System.arraycopy(sourceArr3, 0, cloneArr3, 0, cloneArr3.length);
		System.out.println(sourceArr3);
		for(int i=0;i<sourceArr3.length;i++) {
			System.out.print(sourceArr3[i]+" "); // 10 20 30
		} 										 // 원본 값
		System.out.println();
		for(int i=0;i<cloneArr3.length;i++) {
			System.out.print(cloneArr3[i]+" ");  // 10 20 30
		} 										 // 클론 값
		System.out.println();
		
		int[] sourceArr4 = {10,20,30,40,50};
		int[] cloneArr4 = new int[3];
		 
		System.arraycopy(sourceArr4, 0, cloneArr4, 0, cloneArr4.length);
		// 원본 인덱스0번부터4번까지 배열값 복사해서 복제본의 0번째 인덱스부터 붙여넣는다는 의미
		for(int i=0;i<sourceArr4.length;i++) {
			System.out.print(sourceArr4[i]+" ");// 10 20 30 40 50
		} 										// 원본값
		System.out.println();
		for(int i=0;i<cloneArr4.length;i++) {
			System.out.print(cloneArr4[i]+" "); // 10 20 30
		} 										// 클론값
		// 
		System.out.println();
		
		System.arraycopy(sourceArr4, 2, cloneArr4, 0, cloneArr4.length);
		// 원본 인덱스2번부터4번까지 30 40 50의 배열값 복사해서 복제본의 0번째 인덱스부터 붙여넣는다는 의미
		for(int i=0;i<sourceArr4.length;i++) {
			System.out.print(sourceArr4[i]+" ");// 10 20 30 40 50
		} 										// 원본값
		System.out.println();
		for(int i=0;i<cloneArr4.length;i++) {
			System.out.print(cloneArr4[i]+" "); // 30 40 50 
		} 										// 클론값
		// 
		System.out.println();
		
		
		
		int[] a = {2,4,6,8,10};
		int[] b = new int [10];
		
		System.arraycopy(a, 3, b, 0, 2);
		// dest의 범위가 0-5까지는 잘나오고 6부터 error
		for(int i=0; i<a.length;i++) {
			System.out.print(a[i]+" "); // 2 4 6 8 10 
		}								// 원본값
		System.out.println();
		for(int i=0; i<b.length;i++) {
			System.out.print(b[i]+" "); // 8 10 0 0 0 0 0 0 0 0 
		}								// 카피값
		System.out.println();
		
		// int 배열
		int[] src = {3,6,9,12};
		int[] clone = new int[8];
		
		System.arraycopy(src, 2, clone, 6, 2);
		// src 2번인덱스부터 길이2를 복사해서 9,12값을 clone의 6번째부터 복사
		for(int i=0; i<src.length;i++) {
			System.out.print(src[i]+" "); // 3 6 9 12 
		}								  // 원본값
		System.out.println();
		for(int i=0; i<clone.length;i++) {
			System.out.print(clone[i]+" ");// 0 0 0 0 0 0 9 12 
		}								   // 카피값
		System.out.println();
		
		int[] src2 = {3,6,9,12};
		int[] clone2 = new int[8];
		System.arraycopy(src2, 2, clone2, 5, 2);
		for(int i=0; i<clone2.length;i++) {
			System.out.print(clone2[i]+" ");// 0 0 0 0 0 9 12 0  
		} // 복사되고 int배열의 공백은 0으로 채워진다       // 카피값
		System.out.println();
		
		
		// double 배열
		double[] dSrc = {1.0,1.5,2.0,2.5};
		double[] dCopy = new double[8];
		
		System.arraycopy(dSrc, 0, dCopy, 4, dSrc.length);
		for(int i=0;i<dCopy.length;i++) {
			System.out.print(dCopy[i]+" ");//0.0 0.0 0.0 0.0 1.0 1.5 2.0 2.5  
		}								   // 복사된 값 외에 나머지 공간 : 0.0
		System.out.println();
		
		// char 배열
		char[] cSrc = {'a','b','c'};
		char[] cCopy = new char[6];
		
		System.arraycopy(cSrc, 0, cCopy, 0, cSrc.length);
		for(int i=0;i<cCopy.length;i++) {
			System.out.print(cCopy[i]+" ");//a b c (공백)
		}								   // // 복사된 값 외에 나머지 공간 : 공백
		System.out.println();
		
		// String 배열
		String[] sSrc = {"A","B","C"};
		String[] sCopy = new String[6];
		
		System.arraycopy(sSrc, 0, sCopy, 0, sSrc.length);
		for(int i=0;i<sCopy.length;i++) {
			System.out.print(sCopy[i]+" ");// A B C null null null 
		}								   // 복사된 값 외에 나머지 공간 : null
		System.out.println();
		
		
		
		// 방법3:Arrays.copyof()
		
		// Arrays.copyOf(original, newLength)
		// - original : 원본
		// - newLength : 얼마만큼 복사할지
		// 배열 길이만큼 복사해오기에 System.arraycopy()처럼 공간이 남지않는다
		// 원본 길이보다 길게 복사할 경우, 남는 공간은 원본의 데이터타입 기본값으로 채운다
		
		// int타입
		// 여분 : 0
		int[] aSrc = {1,2,3,4,5};
		int[] aCopy = new int[10];
		
		
		aCopy = Arrays.copyOf(aSrc, 4);
		for(int i=0;i<aCopy.length;i++) {
			System.out.print(aCopy[i]+" ");// 1 2 3 4 
		}								   
		System.out.println();
		
		aCopy = Arrays.copyOf(aSrc, 3);
		for(int i=0;i<aCopy.length;i++) {
			System.out.print(aCopy[i]+" ");// 1 2 3
		}								   
		System.out.println();
		
		aCopy = Arrays.copyOf(aSrc, 6);
		for(int i=0;i<aCopy.length;i++) {
			System.out.print(aCopy[i]+" ");// 1 2 3 4 5 0
		}								   
		System.out.println();
		
		
		// double타입
		// 여분 : 0.0d
		double[] adSrc = {1.0,1.5,2.0,2.5,3.0};
		double[] adCopy = new double[10];
		
		
		adCopy = Arrays.copyOf(adSrc, 6);
		for(int i=0;i<adCopy.length;i++) {
			System.out.print(adCopy[i]+" ");// 1.0 1.5 2.0 2.5 3.0 0.0 
		}								   
		System.out.println();
		
		
		// char타입
		// 여분 : (공백)
		char[] acSrc = {'a','b','c'};
		char[] acCopy = new char[6];
		
		acCopy = Arrays.copyOf(acSrc, 6);
		for(int i=0;i<acCopy.length;i++) {
			System.out.print(acCopy[i]+" ");// a b c (공백)
		}								   
		System.out.println();
		
		
		// String
		// 여분 : null
		String[] asSrc = {"a","b","c"};
		String[] asCopy = new String[6];
		
		asCopy = Arrays.copyOf(asSrc, 6);
		for(int i=0;i<asCopy.length;i++) {
			System.out.print(asCopy[i]+" ");// a b c null null null 
		}								   
		System.out.println();
		
		
		
	}
	
}

 

 

 

728x90
반응형
728x90

 

 

public class practice_everyday13 {
	public static void main(String[] args) {
		
		// 배열
		// 같은 자료형의 데이터의 여러개의 값을 저장할 수 있는 공간
		
		// 배열 선언
		int[] arr;
		
		// 배열 할당

		int[] arr1 = new int[3]; // 방법1 : 주로 Java에서 사용
		int arr2[] = new int[3]; // 방법2 : 주로 C에서 사용
		
		// 배열 초기화
		// 1)인덱스
		// 2)중괄호 {}
		// 3)for문 이용
		
		// 1)인덱스
		arr1[0] = 1;
		arr1[1] = 2;
		arr1[2] = 3;
		
		System.out.println(arr1[0]); // 1
		System.out.println(arr1[1]); // 2
		System.out.println(arr1[2]); // 3
		
		
		// 2)중괄호 {}
		int[] arr3 = {1,2,3};
//		int arr3[] = {1,2,3}; // error
		for(int i=0; i<arr3.length; i++) {
			System.out.print(arr3[i]+ " "); // 1 2 3
		}
		System.out.println();
		
		// 3)for문
		// 초기화할 값에 ‘규칙’이 존재할 경우 사용가능
		int[] arr4 = new int[3];
		for(int i=0; i<arr4.length; i++) {
			arr4[i] = i+3;
			System.out.print(arr4[i]+" ");
		}
		System.out.println();
		
		// 배열 수정(크기 변경)?
		int size = 5;
		int[] dArr = new int[size];
		System.out.println("dArr길이:"+dArr.length);
		System.out.println("dArr주소:"+dArr);// [I@6d06d69c
		dArr = new int[5]; // 같은 배열 길이
		System.out.println(dArr); // [I@7852e922 주소값이 다르다
		dArr = new int[4]; // 배열길이 4로 수정. 과연 주소값이 같을까?
		System.out.println(dArr); // [I@4e25154f
		// 전부 다른 주소값이 나왔다. 보이기에는 길이가 수정된 것처럼 보이나
		// 실제로는 새로 만든 값으로 대체시킨 것
		
		
		// 배열 삭제
		// 배열 삭제 = null
		dArr = null;
		// 배열에 null을 넣게되면 기존 주소값이 null로 바뀌면서 연결된 값도 끊어지면서
		// 사실상 삭제 효과가 나타난다
        
       }
}

 

728x90
반응형
728x90

 

객체 배열 == 참조변수 배열

 

객체의 배열이란?

참조변수 여러개를 묶어서 배열을 만든 것

Tv tv1, tv2, tv3;  // Tv데이터 타입인 변수tv1,tv2,tv3 

    ↓↓↓  배열로 전환하면

Tv[] tvArr = new Tv[3]; // 

참조변수 3개를 배열로 만든 것

그래서 객체의 배열이라 부름

만들어진 각 객체의 주소값이 링크되고 초기화 된 것

 

 

객체의 배열 초기화

// 객체를 생성해서 배열의 각 요소에 저장
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

    ↓↓↓  간단히 초기화

Tv[] tvArr = { new Tv(), new Tv(), new Tv() };
Tv[] tvArr = new Tv[3];
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

위의 코드의 세부과정

1)참조변수 tvArr 생성됨

2)tvArr 참조변수 3개가 배열로 생성되고 주소값 생성

(new)연산자가 heap영역에 배열 및 주소값 생성

 

3)tvArr[0] = new Tv(); 이 문장이 실행되서 tvArr[0] 문장이 실행되서 new Tv();가 tvArr[0]로 대입됨

만들어진 객체의 주소값 0x100이 tvArr[0]로 링크 되고 마찬가지로 tvArr[1],tvArr[2]도 주소값 링크됨

 

 

주의사항

Tv[] tvArr = new Tv[3];

이 코드만 만들어두면 참조변수 배열만 생성해둔 거기에 참조변수만 만들어둔 것이고 객체를 하나씩 넣어줘야하는데 안하고 객체를 호출하게 되면 객체생성이 안됬다고 에러남

 

 

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

 

평균 계산시, int / int = int가 나오므로 (float or double) 형변환 해줄 것

average = sum / (float)score.length; // 계산 결과를 float타입으로 형변환

 

총점과 평균

package practice03_jungsuk;

public class Ch5_89_array활용 {
	public static void main(String[] args) {
		
		int sum = 0;
		float average = 0f;
		
		int[] score = {100, 88 , 100, 100, 90};
		
		for(int i = 0; i < score.length; i++) {
			sum += score[i];
		}
		average = sum / (float)score.length; // 평균 연산시, 실수 형변환 잊지말것
		// casting안하면 정수로 결과도출 및 데이터 손실. (float)변환시 95.6 int시 95
		
		System.out.println("총점 : " +sum);
		System.out.println("평균 : " +average);
	}	
}

 

 

최대값 최소값

int[] score2 = {79,88,91,33,100,55,95}; 
		
int max = score2[0]; // 배열의 첫번째 값으로 최대값 초기화
int min = score2[0]; // 배열의 첫번째 값으로 최소값 초기화

for(int i=1; i<score2.length; i++) {
	if(score2[i] > max) {
		max = score2[i];
	}else if(score2[i] < min) {
		min = score2[i];
	}
} 

System.out.println("최대값 : " + max);
System.out.println("최소값 : " + min);

 

728x90
반응형
728x90

 

ch5-4 배열의 길이

배열의 길이

배열이름.length - 배열의 길이(int형 상수)

int[] arr = new int[5];  // 길이가 5인 int배열
int tmp = arr.length;    // arr.lenght의 값은 5이고 tmp에 5가 저장된다

 

배열은 한번 생성하면 그 길이를 바꿀 수 없다

why?

int[5]가 4byte인 int가 5개이므로 4x5 =20 byte

여기서 int[5]를 10칸인 int[10]으로 바꾸고 싶다면 4x10=40이므로 두배의 공간이 필요하게 되고 배열은 연속해서 저장공간을 만든다. 새로 만들려면 연속된 공간 저장 확보가 어렵다면 떨어진 곳에 만들어야하는데 자바는 크기를 못 늘리게하고 필요하면 다른 곳으로 옮기게 규칙을 정해놓음

 

 

길이가 부족할 때는?

길이를 늘릴 수 없기에 새로운 걸 큰 걸 만들고 기존의 내용새 배열에 복사

for (int i=0; i < score.length;i++) // 조건식 변경 불필요
		System.out.println(score[i];

 

 


 

ch5-5 배열의 초기화

배열의 초기화

배열의 각 요소에 처음으로 값저장하는 것

int[[ score = new int[5]; // 길이가 5인 int형 배열 생성
score[0] = 50; // ← 배열 초기화
score[1] = 60; // ← 배열 초기화
score[2] = 70; // ← 배열 초기화
score[3] = 80; // ← 배열 초기화
score[4] = 90; // ← 배열 초기화

배열은 기본적으로 인트형으로 자동 초기화

 

반복문으로 초기화 가능

for(int i=0; i<score.length; i++)
	score[i] = i * 10 + 50;

// 결과값으로 
score[0] = 50;
score[1] = 60; 
score[2] = 70; 
score[3] = 80; 
score[4] = 90; 

 

 

간단 초기화 방법

  1. int[] score = new int[] {50, 60 , 70, 80, 90};
  2. int[] score = {50, 60 , 70, 80, 90}; // new int[] 생략가능

대부분 2번으로 많이 사용

 

주의사항

// 아래의 코드는 2)과 같은 코드이나 따로쓰면 error
int[] score;
score = {50, 60 , 70, 80, 90}; // error : new int[] 생략 불가
score = new int[]{50, 60 , 70, 80, 90}; // 가능

 

728x90
반응형
728x90

 

JAVA 제어문 - 7.3. 반복문(Loop) + 배열(Array)

 

 

html

<li>user name</li> 몇만개 반복해야된다면?

<li>egoing</li>

<li>jinhuck</li>

<li>youbin</li> ...

 

반복문과 배열이 중요

 

String[] users = new String[3];
users[0] = "egoing";
users[1] = "jinhuck";
users[2] = "youbin";


for (int i = 0; i < 3; i++) {        # 배열 길이랑 맞지 않는 반복횟수의 경우의 수에서는 제대로 작동x
	System.out.println("<li>"+users[i]+"</li>");   # html <li>태그 반복문
}

 - i<3 조건이므로, 3까지는 괜찮으나 3보다 작은 수면 에러나고, 크면 커도 3개까지만 출력되므로 코드가 제대로 작동하지 않는다

 

String[] users = new String[3];
users[0] = "egoing";
users[1] = "jinhuck";
users[2] = "youbin";

for (int i = 0; i<users.length; i++) {     # .length추가로 new String[]배열 길이에 따라 반복가능
	System.out.println(users[i]+",");   # user[인덱스]에 나눠어서 , 찍어주고
}

 - 범위를 i < users.length(배열의 길이의 따른 숫자) 맞아 떨어지게 몇명의 유저수가 와도 자동으로 수에 맞춰서 반복문 횟수를 조절해주게 된다.

 - i++ i = i+1와 같은 코드

 

 

for (int i = 0; i<users.length; i++) 기억!

 

728x90
반응형
728x90

 

 

JAVA 제어문 - 7.1. 반복문(Looping statement)

 

반복문의 두가지

while(), for()

 

반복문 while

while () 안에 boolean 데이터 타입 true 들어가면,

while {} 코드가 true 보고 반복적으로 계속 실행됨

 

while, 자유도가 높다

while문의 i코드가 일억줄의 코드 중에 어떤 코드로 인해 i값이 변형될 가능성

길어지면 알아보기 힘들기에 누군가 i값을 다른 용도로 쓰거나 했다면 코드가 망가짐.

 

for문의 경우 필요요소가 () 하나로 패키징 되어 있기에 문제가 생길 가능이 적고, 코드 의도 파악이 쉽다

반복 횟수가 고정되어있다면 for문을

 

for 형식 기억

for(int j=0; j<3; j++) {

 

1.while문

# while문
System.out.println(1);

int i = 0; # 숫자 세는 코드
           # i는 일반적으로 반복문에서 카운팅하기 위해 많이 지정함
# while(true) { # boolean 데이터타입으로 무한루트도 가능
while( i < 3 ) {
	System.out.println(2);
	System.out.println(3);
	i = i + 1; # 같은 코드 i++;
}

System.out.println(4);

 

 

2.for문

# for문
# 반복 횟수가 지정되있을 경우 for문을 쓰는게 좋다
# for문은 ()안에 boolean타입이 아닌 초기값을 세팅하는 코드가 들어감

for(int j=0; j<3; j++) {
	System.out.println(2);
	System.out.println(3);
}

System.out.println(4);

 

 



 

 

JAVA 제어문 - 7.2. 배열(Array)

 

 

엄청나게 많은 데이터를 반복해서 보통 쓰게되는데

엄청난 양의 데이터를 정리하기 위한 체계가 필요하게 된다. 이때 쓰는게 배열(Array)이고, 자바에서는 array 기본체계

반복문과 배열(array) 같이 많이 쓰인다

 

1.빈 배열을 만들고 값을 추가해서 넣는 방법

# 문자열로 이루어진 배열
# 빈 배열을 만들고 값을 추가해서 넣은 방법

String[] users = new String[3];  # [3]은 배열의 크기를 지정하는 것
users[0] = "egoing";    # 갯수를 셀 때는 1부터3까지 세개이나 자릿수를 셀 때는 프로그래밍에서는 0부터	
						# 0의 첫번째 자리는 egoing이라는 의미
users[1] = "jinhuck";
users[2] = "youbin";

System.out.println(users[1]);
System.out.println(users.length);// 세칸짜리 배열이라는 뜻

결과값 

jinhuck
3

 

2.배열 생성 시에 값을 담아서 생성시키는 방법

# 배열 생성시에 아예 값을 담아서 생성시키는 방법

# int[] scores = new int[3]
int[] scores = {10, 100, 1000};

System.out.println(scores[1]);
System.out.println(scores.length);

결과값

100
3

 

 

 

인덱스(Index)와 원소(Element)

index : 0 1 2

element(원소) : "egoing" "jinhuck" "youbin"

 

 

 

 

728x90
반응형
728x90

 

JAVA1 - 14.6. 나의 만들기 - 조건문

 

double valueOfSupply = Double.parseDouble(args[0]); //
double vatRate = 0.1;
double expenseRate = 0.3;
double vat = valueOfSupply*vatRate;
double total = valueOfSupply + vat;
double expense = valueOfSupply*expenseRate;
double income = valueOfSupply - expense;

double dividend1 = (valueOfSupply - expense) * 0.5;
double dividend2 = (valueOfSupply - expense) * 0.3;
double dividend3 = (valueOfSupply - expense) * 0.2;

if (income > 10000.0) {
dividend1 = income * 0.5;
dividend2 = income * 0.3;
dividend3 = income * 0.2;
} else {
dividend1 = income * 1.0;
dividend2 = income * 0;
dividend3 = income * 0;
}

run configuration에서 arguments 50000.0 5000.0 세팅

 


 

JAVA1 - 14.7. 나의 만들기 - 배열(Array)

수식배분 0.5,0.3,0.2 변수 전환 rate1,2,3

흔한 변수와 변수가 많아질 수록(코드가 길어질 수록) 문제발생

다른 사람이 같은 변수를 만든다던가 만든 나도 까먹는다던가

해결책은 배열(array)

 

배열(Array) 사용장점

변수가 세개에서 하나로 줄고, dividendRates[0~2] 연관된 값이라는 것을 직관적으로 있고,

변수가 오염될 가능성이 현저하게 감소, 연관된 자료 정리정돈 기능

 

*코드가 길고 복잡해지기 마련이기에 항상 코드 정리정돈할

*반복문과 배열을 사용면 폭팔적인 효과가 있음

 

 

public static void main(String[] args) {

 - 여기 String[] args 문자열로 이루어진 배열이라는 의미

 - 바로 아래 Double.parseDouble(args[0]); 위의 String[] args배열의 값을 꺼내오는 (배열값 도입)

 

double[] 변수명 = new double[3]; // double[] 의미 : 더블형으로 이루어진 배열이다

                // new double[3] 의미 : 더블형 데이터를 세개 담을 있는 공간 만들어진

 

 

아래 rate1,2,3 배열을 사용하여 dividendRates[0~2] 변경

double[] dividendRates = new double[3];
dividendRates[0] = 0.5;
dividendRates[1] = 0.3;
dividendRates[2] = 0.2;

double dividend1 = (valueOfSupply - expense) * dividendRates[0];
double dividend2 = (valueOfSupply - expense) * dividendRates[1];
double dividend3 = (valueOfSupply - expense) * dividendRates[2];

 

 


 

 

JAVA1 - 14.8. 나의 만들기 - 반복문(Loop)

배열과 반복문은 같이 쓰는게 시너지가 크다

 

수익 배분해야하는 투자자가 만명이 넘는 기업에서 일한다고 상상해보자

dividend 코드줄이 엄청나게 많아야한다면…?

반복문(loop) 해결가능

 

double dividend1 = income * dividendRates[0];
double dividend2 = income * dividendRates[1];
double dividend3 = income * dividendRates[2];

// println()을 반복문으로 해결

 

int i = 0; // 변수 초기화 및 반복문수 기록

while(i < dividendRates.length) { # dividend의 수(투자자수)만큼 반복해야함 // arguments에 입력값 입력        
System.out.println("Dividend 1 : " + (income * dividendRates[i]));  # dividend1을 dividendRates[i]로 변경

i = i + 1;

}

print문을 수천 수억개의 코드를 반복문 하나로 해결!

수정,유지보수도 이거 하나만 고치면 된다

 

728x90
반응형
728x90

 

[Java][에러 메세지]

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0

 

[원인]

array(배열)의 범위 밖이거나 값이 없을 경우 나는 에러

 

범위 밖일 경우

ex) int[] arr = {0, 1, 2, 3};

arr[5] = 5

에러발생

 

[해결]

범위 밖이라면 범위 밖에 있는 부분을 찾아 수정해주고,

값이 없다면 넣어줄 것!

 

 

728x90
반응형

+ Recent posts