본문 바로가기
Java

Java (3) - 자료구조와 배열의 필요성 / 배열의 종류 ( 1차원 배열 , 2차원 배열, 비정방형 배열, 가변형 리스트 ArrayList ) / 배열 복사하기

by leehii 2022. 6. 2.

ㅁ 배열 


ㅇ 개념


Array >> 같은 타입의 여러 데이터, 변수들을 하나의 묶음으로 한번에 관리할 수 있는 형태
배열의 형태, 이름, 크기가 필요

 


-----------------------------------------------------------------

 


배열 선언   ->    배열에 데이터 값 저장  ->  배열 호출

 


  =  new   int   [5];   ->    arr[0] = 1;         

 

형태    

(빌라/호텔/주택 )

 

선언

이름            

 

크기

int    

[]   

arr    

 new  int 

  [5];     

 

빌라이름

몇   호

 

사는 사람

              arr                

[0]  

=         

                 1;                 

   

 

arr[1] = 3;
arr[2] = 4;
arr[3] = 5;
arr[4] = 9;
------------------------------------------------------------------


           
--배열 선언과 동시에 저장하기             ->  배열 호출                 
  int [] arr = { 1, 3, 5, 7, 9 };    

 



ㅇ 작성 순서


1.배열선언


어떤 데이터 타입으로 만들껀지, 크기는 얼마나 줄껀지 생각하고 무슨 이름으로 줄껀지 생각하기.

 

빌라?주택?

빌라 몇 호?

빌라 이름?

 

 

 

빌라 층수

String 

[]  

 names

 =

new 

String

[5];

배열타입

인덱스

래퍼런스
변수명

 


배열생성

같은
배열타입

크기 지정 

(인덱스
몇 개인지?) 

 


ㄴnames 라는 이름에 String 5개를 인덱스(0번째~4번째의 5개의 공간)에 입력하겠다.
ㄴint [] numbers = new int[4]; 
  >> numbers [0]  -- 1번 인덱스에 위치한게 뭔지? 
       numbers [1]  -- 2번 인덱스에 위치한게 뭔지?     
       numbers [2]  -- 3번 인덱스에 위치한게 뭔지?
       numbers [3]  -- 4번 인덱스에 위치한게 뭔지?

 

 


2.변수 호출 >> 변수 불러오기


ㄴ배열의 이름만 호출할 시 배열의 '주소값'이 결과값으로 보여짐
ㄴ(ex) int [] array = new int [5]; System.out.println(array);


  실행해보면 [I@515f550a 이런 식으로 주소값이 나옴. 여기서 I를 보고 int형태인걸 알 수 있음
ㄴ(ex) String [] array2 = new String[5]; System.out.println(array2);


  실행해보면 [Ljava.lang.String;@626b2d4a 이런식으로 나옴. L을보며 문자형인걸 알 수 있음
  

 

 


3. 위치 호출 >> 배열의 세부적인 위치 접근 ( 배열 원소 접근)


   System.out.println(array[0]);   >>  0번 배열 자리에 뭐가 있는지??


   배열에 데이터값을 안주고 출력하면 자리만 있기때문에 몇번 [인덱스]를 불러오든 전부 0으로 출력됨

 

 


4. 배열에 데이터 값 저장하기


   arr[0] = 5;  System.out.println(array[0]);  >>  0번 인덱스에 5번 값을 줬기때문에 5가 출력됨


5. 배열의 값 수정

 

 

 

--기타--

 



ㅁ 이차원 배열

1차원 배열안에 또다른 1차원 배열들이 있는 것

 

 



int[몇층인지][몇호인지] >> 즉 int [행][열]로 표시가능함

int[][] arr = new int[2][4];


 

 

 



arr.length : 층에 대한 길이를 가져오는 내용
arr[?].length : 해당 층에 대한 길이를 가져오는 내용

 

 

 

 

ㅁ 비정방형 배열

 

 

 

 

 

 



ㅁ Arraylist


ㅇ 개념 


Array (베열) >>  데이터의 형태(int, String...)가 같은 자료들이 한번에 관리될 수 있는 기능 (임포트 작업이 필요함)


1.크기가 지정됨
2. 인덱스 번호([0], [1], [2],...)를 사용하여 위치값을 알아낼 수 있다.

ArrayList (가변 리스트) >>   데이터의 형태(객체 형태)가 같은 자료들이 한번에 관리될 수 있는 기능
 ㄴ객체 형태 : int 1, int2, int3 등을 모아둔 가방
  + 배열의 크기가 지정되지 않는 기능!

ㅇ 형태
ArrayList<String> names = new ArrayList<>();   //   <>: 객체에 대한 타입을 지정할 수 있는 제네릭 기법 
integer, DOuble, String등의 객체형태(레퍼런스)로 존재하는것만 사용가능



(p.s)
1. 값을 추가
   *.add(index,데이터값)
   *.add(데이터값)
   *.add();를 만들때 안에 names.add(1,"이국진"); 이런 식으로 추가하면 1번 인덱스 자리, 즉 2번째 자리에 추가됨
   이를 이용해서 원하는 자리에 추가가 가능함!
   
2. 값을 삭제
  *.remove(index)
  원하는 데이터 삭제하고싶다면 remove();를 써주면 됨
  *.remove(0); 이런식으로!   
  모든 값 한번에 삭제하려면 *.clear();
  
3. 값을 가져오기
  *. get(index);
   
4. 값을 검색하기
  *.contains("?"); -->> True, False 값으로 반환
   
-----------------------------------------------------------------------------------------------------

ㅇ 반복문 사용시의 특이점
for (int i = 0; i < names.size(); i++) {  
Syso(names.get(i));

for (int i = 0; i < names.length; i++) {    ->  !!!틀린 방식!!! size();를 써줘야 함
Syso(names.get(i));

ㅇ 정수를 담을때의 ArrayList
--ArrayList<int> names = new ArrayList<>(); 라고 쓴다 가정할때
  <> : 객체 타입 = 레퍼런스형 타입, 참조형 타입  = 주소값을 갖는 타입 (실제 데이터 값이 아닌)
  따라서 오류가 발생한다.

--ArrayList<Integer> numbers =  new ArrayList<>(); 라는
  int의 모음인 Integer을 사용해줘야 한다.
  


 



□ 배열복사

○ 종류
-- System.arraycopy(복사할 배열, 어디부터 복사할지의 인덱스번호, 붙여넣을 배열, 붙여넣을 시작 인덱스 번호,복사할 갯수);

(ex)
int [] arr1 = {1,2,3,4,5};
int [] arr2 = new int [5];
System.arraycopy(arr1, 0, arr2, 0, 7);

-->> arr2의 arr2[0] ~ arr2[7]에 arr1의 arr[0]부터 7개를 복붙하겠다

-- clone 메소드 생성하기

(ex)

int [] arr1 = {1,2,3,4,5};
int [] arr2 = new int [5];
int [] arr2 = arr1.clone();

-- arraycopy는 원하는 부분을 복사해서 가져올 수 있고, clone 메소드는 전체를 복사해서 옴!



3. 이클립스 배열.txt
0.01MB