Java05 Arrays(배열)

차차·2021년 7월 17일
0

Java

목록 보기
5/11

배열
여러개의 "같은 타입의 값"을 효과적으로 관리하기 위한 객체

예를 들어 ,

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}
 //이렇게  하나로 만들어주는 것이 배열
  1. index: 0 ~ length-1 → 번지수는 길이에서 마이너스 1 한 값

  2. a의 크기는 10개짜리의 방이고 번지수는 0부터 시작하여 9 까지의 번지수를 가짐

  3. 크기 고정

  4. 배열은 모두 참조타입

  5. type [ ] 변수 = 배열객체 ;

  6. [ ] 하나 있으면 일차원 [][] 두개는 이차원 배열

  7. new 연산자를 사용하지 않아도 객체 생성 가능

  8. 같은 type의 여러개의 값을 효과적으로 관리하기 위한 객체

1차원 배열

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차원 배열

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}};

배열의 length

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 

향상된 for 문

public static void main(String[] args){
String [] strArray = {"java","Android","C","JavaScript","Python"};
		
		for(String x :strArray) { 
			System.out.println(x);  // 반복실행문 
		}
	}
  변수 x 에 배열 strArray 의 값이 차례로 대입되며 출력된다. 

ArrayList 클래스 사용하기 (Collection에서 자세히)

우리가 앞서 배운 기본 배열은 프로그램에서 사용하려면 항상 배열의 길이를 설정하고 시작해야한다. 그래서 배열의 길이를 변경하거나 요소의 위치를 수정할때 귀찮고 복잡해진다.

그래서 자바는 객체 배열을 쉽게 사용 할 수 있도록
객체 배열클래스 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); 
하지만 이 방법을 사용하면 안정성이 떨어지기 때문에 권하지 않는다 
profile
개발하는 돌멩이🙄🙄👻

0개의 댓글