본문 바로가기

Server Programming/BackEnd Project

18일차 - 자바 (6) 객체와 배열

반응형

1. 객체 참조 변수 - Memory

  • 객체 참조값을 가지고 객체를 핸들링
  • 다른 객체 참조값을 지정하면 새로운 인스턴스를 참조하게 된다.
    • 먼저 null로 초기화 후, 새로운 인스턴스를 참조하도록 하는걸 권장한다.
  • 하나의 인스턴스를 여러개의 참조변수가 참조할 수 있지만
    하나의 참조변수가 여러개의 인스턴스를 참조할 수는 없다.

  • 객체의 초기화와 메모리 할당 순서
    1. 언된 상에서는 메리의 reference를 위한 공간만을 할당
      (스택 영역)
    2. new 연산자를 사용해만 MyDate를 위한 공간이 할당됨
      (힙 영역)
    3. 버들의 명시적인 기화
    4. 생성자를 실행
    5. 변수에 Reference값 할당
       
  • String의 경우에는 String poll에 리터럴 형태로 저장된다.
  • 따라서 같은 문자열의 경우 하나의 문자열 객체만을 가리킨다.
  • new로 생성할 때만, 새로운 객체를 생성한다.
  • C언어로 작성된 네이티브 코드로 동작하고 해시 테이블을 통해 해당 문자열이 존재하면 해당 값을 참조한다.

 

2. 배열의 정의

  • 참조변수를 통해 다루는 같은 타입의 여러 변수를 하나의 묶음으로 다룰 수 있는 객체
  • 동적으로 생성되는 객체로, 객체 타입의 변수로 할당된다.
  • Object 클래스의 모든 메서드 호출 가능
  • 배열안에 포함된 변수는 이름이 없고, 인덱스로 다룬다.
  • 배열안의 변수는 컴포넌트라고 부르고, 컴포넌트의 개수를 배열의 길이라고 한다.

 

3. 배열의 선언과 할당

  • 배열은 타입 또는 변수 이름 뒤에 대괄호를 붙여서 선언한다.
  • 선언 후 몇 개의 공간을 할당할지 정해줘야 값을 저장할 공간이 생성된다.
  • 선언과 할당이 동시에 가능하다.

 

4. 배열의 활용

  • 배열의 길이 : length
  • 배열의 예외 : 배열 접근시 int타입의 값으로 해야한다.
  • 배열의 접근하기 위한 인덱스가 0보다 작거나 배열의 크기보다 크면 안된다.
  • 배열의 복사
    • Arrays.copyOf() : 새로운 배열 생성 가능, 전부 복사하거나 복사 대상의 객체를 유지시킬 필요가 없을 때 사용 (더 빠름)
    • System.arraycopy() : 복사 길이를 명시해야 하거나, 객체를 유지하고자 할 때 사용

 

 

package ch06;

public class ArrayEx01 {

    public static void main(String args[]){

        int[] widths;       // 배열 선언 방식1
        //int []widths;       // 배열 선언 방식2
        //int widths[];       // 배열 선언 방식3

        widths = new int[3];//배열 생성

        // 선언과 생성
        int[] ages = new int[5];
        //int[] ages = {20, 15, 33, 42, 19};
        // 배열에 값 할당
        ages[ 0 ] = 20;
        ages[ 1 ] = 15;
        ages[ 2 ] = 33;
        ages[ 3 ] = 42;
        ages[ 4 ] = 19;

        // 객체 배열 선언, 생성, 값 할당을 동시에 할 수 있다
        Order orders[] = {
            new Order(1, "라면"),
            new Order(2, "세제"),
            new Order(3, "과자")
        };

        // 특정 배열 index(위치)의 값 출력
        System.out.println(ages[0]);

        //배열의 길이는 int타입으로만 선언이 가능하다.
        //long longLength = 10L;
        //long longTypeArray = new long[longLength];

    }
}
package ch06;

import java.util.Arrays;

public class ArrayEx02 {
    public static void main(String args[]) {
        int[] arr1 = new int[10];
        int[] arr2 = {100, 95, 80, 70, 60};
        char[] chrArr = { 'a', 'b', 'c' };

        // 배열에 값 할당
        for (int i=0; i < arr1.length ; i++ ) {
            arr1[i] = i + 1;
        }

        // 배열의 값 출력
        for(int i=0; i < arr2.length;i++) {
            System.out.print(arr2[i] + "\t");
        }

        System.out.println();

        System.out.println("for-each loop 배열 출력");
        for(int i:arr1){
            System.out.print(i + "\t");
        }

        System.out.println();

        // Arrays.toString는 배열의 내용을 출력하는데 사용한다
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        System.out.println(Arrays.toString(chrArr));

        System.out.println();
        // 배열 변수는 객체참조변수라서 배열 변수는 배열의 주소값만 보관된다
        System.out.println(arr1);
        System.out.println(arr2);
        System.out.println(chrArr);
    }
}

 

MSA 관련 블로그

  • 오늘의 집
  • 우아한 형제들
  • 카카오
  • 네이버

5. 다차원 배열

  • 2차원 이상의 배열은 가변적으로 생성할 수 있어 가변 배열이라고도 한다
  • 1차원의 배열 크기를 지정하면 자바에서 가변으로 생성하기 때문에 2차원 이상의 배열크기를 지정하지 않아도 선언이 가능하다.
  • 언과 할당 Case 1 :
    데이터타입[][] 배열변수명 = new 데이터타입[1원 length][2원 length];
    예) int[] ages = new int[3][2]; <- 3행 2의 2차원 배열을 생성
  • 언과 할당 Case 2 :
    데이터타입[] 배열변수명 = { 콤(,) 구분자의 배열 개수만값 할당 };
    예)int[][]ages={{10,20}, {30,40}, {50,60}};
package ch06;

public class ArrayEx03 {
    public static void main(String args[]) {
        // 다차원 배열 => 가변 배열(Jagged Array)
        int[][] ages = {
            { 20, 15, 33, 72 },
            { 12, 50 },
            { 57, 20 },
            { 27, 32, 89 },
            { 73, 17 }
        };
        int sum = 0;

        // 이중 For 문
        for(int i=0;i < ages.length;i++) {
            for(int j=0;j < ages[i].length;j++) {
                System.out.printf("score["+i+"]["+j+"]="+ages[i][j]+"\n");
            }
        }

        // For-each Loop 문 (합계)
        for (int[] tmp : ages) {
            for (int i : tmp) {
                sum += i;
            }
        }

        System.out.println("합계 = "+sum);
    }
}

 

 

 

package ch06;

public class ArrayEx05 {
    public static void main(String args[]) {

        // 2차원 배열의 length는 지정 안할 수 있다
        int[][] arrVar1 = new int[3][];

        // 0번째 배열 인덱스에 2차원 배열을 생성하고 값을 할당한다
        arrVar1[0] = new int[2];
        arrVar1[0][0] = 1;
        arrVar1[0][1] = 2;

        // 1번째 배열 인덱스에 2차원 배열을 생성하고 값을 할당한다
        arrVar1[1] = new int[5];
        arrVar1[1][0] = 3;
        arrVar1[1][1] = 4;
        arrVar1[1][2] = 5;
        arrVar1[1][3] = 6;
        arrVar1[1][4] = 7;

        int[][] arrVar2 = new int[2][];
        // 2차원 배열 생성 및 값 할당을 동시에 처리
        arrVar2[0] = new int[]{3, 4, 5};
        arrVar2[1] = new int[]{6, 7, 8};

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

        System.out.println(arrVar1.length);
        // 2차원 배열의 length 값 출력
        System.out.println(arrVar1[0].length);
        System.out.println(arrVar2[1].length);
        System.out.println(arrVar3[2].length);

    }
}

 

 

package ch06;

public class ArrayEx06 {
    public static void main(String args[]) {

        // 가변 배열 생성
        int arr[][] = new int[3][];
        arr[0] = new int[3];
        arr[1] = new int[4];
        arr[2] = new int[2];

        // 가변 배열 초기화
        int count = 0;
        for (int i=0; i<arr.length; i++)
            for(int j=0; j<arr[i].length; j++)
                arr[i][j] = count++;

        // 가변 배열 값 출력
        for (int i=0; i<arr.length; i++){
            for (int j=0; j<arr[i].length; j++){
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }

    }
}

geteClass(), getName()

package ch06;

/**
 * 배열 클래스 명
 */
public class ArrayEx07 {
    public static void main(String args[]) {

        int     iarr[] ={4,4,5};
        byte    barr[] ={4,4,5};
        short   sarr[] ={4,4,5};

        // Java 배열의 클래스 이름 얻기
        Class i=iarr.getClass();
        Class b=barr.getClass();
        Class s=sarr.getClass();

        String name1=i.getName();
        String name2=b.getName();
        String name3=s.getName();

        // 배열 객체의 경우 객체의 getClass().getName()를 통해 클래스명을 얻을 수 있는 프록시 클래스가 생성된다
        // 배열의 클래 이름의 타입과 동일하다
        System.out.println(name1); // [I
        System.out.println(name2); // [B
        System.out.println(name3); // [S
    }
}

1. 홀수 짝수 출력

package ch06;

/**
 * 배열의 홀수 짝수 출력하는 예제
 */
public class OddEvenInArray {
    public static void main(String args[]){

        int a[]={1,2,5,6,3,2};
        System.out.println("홀수 :");
        for(int i=0;i<a.length;i++){
            if(a[i]%2!=0){
                System.out.println(a[i]);
            }
        }
        System.out.println("짝수 :");
        for(int i=0;i<a.length;i++){
            if(a[i]%2==0){
                System.out.println(a[i]);
            }
        }
    }
}

 

2. 중복 확인

package ch06;

/**
 * 배열의 중복 element 찾아 출력하기
 */
public class DuplicateArray {
    public static void main(String[] args) {

        int [] arr = new int [] {1, 2, 3, 4, 2, 7, 8, 8, 3};
        System.out.println("중복 elements : ");

        int n=arr.length;
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(arr[i]==arr[j]) System.out.println(arr[i]);
            }
        }
        // 구현해보기 : 이중 for문 사용
        /*
        출력결과)
        중복 elements :
        2
        3
        8
         */
    }
}
반응형

'Server Programming > BackEnd Project' 카테고리의 다른 글

19일차 - TIL  (0) 2022.12.30
18일차 - TIL  (0) 2022.12.29
17일차 - TIL  (0) 2022.12.28
17일차 - 자바 (5) 객체지향의 이해, 객체와 배열  (0) 2022.12.28
16일차 - TIL  (0) 2022.12.27