본문 바로가기

Java

JAVA Programming(Ch 13. 배열)

 

 

=>
하나의 묶음으로 보기 . 따로따로 존재하는게 아니라 , 나란히 할당 되는 것 !
이후
, 이 배열의 참조값 주솟값 이 반환되어서 ref 라는 참조변수가 이를 참조하게 된다 .

 

< ArrayIsInstance >

public class ArrayIsInstance {
   
public static void main(String args[]) {
       
// 길이가 5 int 1차원 배열의 생성
       
int[] ar1 = new int[5];


       
// 길이가 7 double 1차원 배열의 생성
       
double[] ar2 = new double[7];


       
// 배열의 참조변수와 인스턴스 생성 분리
       
float[] ar3;
       
ar3 = new float[9];

       
// 배열의 인스턴스 변수 접근
       
System.out.println("배열 ar1의 길이 "+ ar1.length);
       
System.out.println("배열 ar2의 길이 "+ ar2.length);
       
System.out.println("배열 ar3의 길이 "+ ar3.length);
   
}
}

 

< 출력 >

배열 ar1의 길이 5

배열 ar2의 길이 7

배열 ar3의 길이 9

* 인스턴수 변수 length에 접근하여 배열의 길이 정보 출력 -> 인스턴수 변수에 접근이 가능하다는 것은 배열이 인스턴스임을 보이는 결과 !

Ex) 1차원 배열의 참조변수는 배열의 길이에 상관없이 참조 가능 예

public static void main(string args[] ) {

int [] ar = new int[50];

System.out.println(length : + ar.length); // length : 50

ar = new int[100]; // 길이가 다른 배열 참조

System.out.println(length : + ar.length); // length : 100

          

< ArrayIsInstance2 > - 자료형 대상이 아닌 클래스의 인스턴스를 대상으로 배열 선언 예시

 

class Box {  // Box 클래스 정의
   
private String conts;

   
Box(String cont) {
       
this.conts = cont;
   
}
   
public String toString() {
       
return conts;
   
}
}

public class ArrayIsInstance2 {
   
public static void main(String args[]) {
        Box[] ar =
new Box[5]; // 길이가 5 Box 1차원 배열의 생성
       
System.out.println("length : " + ar.length); // length : 5 
   
} // Box인스턴스를 다섯개 저장할 수 있는 배열을 생성해라 !
}

 

< 출력 >

length : 5

* Box인스턴스 5개 저장할 수 있는, Box형 참조변수 다섯개로 이루어진 배열 생성.              
이 인스턴스의 참조값이 반환돼서 ar이 참조하게 된다.

-> “ 이는 Box 인스턴스 5개를 저장할 수 있는 참조변수의 배열이다 “

 

* [ ] - > '' 자리에 무엇이든 올 수 있음. 기본 자료형의 이름뿐만아니라 우리가 정의하는 클래스의 이름도 올 수 있다 !

 

< BoxArray > Box형 인스턴스 저장 및 참조 방법도 유사 ( 저장 대상 차이 )

 

 

class Box{
   
private String conts;

   
Box(String cont) {
       
this.conts = cont;
   
}
   
public String toString() { //conts가 가지고 있는 문자열의 참조값, String형 인스턴스의 참조값을 반환
           
return conts;
   
}
}

public class BoxArray {
   
public static void main(String args[]) {
        Box[] ar =
new Box[3];

       
// 배열에 인스턴스 저장. *이렇게 저장가능하다 !
       
ar[0] = new Box("First"); // Box인스턴스에 문자열을 가지고 있는 것
       
ar[1] = new Box("Second");
       
ar[2] = new Box("Third");

       
// 저장된 인스턴스의 참조. * 이렇게 참조가능하다 !
       
System.out.println(ar[0]); // -> 인자로 전달된 인스턴스의 toString 메소드를 호출해서 그 때 반환되는 문자열을 출력
       
System.out.println(ar[1]);
       
System.out.println(ar[2]);

   
}
}

 

< 출력 >

First

Second

Third

 

 

< 배열을 생성과 동시에 초기화 >

 

- 생성

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

 

- 초기화

* int [ ] arr = new int [ 3 ] { 1, 2, 3 };    // 컴파일 오류 발생

-> 이 배열을 초기화 하고자 하는 값을 쓸 수가 있음. 생성자가 동시에 지정해준 값으로 초기화

But) 위 문장에서는 초기화할 값들의 수를 통해 배열의 길이 정보를 계산할 수 있으므로, 이 경우 '배열의 길이 정보를 생략하도록 약속'. 

 

( 수정 필요. 이렇게 써줘야함 ! )

* int [ ] arr = new int [ ] { 1, 2, 3 } ;    // 생성되는 배열의 길이는 3

               (생략 가능)            

           -> 배열의 길이 정보를 컴파일러가 알아서 계산해서 넣어줌.

( 줄여서 표현 )

* int [ ] arr = { 1, 2, 3 } ;     // 생성되는 배열의 길이는 3 

 

* 참조변수 선언의 두 가지 방법 ( 둘 다 동일한 의미로 사용 )

int [ ] ar = new int [ 3 ] ;    // 조금 더 선호하는 방법

int ar [ ] = new int [ 3 ] ;    // 이것도 된다 !

 

* main 메소드에서 만들었다고 main 메소드에서만 접근 가능한 것이 아니다.
참조값을 가지고 있으면 누구나 접근이 가능하며, 참조값을 주고 받는 것이 가능하다 .

( 배열의 특성 )

 

class Main {
   
public static void main(String args[]) {
       
int[] arr = {1, 2, 3, 4, 5, 6, 7}; // 길이가 7인 배열 생성
       
int sum = sumOfArray(arr); // int형 변수 sum에 배열의 참조값 저장
       
System.out.println(sum);
   
}
   
// 매개변수 선언 위치에도 참조변수 선언이 올 수 있음.
    // int
형 배열의 참조값이 전달
   
static int sumOfArray(int [] arr) { // int형 배열의 참조값이 전달
       
int sum = 0; // sum 변수를 0으로 초기화
       
for(int i = 0; i < arr.length; i++) // 배열의 길이만큼 반복
           
sum += arr[i]; // 배열의 인자를 sum에 더함
       
return sum;
   
}
}

 

 

 

EX) ar -> 특정값으로 초기화를 안해서 다 0으로 저장되어 있다고 가정.                                                                            그러면 이 배열이 다 3으로 채워진다 !

 

 

< ArrayUtils >

import java.util.Arrays;

public class
ArrayUtils {
   
public static void main(String args[]) {
       
int[] ar1 = new int[10];
        int
[] ar2 = new int[10];

       
Arrays.fill(ar1, 7); // 배열 ar1 7로 초기화
       
System.arraycopy(ar1, 0, ar2, 3, 4); // 배열 ar1 ar2로 부분 복사

       
for(int i = 0; i < ar1.length; i++)
            System.
out.print(ar1[i] + " ");
           
System.out.println(); // 단순 줄 바꿈

       
for(int i = 0; i < ar2.length; i++)
            System.
out.print(ar2[i] + " ");
   
}
}

 

< 출력 >

7 7 7 7 7 7 7 7 7 7

0 0 0 7 7 7 7 0 0 0

 

 

 

13-2 enhanced for ( for-each문 이해 )

 

< enhanced for문 이해와 활용 >

* '배열'이 등장 -> 여지없이 등장하는 것이 'for' -> ' 배열 요소의 순차적 접근을 위해 등장 '

           --> 좀 더 간단하게 줄여서 할 수 있는 방법 제공 ( enhanced for)

 

* 프로그램을 작성하다 보면 배열에 저장된 모든 요소를 대상으로 연선, 참조 또는 탐색 진행하는 경우 흔히 볼 수 있음.

배열에 저장된 값 중에서 특정 조건에 해당하는 값을 찾아라. “

배열에 저장된 모든 값에 대해 12%씩 그 값을 증가시켜라

                      --> 이를 돕기 위해 등장한게 'enhanced for' (for-each)

EX) '배열에 저장된 모든 값을 출력하라' for문 작성

- 코드의 특징 : 배열 요소의 순차적 접근

 

 

< EnhancedFor > ' for < - > for - each 문서로 바꾸는 연습해보기 !

public class EnhancedFor {
   
public static void main(String args[]) {
       
int[] ar = {1, 2, 3, 4, 5};

       
// 배열 요소 전체 출력 -> 순차적 저장 후 실행
       
for (int e : ar) {
            System.
out.print(e + " ");
       
}
        System.
out.println();  // 단순 줄 바꿈


       
int sum = 0;

       
// 배열 요소의 전체 합 출력
       
for (int e : ar) {
            sum += e
;
       
}
        System.
out.println("sum: " + sum);
   
}
}

 

< 출력 >

1 2 3 4 5

sum: 15