미니멜로디

자바 배열(Array), 2차원 배열, 가변 배열 본문

프로그래밍/자바

자바 배열(Array), 2차원 배열, 가변 배열

미니멜로디 2018.02.24 13:57

메모리 구조
Stack : 일반 변수나 레퍼런스 변수 생성

레퍼런스 변수 : 주소를 저장하는 변수

Heap : New 연산자 사용시 생성 (동적 메모리)
Static : 정적(Static) 변수나 메소드가 생성


배열

동일한 타입을 가지는 변수들의 집합. 여러 개의 변수를 한 번에 선언 가능

많은 양의 데이터를 저장하기 위해 사용


- 선언 : 주소값을 저장하기 위한 레퍼런스 변수가 필요 (Stack)

자료형 [ ] 변수이름 ;
자료형 변수이름 [ ] ;


- 할당 : 배열객체 생성 후 변수에 주소값 할당 (Heap)
변수이름 = new 자료형 [저장데이터개수];

- 초기화

int [ ] arr = {1,2,3,4,5};                  // 자동으로 배열을 생성하여 초기값을 넣고 생성

int [ ] arr = new int [ ] {1,2,3,4,5};    // new를 이용하여 배열을 생성하고 초기값을 넣음


int [ ] arr = new int [5] {1,2,3,4,5};    // 이것은 에러가 발생. 초기값을 넣을 때에는 배열의 길이 생략


초기값 없이 배열의 사이즈를 선언하지 않으면 사용할 수 없다.

버블정렬

int [ ] arr = new int [5];

for(int i=0; i<arr.length; i++)

{

System.out.print((i+1) + "번째 숫자 입력 : ");

arr[i] = sc.nextInt();

}

int tmp;

for(int j=0; j<arr.length-1; j++)

{

for(int i=0; i<arr.length-1; i++)

{

if(arr[i]>arr[i+1])

{

tmp = arr[i];

arr[i] = arr[i+1];

arr[i+1] = tmp;

}

}

}

for(int i=0; i<arr.length; i++)

{

System.out.print(arr[i] + "\t");

}



복사 : 값을 복사


배열 복사
얕은 복사 : 참조하고 있는 주소값만을 복사하여 사용 (같은 데이터를 참조하는 형태)


int [ ] arr1 = new int [4];

int [ ] arr2 = arr1;


깊은 복사 : 새로운 공간을 생성하여 기존 데이터값을 복사하여 넣음 (Heap에 새로운 데이터 생성)

System.arraycopy 메소드

System.arraycopy(src레퍼런스, src인덱스, dest레퍼런스, dest인덱스, 길이);

- src레퍼런스 : 복사할 대상 레퍼런스

- src인덱스 : 복사할 대상의 시작 인덱스 번호

- dest레퍼런스 : 저장될 목적지 레퍼런스

- dest인덱스 : 저장될 대상의 시작 인덱스 번호

- 길이 : 개수

clone 메소드


System.out.print("사용자의 전화번호 : ");

String str = sc.next();

char [] ch = new char [str.length()];

for(int i=0; i<str.length(); i++)

{

ch[i] = str.charAt(i);

}

char [] copy = new char [str.length()];

// System.arraycopy() 메소드 이용

System.arraycopy(ch, 0, copy, 0, str.length());

// clone() 메소드 이용

copy = ch.clone();

for(int i=4; i<8; i++)

{

copy[i] = '*';

}

System.out.println(copy);

System.out.println(ch);



로또

// 내 번호

int [] me = new int [6];

for(int i=0;i<6;i++)

{

System.out.print((i+1) + "번째 자리 숫자 : ");

me[i] = sc.nextInt();

}

System.out.println("내 번호");

for(int i=0;i<6;i++)

{

System.out.print(me[i] + " ");

}

System.out.println();

// 로또 번호

System.out.println("로또 번호");

int [] lotto = new int [6];

int tmp;

boolean chk = false;

while(true)

{

for(int j=0;j<6;j++)

{

tmp = r.nextInt(45)+1;

for(int i=0;i<6;i++)

{

if(lotto[i] == tmp)

{

chk = true;

}

}

if(chk==false)

{

lotto[j] = tmp;

}

else if(chk==true)

{

j--;

chk = false;

}

}

for(int j=0;j<5;j++) // 버블정렬

{

for(int i=0;i<5;i++)

{

if(lotto[i]>lotto[i+1])

{

tmp = lotto[i];

lotto[i] = lotto[i+1];

lotto[i+1] = tmp;

}

}

}


for(int i=0;i<6;i++)

{

System.out.print(lotto[i] + " ");

}

System.out.println();

// 내 번호 = 로또 번호

int count=0;

for(int j=0;j<6;j++)

{

for(int i=0;i<6;i++)

{

if(me[j] == lotto[i])

{

count++;

}

}

}

if(count==4)

{

System.out.println("3등!");

}

if(count==5)

{

System.out.println("2등!!");

}

if(count==6)

{

System.out.println("1등!!!");

break;

}

}



2차원 배열

2차원 배열은 인덱스를 2개 사용하여 행과 열을 표현

자료형 [ ] [ ] 변수이름;

자료형 변수이름 [ ] [ ];

자료형 [ ] [ ] 변수이름 = new 자료형 [행크기][열크기];


int [ ] [ ] arr = new int [행] [열]    // 가로가 행, 세로가 열

int [ ] [ ] arr = new int [3][4];       // 3개의 행과 4개의 열이 만들어 짐


초기화

int [ ] [ ] arr = {1,2,3,4,5,6,7,8};    // 2x4 4x2 인지 모르기 때문에 불가능

int [ ] [ ] arr = {{1,2,3,4}, {5,6,7,8}};


while(true)

{

System.out.print("가로행의 개수를 입력하세요(1~10) ==> ");

int width = sc.nextInt();

if(!(1<=width && width<=10))

{

System.out.println("반드시 1~10 사이의 정수를 입력해야 합니다.");

continue; // break이 반복문을 빠져나가는 구문이라면 continue는 반복문을 다시 실행한다.

}

System.out.print("세로열의 개수를 입력하세요(1~10) ==> ");

int height = sc.nextInt();

if(!(1<=height && height<=10))

{

System.out.println("반드시 1~10 사이의 정수를 입력해야 합니다.");

continue;

}

else 

{

int [][] alphabet = new int [width][height];

for(int j=0;j<height;j++)

{

for(int i=0;i<width;i++)

{

alphabet [i][j] = r.nextInt(26)+97;

System.out.print((char)alphabet [i][j] + " ");

}

System.out.println();

}

break;

}

}




가변 배열

2차원 배열 선언시 마지막 열 크기를 지정하지 않고, 추후에 지정함으로써 고정된 2차원 배열 크기가 아닌 유동적인 가변 배열을 구성


자료형 [ ] [ ] 변수이름 = new 자료형 [행길이] [ ];


int [ ] [ ] arr = new int [3][ ];

arr[0] = new int [3];

arr[1] = new int [2];

arr[2] = new int [5];


System.out.println("----- A 아파트 정보 입력 -----");

System.out.print("건물 총 층수 입력 : ");

int floor = sc.nextInt();

String [][] apart = new String[floor][];

System.out.println(floor + "층이 생성 되었습니다");

for(int i=0;i<apart.length;i++)  // 2차 배열 length

{

System.out.print((i+1) + "층의 총 호실 입력 : ");

apart[i] = new String [sc.nextInt()];

}

for(int i=0;i<apart.length;i++)

{

System.out.println((i+1) + "층은 " + apart[i].length + "호실까지 생성 되었습니다");

}

System.out.println("각 호실마다 입주자의 이름을 입력하세요");

for(int i=0;i<apart.length;i++)

{

System.out.printf("========== %d 층 정보 입력 ========== \n",i+1);

for(int j=0;j<apart[i].length;j++)

{

System.out.printf("%d층 %d호 입주자 : ",i+1,j+1);

apart[i][j] = sc.next();

}

}

System.out.println("------- 각 층 입주자 정보 -------");

for(int i=0;i<apart.length;i++)

{

System.out.print((i+1) + "층 : ");

for(int j=0;j<apart[i].length;j++)

{

System.out.print(apart[i][j] + " ");

}

System.out.println();

}


0 Comments
댓글쓰기 폼