DAY+7 배열(단어 기본정리)/for-each, 복사, 난수, 2차원배열

2020. 8. 30. 23:32Web_Back-end/JAVA_선행

◎ 단어 정리

  • 인수
    • 인수는 메소드(함수) 또는 생성자를 호출할 때, 괄호안에 적으며, 미리 선언해 두었던 매개변수에 값을 대입함
  • 인스턴스
    • "객체는 클래스의 인스턴스다" 처럼 관계를 설명할 때 주로 사용
  •  매개변수
    • 매개변수는 실제로 값이 존재하지 않고, 어떤 형태로 입력값이 들어올 것인지를 정의해 준다
    • 함수에 값을 전달하는 변수, 기본형참조형으로 나뉜다
기본형 참조형
boolean, char, byte, short, int, long, float, double String, StringBuffer, List, 배열 등 기본형제외 나머지
계산을 할 수 있는 타입 '값'을 가지는 자료형 참조값 즉, '주소'를 가지는 자료형

고급배열

  • 무명배열
    • 배열의 이름을 지정하지 않고 초기값만으로 배열 생성
    • 즉시 배열을 만들어서 함수의 인수로 전달하고자 할 때 사용
    • 안드로이드 프로그래밍에서 많이 사용
    • 생성 방법 : new int[]{1,2,3,4,5} --> 초기값의 개수에 따라 배열의 크기가 결정된다
      • 한 번만 필요하고 다시는 참조할 일이 없는 곳에서 사용됨
      • 그냥 생성하는게 아니고(<-문법오류남) 어딘가에 인수로 전달할 때 쓰는것

 

for-each 루프

  • 사용법
    • for ( 변수 : 배열 {....} ) ;
  • 특징
    • for의 향상된 루프이며 배열에 사용하기 적합하다
    • 첫번째 요소부터 마지막 요소까지 변수에 차례대로 대입된다
  • 이점(+)
    • 배열의 크기를 신경 쓰지 않아도 된다
    • 인덱스 값을 저장하는 변수를 따로 선언하지 않아도 된다
    • 사용이 간결하다
  • 요소를 하나씩 꺼내서 처리한다면 for-each가 좋다
  • 예외 : 배열 요소의 값 변경, 역순으로 배열 요소 처리, 일부 요소만 처리, 하나의 반복루프에서 두개 이상의 배열 처리하는 경우에는 사용할 수 없다

 

< 예제1/ 무명배열, for-each 예제 >

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("함수인자로 전달하는 무명배열 사용 예: "+sum(new int[] {1,2,3,4}));
		System.out.println("for-each루프에서도 무명배열 사용가능");
		for(int value: new int[] {1,2,3,4})
			System.out.print(value+" ");
	}
	
    //배열을 변수로 받아서 합 구하는 함수
	public static int sum(int[] nums) {
		int total = 0;
		for(int i=0; i<nums.length; i++) {
			total+=nums[i];
		}
		return total;
	}

▽ console

더보기
예제 1 콘솔창

배열복사 ( 참조 ) 

  • 하나의 배열 변수를 다른 배열 변수로 복사할 수 있다.
  • 두개의 변수가 동일한 배열을 "참조" 하게 된다 <배열 : 참조형 변수이기때문 >
  • 사용법
    • 기존배열  int[] list = {1,2,3,4,5};   →  {1,2,3,4,5} //배열의 참조값=주소 를 참조함(list, list2 둘다)
    • 복사한 배열 int[] list 2 = list;     ---------↑

 

 배열복사 ( 진짜 복사copy 의 의미 )

  • 방법
    • Arrays 클래스의 copyOf() 메소드를 사용
    • copyOf(복사하려는 배열, 복사되는 배열의 크기)
    • 이때 복사되는 배열은 주소참조가 아닌 자체 값을 가지게 된다

 

< 예제 2/ 배열 복사 예제 >

		int[] list = {10,20,30,40,50};
		int[] list2 = list;  //list2는 list를 단순히 복사-참조한다
		list[0] = 1; //list 와 list2 의 0번 index 가 같음-참조했기 때문
		
       
		System.out.print("list: ");
		for(int num: list)
		System.out.print(num+" ");
		
		System.out.print("\nlist2: ");
		for(int num: list2)
		System.out.print(num+" ");
		
        
		System.out.print("\nlist3: ");
        //2*list 배열크기 즉 10크기만큼 복사 list가 5크기임-나머지 5크기는 초기화값이 출력
        //list3은 맨처음 선언한 list를 진짜복사 했기 때문에
		int[] list3 = Arrays.copyOf(list, 2*list.length); 
		//list3의 0번 index는 100으로 바뀜
        list3[0] = 100;
		for(int num: list3)
		System.out.print(num+" ");

▽ console

더보기
예제2 콘솔창

 배열 정렬 ( 크기순 )

  • 가장 좋은 방법
    • 퀵 정렬 ( 일반적인 경우에 가장 빠르고 효율적)
    • 사용방법은 여러가지임
    • 예) Arrays 클래스의 sort() 메소드 사용
    • Arrays.sort(배열);

 난수 발생하는 방법

  1. Random 클래스를 이용
    • boolean, int, long, float, double 난수를 얻을 수 있음
  2. Math.random() 이용
    • Math 클래스는 최상위 클래스 Object 클래스 안에 있어서 import 안해줘도 됨
    • double 형의 무작위 숫자 반환(0.0~1.0)
      • 정수를 사용하고 싶을 때 - (int)Math.random()
      • 정수인데 0~10 사이의 숫자 반환 - (int)Math.random()*10

 

< 예제 3/ 난수생성 예제 > - 난수 10개를 생성하여 배열에 저장한 후 정렬 (난수생성 ,퀵정렬)

		int[] nums = new int[10];
		
		for(int i=0; i<nums.length; i++) {
			int random = (int)(Math.random()*100); //*100 은 0~100까지의 난수발생의미
			nums[i] = random;
		}
		System.out.println("최초의 리스트: ");
		//for each 문은 for(변수: 배열) 이렇게 사용-> 배열값을 출력할때 간단히 쓰려고 만든 문법
        	for(int i : nums)
		System.out.print(i+" ");
		
		System.out.println("\n정렬된 리스트: ");
		Arrays.sort(nums); //배열 정렬-퀵정렬 Arrays 클래스의 sort()메소드 사용
		for(int i : nums)
		System.out.print(i + " ");

▽ console

더보기
예제3 콘솔창 - 난수출력 따라서 변동됨

 2차원 배열

  • 선언 방법 
    • int[] [] s = new int [3] [5] ---> 3 : 행 / 5 : 열
    • 3행 5열의 요소를 가지는 2차원 배열
    • 2차원 배열의 처리는 중첩 루프를 이용
//3행 5열 2차원 배열처리-중첩루프

int[][] s = new int[3][5];
for(int i = 0; i<3; i++){
	for(int j = 0; j<5; j++){
    	System.out.println(s[i][j]);
    }
}
s[0][0] s[0][1] s[0][2] s[0][3] s[0][4]
s[1][0] s[1][1] s[1][2] s[1][3] s[1][4]
s[2][0] s[2][1] s[2][2] s[2][3] s[2][4]

 

 

 2차원 배열 초기화

  • 1차원 배열과 마찬가지로 초기화 리스트가 존재하는 경우 new연산자 생략가능
//ex
int [][] array = {
	{10,20,30},
    {100,200,300},
    {1000,2000,3000},

];

 

 2차원 배열에서 length 사용법

  • 전체적으로 하나의 length 필드가 있고 : 이것은 행의 개수
  • 각 행마다 별도의 length 필드가 있다 : 이것은 각 행이 가지고 있는 열의 개수
//ex
int[][] array = {
	{10,20,30},
    {100,200,300},
    {1000,2000,3000}
};
for(int i=0; i<array.length; i++){
	for)int j=0; j<array[i].length; j++){
    	System.out.println(i+"행"+j"열:"+array[i][j]);
    }
}

 

◎ 다차원 배열

  • 3차원 배열 생성 방법
  • int[][][] dacha = new int[3][2][10];