배열
여러개의 "같은 타입의 값"을 효과적으로 관리하기 위한 객체
예를 들어 ,
10개의 값을 사용해야 한다고 쳤을 때
값을 담아줄 변수는 10개가 필요하다. → 만약 100개가 필요하다면 100개를 다 써함
int a= 1;
int b = 2;
int c=3;
...
int g= 6;
int h = 7;
int i = 9;
int j = 10; >> 비효율적이다
int [] a = new int[] {1,2,3,4,5,6,7,8,9,10}
//이렇게 하나로 만들어주는 것이 배열
index: 0 ~ length-1 → 번지수는 길이에서 마이너스 1 한 값
a의 크기는 10개짜리의 방이고 번지수는 0부터 시작하여 9 까지의 번지수를 가짐
크기 고정
배열은 모두 참조타입
type [ ] 변수 = 배열객체 ;
[ ] 하나 있으면 일차원 [][] 두개는 이차원 배열
new 연산자를 사용하지 않아도 객체 생성 가능
같은 type의 여러개의 값을 효과적으로 관리하기 위한 객체
1차원 배열 만드는 방법 3가지
int [] a ; //a라는 변수 선언
a = new int [5]; //정의 a라는 변수에는 int 값만 담겠다
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
a[4] = 5;
int [] b = new int [] {5,4,3,2,1} ; // 선언 정의 초기화
int [] c = {6,7,8,9,10}; //선언후 바로 초기화
호출방법
System.out.println(a[1]); a의 1번지를 호출한다.
System.out.println(a); a라는 배열은 참조타입이기 때문에 호출시 주소값이 출력된다.
System.out.println(Arrays.toString(a)); java.util 패키지의 Arrays 클래스 toString 메소드를 사용하여 전체 값 출력한다.
System.out.println(a[1]+b[3]+c[0]); 배열 값 호출하여 연산가능
shallow copy
같은 객체의 주소값 대입 복사본을 수정하면 원본도 수정된다.
deep copy
새로운 객체 생성 복사본을 수정해도 원본 변화가 없음 .(새로운 객체를 생성해 값만 복사 )
2차원 배열 만드는 방법 4가지
int [][] a = new int [3][2]; 왼쪽의 큰 배열 안에 오른쪽 작은배열이 들어간다는 뜻
a[0][0]=1;
a[0][1]=2;
a[1][0]=3;
a[1][1]=4;
a[2][0]=5;
a[2][1]=6;
호출방법
System.out.println(Arrays.toString(a));
// [[I@7637f22, [I@4926097b, [I@762efe5d] 커다란 배열 3칸 안에 작은 배열이 들어갔다는 뜻
값을 출하려면
System.out.println(Arrays.deepToString(a));
호출하면 [[1, 2], [3, 4], [5, 6]] 이렇게 나온다.
int [][] b = new int [3][]; /큰 배열은 3칸 작은배열은 공란
b[0] = new int [3];
b[1] = new int [5];
b[2] = new int [1];
=> 작은 배열의 크기가 모두 똑같지 않아도 된다.
int [][] c = new int[][] {{1,2},{3,4,5},{6,7,8,9},{10}};
int [][] d = {{1,2,3,4},{5},{6,7,8},{9,10}};
System.out.println(c.length); //4개의 커다란 배열이기 때문에 4
//c 내부의 배열 의 length는 커다란 번지를 넣고 호출한다
System.out.println(c[0].length); ->2
System.out.println(c[1].length); ->3
System.out.println(c[2].length); ->4
System.out.println(c[3].length); ->1
public static void main(String[] args){
String [] strArray = {"java","Android","C","JavaScript","Python"};
for(String x :strArray) {
System.out.println(x); // 반복실행문
}
}
변수 x 에 배열 strArray 의 값이 차례로 대입되며 출력된다.
우리가 앞서 배운 기본 배열은 프로그램에서 사용하려면 항상 배열의 길이를 설정하고 시작해야한다. 그래서 배열의 길이를 변경하거나 요소의 위치를 수정할때 귀찮고 복잡해진다.
그래서 자바는 객체 배열을 쉽게 사용 할 수 있도록
객체 배열클래스ArrayList
를 제공한다.
add()
메소드를 사용하여 배열의 길이와 상관없이 객체를 추가할 수 있다.
기본형식
ArrayList<E> 배열이름 = new ArrayList<E>();
기본 배열에서는 [ ] 안에 배열 전체 길이를 미리 지정해야 했지만
ArrayList
를 생성할 때는 배열의 길이를미리 지정할 필요 없이
add()
메소드를 사용해 생성자만 호출하면 된다.
기본배열
String[] array = new String[2];
array[0] = "one";
array[1] = "two";
array[2] = "three"; => 오류가 발생한다.
2개의 배열을 선언했는데 3개를 만들려고 하면 오류가 발생하는것
for(int i=0; i<array.length;i++){
System.out.println(array[i]); // 값 가져오는 방법
ArrayList를 사용하기
import java.util.ArrayList; // ArrayList 임포트해야 사용가능
ArrayList al = new Arraylist ();
al.add("one");
al.add("two");
al.add("three");
for(int i=0;i<al.size(); i++){
//배열의 길이를 알고싶을땐 length 메소드를 사용했지만
//ArrayList 의 크기를 알고싶을땐 size 메소드를 사용한다
System.out.println(al.get(i)); //저장한 값 가져올땐 get 메소드 사용
}
주의
for(int i=0;i<al.size(); i++){
String value = al.get(i);
System.out.println(value);
// 값을 호출할때 value 라는 변수에 al.get(i) 를 담았을 때 오류가 발생한다
why??
Arrylist 는 모든 값은 object 타입으로 가지고 있기 때문에
object 값이 호출된 al.get(i)를 String 타입의 vlaue 라는 변수에 담으려고 해서
오류가 발생하는 것이다.
오류를 해결하려면,
for(int i=0;i<al.size(); i++){
String value = (String)al.get(i); //String 데이터타입으로 변환 후 !
System.out.println(value);
하지만 이 방법을 사용하면 안정성이 떨어지기 때문에 권하지 않는다