
배열 ★★★★★
- 같은 타입의 데이터를 여러 개 저장할 수 있는 저장소
- 동일한 타입의 변수들을 하나의 이름으로 묶어 놓은 것
- 참조형, 배열의 이름에 주소값이 들어감
배열의 요소들은 인덱스(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
}
'JAVA' 카테고리의 다른 글
| [JAVA] 생성자 / 접근제한자 / getter,setter (0) | 2022.02.22 |
|---|---|
| [JAVA] 객체와 클래스 (0) | 2022.02.21 |
| [JAVA] 오버로딩 / 재귀호출 메서드 생성 / Math.random (0) | 2022.02.18 |
| [JAVA] 메서드 (0) | 2022.02.16 |
| [JAVA] 반복문 / while / do~while문 / 무한루프 / charAt / for문 마지막 "," 제거 (0) | 2022.02.15 |