[혼공자] 5장 - 자바의 참조타입

eternal moment·2023년 4월 1일
0

자바

목록 보기
5/5

참조타입과 참조변수

  • 참조타입 : 번지를 통해 객체를 참조
    • 배열 타입
    • 열거타입
    • 클래스
    • 인터페이스

  • 기본타입과 차이점 : 저장되는 값이 무엇인지
    • 기본타입은 실제 값을 변수 안에 저장하지만
    • 참조타입은 메모리의 번지를 변수 안에 저장함

  • 참조타입의 ==, != 연산
    • 값과 상관없이 같은 객체를 참조하고 있는지 판별

  • NullPointerException
    • 참조타입의 경우 null로 선언했다가 값을 저장하려고 하면 에러 발생
    • 변수가 참조하는 객체가 없기 때문에.
          String str = null;
          String str = 'a';  //에러
          System.out.println(str.length()) //에러
      

  • String 타입
    • 선언 후 저장
      String 변수;
      변수 = 'abc';
      ===
      String 변수 = 'abc';
    • 클래스 타입의 일종
    • 참조타입
      • 문자열이 직접 변수에 저장되는 것 x
      • 문자열이 String 객체로 생성되고, 변수가 String 객체를 참조하는 것. ( == )
      • 문자열 리터럴이 동일하다면 String 객체를 공유함
      • 직접 String 객체를 생성 : 같은 리터럴이라도 다른 객체를 참조하는 것. ( != )
        String a = new String("abc");
        String b = new String("abc");
      • 판별
        • 동일한 객체를 참조하는지 : ==, != 연산자
        • 내부 문자열을 비교할 때 : equals() 메소드
          boolean result = 원본문자열.equals(비교문자열):
          boolean result = str1.equals(str2):
      • null
        • 초깃값이 null 인 경우 : 참조하는 객체가 없다는 뜻
        • 객체 참조 후 null 대입 : 참조를 잃은 객체는 메모리에서 자동 제거됨.


배열

같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조

배열의 특징

  • 같은 타입의 데이터만 저장 가능
  • 한번 생성된 배열의 길이는 고정
    **타입[] 변수 = new 타입[길이];**
    **String[] names = new String[30];**
    **String[] names = new String[30];**

선언

타입[] 변수;  // int[] intArr;
타입 변수[];  // int intArr[];

생성

  1. 값 목록 이용

    타입[] 변수 = {0,1,2 ... };
    String[] names = { 'a', 'b' };
    
    // 아래처럼 선언 후 중괄호를 이용한 배열 생성은 허용 x -> new 연산자 이용
    타입[] 변수;
    변수 = {0,1,2 ... };
    • new 연산자 사용
      변수 = new 타입[] {0,1,2 ... };
      names = new String[] { 'a', 'b', 'c' };
      
      String[] names = null;
      names = new String[] { 'a', 'b', 'c' };
    • 메소드의 매개값이 배열일 때도 new 연산자 사용해야함
      int sum = add( new int[] { 83, 90, 87 } );
  1. new 연산자 이용 값들을 저장할 배열을 미리 만들고 싶을 때
    타입[] 변수 = new 타입[길이];
    
    타입[] 변수 = null;
    변수 = new 타입[길이];
    
    ex.
    int[] scores = new int[30];       // int배열이므로 0~29까지 **0**으로 초기화
    String[] names = new String[30];  //String 배열이므로 0~29까지 **null**로 초기화

  • 배열

    • 배열 길이 : int a = arr.length;
    • 다차원 배열
      // 1. 값 목록 이용
      int[][] scores = { {95, 80}, {92, 96} };
      // 2. new 연산자로 크기 선언
      int[][] scores = new int[2][3];
    • 객체 참조
      • 배열은 참조타입 - String[] 의 항목도 String 변수와 같은 취급(문자열리터럴이 동일하면 동일객체)

        String[] str = new String[3]; //배열선언
        str[0] = "Java";
        str[1] = "Java"; 
        str[2] = new String("Java"); //객체 새로 생성
        
        str[0] == str[1] // True  : str[0] 과 str[1] 은 같은 객체, 같은 값
        str[0].equals(str[1]); // True  : str[0] 과 str[1] 은 같은 객체, 같은 값
        
        str[0] == str[2] // False : 값은 같지만 참조하는 객체는 다름
        str[0].equals(str[2]); // True  : 참조객체는 다르지만 값은 같음.
  • 배열 복사
    배열 생성 후 크기 변경할 수 없을 때 : 더 큰 배열 만들고 이전 배열 값 복사

    • 복사방법

      1. for 문

        1. 일반적 for문
        2. 향상된 for문
        for (타입변수 : 배열) {  // 1. 배열안에 첫번째 값이 존재하면 타입변수 안에 저장.
           실행문;              // 2. 실행, 다시 1번으로. 값이 있으면  ~ . 반복.                 }
      2. System.arraycopy()

         System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
         System.arraycopy(arr1, 0, arr2, 0, 0, arr1.length);
        • srcPos : 원본 배열에서 복사할 항목의 시작 인덱스
        • dest : 새 배열
        • destPos : 새 배열에서 붙여넣을 시작 인덱스
        • length : 원본배열의 값 중 복사할 개수

열거타입

열거상수 중 하나의 상수를 저장하는 타입


열거상수 : 한정된 값

선언

// 열거타입선언
public enum Week { Monday, Tuesday, Wednesday }

// 열거타입에 변수 선언
Week today;
Week day;

// 변수에 저장
today = Week.Monday;  

// 선언 + 저장
Week today = Week.Moday;

// 변수에 null 값 저장 가능
day = Week.null;

0개의 댓글