[JAVA 언어] 참조타입(배열, String), GC

최수정·2023년 8월 23일
0

이것이 JAVA다

목록 보기
10/10

참조타입

  • 참조타입이란 객체의 메모리 번지를 참조하는 타입이다. (기본 타입은 값을 저장)

  • 배열, 열거, 클래스, 인터페이스 타입이 있다.

  • 변수 - 메모리 주소 : 스택영역 / 실제 저장 : heap영역

  • image-20230822111745727

  • 참조 타입의 값 비교 (+String)

    • 저장 항목이 같아도, 다른 번지 주소를 가지면 다른 객체로 인식
 int [] arr1 = new int[] {1,2,3};
 int [] arr2 = new int[] {1,2,3};
 int [] arr3 = arr2   // 배열 복사, 같은 번지값 참조
 
 System.out.println("arr1 == arr2"); // false 
 System.out.println("arr2 == arr3"); // true
  • String의 경우엔, 문자열 리터럴이 동일하다면 String 객체를 공유하도록 설계됨- new 연산자 사용 안 한다 가정image-20230822112649417

    name1 == namw2  // true
    // 같은 객체든 상관없이 내부 문자열 비교 
    name1.equals(name2); // true
    ! name1.equals(name2); // false

GC, Garbage Collector

  • 참조되지 않는 heap영역의 객체 자동 제거
  • 코드로 직접 제거 x, 해당 객체의 모든 참조를 없애면 버려짐.
    • 참조 하고 있던 변수가 다른 참조 값을 가질 때
    • 참고 하고 있던 변수가 null 값으로 초기화 될 때

배열 타입

  • 배열의 길이는 늘리거나 줄일 수 없다.

    int[] arr = new int[30]; // int의 경우 이렇게 선언하면 0으로 초기화됨. String은 null 
  • 선언/초기화 시, 주의사항

    • 매개변수로 선언이 되어 있고, 함수를 호출 할 때도 같은 조건임 new 키워드 붙여줄것.
    int [] arr = {1,2,3,4,5}; // O
    
    int [] arr;
    arr = {1,2,3,4,5}; // 컴파일 에러 
    arr = new int[] {1,2,3,4,5}; // O 선언과 초기화 시점이 다르다면 new 키워드를 활용 
    
    // 메서드 관련
    void printItem(int[] arr) {
    }
    printItem( {1,2,3,5} ) // X 
    printItem( new int[] {1,2,4,5} ) // O 
  • 배열변수.length 로 배열의 길이를 구할 수 있다.

배열복사

  • 길이의 변동을 줄 수 없어, 크기 비교를 해보고 복사 가능. 작은 배열에서 큰 배열로의 복사는 가능.
  • 일반 for문 사용 or arraycopy() or 향상된 for문 사용

git

package practiceJAVA;

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

        int [] arrInt = {1,2,3,4,5};
        String [] arrStr = {"최수정","차수림","윤원빈","허진주"};

        int [] arrIntCopired = new int[5]; // 복사 대상보다 같거나 크게 공간 설정
        String [] arrStrCopierd = new String[5];

        /**
         * basic : for문
         */
        for(int i=0; i<arrInt.length; i++){
             arrIntCopired[i] = arrInt[i];
        }

        System.out.print("basic copy result: ");
        printInt(arrIntCopired);

        /**
         * arraycopy 메서드 활용
         */
        System.arraycopy(arrStr, 0, arrStrCopierd, 0, arrStr.length);

        System.out.print("arraycopy method result: ");
        printStr(arrStrCopierd);

        /**
         * for each문 활용
         */
        int sum = 0;
        for (int a : arrInt) {
           sum += a;
        }
        System.out.printf("for-each문 sum 구하기: %d \n", sum);

    }

    public static void printInt(int[] arr) {
        for(int i=0; i<arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println();
    }

    public static void printStr(String [] arr) {
        for(int i=0; i<arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println();
    }

}

0개의 댓글