JAVA

[JAVA] 배열

sian han 2022. 2. 19. 16:02

 

 

배열
  

- 같은 타입의 데이터를 여러 개 저장할 수 있는 저장소
  - 동일한 타입의 변수들을 하나의 이름으로 묶어 놓은 것
  - 참조형,  배열의 이름에 주소값이 들어감
 배열의 요소들은 인덱스(index,첨자)로 접근 가능

 

 

 

 

배열 선언

 

▶ 따로

1. 배열선언

int[]arr;

2. 메모리할당

arr = new int[3];

3.초기화 ( 배열에 입력하는 것 )

arr[0]=10;
arr[1]=23;
arr[2]=65;

 

 

 

 

▶ 한꺼번에

1. 배열선언, 메모리할당

 - 선언, 할당만 했을 경우 배열 요소들은 기본값 0 으로 초기화됨

int[] arr2 = new int[2];

 

2. 모두

int[] arr4 = new int[] {10,20,30};

 

 

 

 

 

 

※ 배열 변수의 복사


  - 배열 인스턴스( instance = 사례, 경우) 는 복사되지 않는다
  - 2개의 배열변수는 동일한 배열 인스턴스를 참조(가리킨다)
  - 배열은 참조형이므로 배열복사하면 같은 메모리 영역을 가리키게 됨

class ArrayCopy
{
	public static void main(String[] args) 
	{
		int[] a = new int[]{10,20,30};
		int[] b = a;
		a[0]++;
		System.out.println("a[0] : "+ a[0]); 
		System.out.println("b[0] : "+ b[0]); //a[0]를 증가시키면 b[0]도 증가됨
	}
}

 

 

 

 

 

 

※ 확장 for문 (Enhanced for문)
   

- 배열이나 컬렉션의 요소들을 반복처리할 때 사용

 - 배열에 데이터가 있는만큼 반복

for (타입변수 : 배열) {
			명령문;
				}
int[] number= {10, 20, 30, 40};
for (int n : number)
{
System.out.println(n);
}
==> 10 20 30 40

 

 

▽ 확장 for문 이용하여 오름차순 정렬

 - Array.sort 메서드 설명 하단 有

int[]arr = {10,5,47,53,1000,170,2,61};
		
		System.out.println("정렬 전");
		for(int n:arr) {
			System.out.print(n+" ");
		}
	
		Arrays.sort(arr);
		
		System.out.println("\n\n========정렬 후==========");
		for(int n:arr) {
			System.out.print(n+" ");
		}

정렬 전
10 5 47 53 1000 170 2 61 

========정렬 후==========
2 5 10 47 53 61 170 1000 

 

 

 

 

 

 

 

call by reference : 매개변수로 값이 넘어가는 것이 아니라 주소가 넘어감

 - 참조에 의한 호출

=> 배열을 매개변수로 받는 메서드

=> 같은 주소를 가지므로, 같은 곳을 가리키게 됨
=> 메서드에서 매개변수의 값을 변경하면 main()에서도 변수의 값이 변경됨(변경의 영향을 받음)

 

call by value : 값을 매개변수로 넘김

 - 값에 의한 호출

=> 메서드에서 매개변수의 값을 변경해도  main(메서드를 호출한 곳)에서는 변경의 영향을 받지 않는다

 

▽ 호출 의미는 사실 아직도 잘 모르겠음 ㅠ ㅠ . . . . .

중요한건 main 메서드에서 변수의 값이 변경되느냐 안되느냐 ! 

 

 

 

 

 

2차원배열

자바의 2차원 배열은 배열의 배열로 구성되어있다

자바의 다차원 배열에서 각 영역은 모두 reference (참조) 를 표시하는 공간이고, 마지막 배열 공간만이 실제 데이터를 나타내는 공간임. 

 

▶lenght 프로퍼티 (property 속성)

 - 배열의 길이를 얻어옴

ex )  int [][] arr = new int [3][2];

  - 위와 같이 배열선언, 메모리할당하면 아래처럼 메모리를 넣을 공간이 생성된다

arr [0][0] arr [0][1]
arr [1][0] arr [1][1]
arr [2][0] arr [2][1]

arr[0].length => arr[0][0], arr[0][1]

arr[1].length => arr[1][0], arr[1][1]

arr[2].length => arr[2][0], arr[2][1]

 

 

 

2차원 배열선언

▶따로

1. 배열선언

int[][] arr;

2. 메모리할당

arr = new int[2][3]; // 2행 3열

 행 : 밑으로 쌓임

 열 : 옆으로 쌓임

 

 

3. 초기화

arr[0][0]=10;
arr[0][1]=12;

 

▶한꺼번에 (2차원배열)

1. 배열선언, 메모리할당

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

2. 모두 한꺼번에

int[][] arr3= {{1,2,3,4,},{6,7,8,9},{11,12,13,14}};

 

2차원 배열호출(=출력)

 - 중복 for 문 사용해야지 요소 하나하나를 출력할 수 있음

 - 배열명 ( = arr) 안에는 '주소' 가 들어있기 때문에

    냅다 println(arr); 해서 호출하면 주소!!!!! 가 호출됨

for(int i=0;i<arr.length;i++) {//행
			for(int j=0;j<arr[i].length;j++) {//열
				System.out.print(arr[i][j]+"\t");
			}//안쪽 for
			System.out.println();
		}//바깥 for

 

 

 

 

 

 

 

※가변배열(Jagged Array)

 - 배열의 배열, 들쭉날쭉 배열, 동적 배열
  - 배열의 요소가 일정하지 않은 배열
  - 배열요소마다 크기를 다르게 지정할 수 있다
  (각 행마다 다른 크기의 배열을 생성하는 것이 가능)

int[][]arr=new int[3][];
		arr[0]=new int[] {4,2,8,9};
		arr[1]=new int[] {2,3};
		arr[2]=new int[] {5,2,7};
        
  == >
4	2	8	9	
2	3	
5	2	7

 

 

※명령줄인수( = Command-Line Arguments) 

 - 프로그램을 실행할 때 클래스이름 뒤에 공백문자로 구분하여 여러
개의 문자열을 프로그램에 전달 할 수 있음
예) d:>java MainTest hong 123
커맨드라인을 통해 입력된 두 문자열은 String배열에 담겨서
MainTest 클래스의 main메서드의 매개변수(args)에 전달됨
main 메서드 내에서 args[0], args[1]과 같은 방식으로 전달받은
문자열에 접근할 수 있음

 

(와 이거 진짜 무슨말인지 모르겠음

  쌤이 그냥 이런게있구나 하고 지나가도 된댔음

  쌤이 그냥 이런게있구나 하고 지나가도 된댔음

  쌤이 그냥 이런게있구나 하고 지나가도 된댔음 ) 

  

 

 

▣ Math.round()

 // public static int round(float a)

 // public static long round(double a)

 - 소수점 첫째 자리에서 반올림한 정수 값을 반환

Math.round(변수명)

 

▽ 소수점 셋째 자리에서 반올림하려면?

double d = 90.7552;
double d2 = Math.round(d*100)/100.0; 
== > 90.76

 

▣ Arrays.sort() 메서드

 - 오름차순 정령

 - import.java.util.*;

    <<<<<<<<

Arrays.sort(배열명);

 

 

 

▶ 특정 인덱스값 삭제하기

	Scanner sc = new Scanner(System.in);
		System.out.println("\n삭제하려는 인덱스를 입력하세요");
		
		int delIdx=sc.nextInt();
		
		for(int i=delIdx;i<arr.length-1;i++) {
			arr[i]=arr[i+1];
		}

 

 

 

▷▷ 배열 대표예제 ) 로또만들기

 - 배열 이용, 길이를 6으로

 - 1~45 중에서 6개 숫자 뽑기

 - 중복되지 않도록

package com.day10;
//LottoTest
import java.util.Scanner;
import java.util.Arrays;

public class VarClass05 {

	public static void main(String[] args) {
		//1. 요소가 6개인 배열 만들기
		int arr[]=new int [6];
		Scanner sc = new Scanner(System.in);
		
		while(true) {
			//2. 6번 반복처리
			for(int i=0;i<arr.length;i++) { //for문 : 배열에 차례대로 값을넣어라
				//3. 1~45 사이의 임의의 정수 구해서 배열에 넣기
				int temp=(int)(Math.random()*45+1);
				arr[i]=temp;
				
				//4.중복제거
				for(int k=0;k<i;k++) { // for문 : 차례대로 i이전값인 배열을 훑어라
					if(arr[i]==arr[k]) {
						i--; //i값을 감소시켜서 i번째값을 다시 뽑는다
						break;
					}
				}//안쪽for
			}//바깥for
			
			//5.정렬
			Arrays.sort(arr);
			
			//6.출력
			for (int n:arr) {
				System.out.print(n+"\t");
			}//for
			
			System.out.println("\n그만하려면Q");
			String quit = sc.nextLine();
			if(quit.equalsIgnoreCase("Q"))
				break;
		} // while
		
	}//main
}