5. 참조 자료형

InSeok·2022년 5월 14일
0

자바

목록 보기
5/9

참조 : Do it Java 완전정복
http://www.yes24.com/Product/Goods/103389317

배열

배열이란?

  • 동일한 자료형을 묶어 저장하는 참조 자료형
  • 생성할 때 크기를 지정해야 하고, 한번 크기를 지정하면 절대 변경할 수 없다..

배열 생성하기

1. 배열 선언하기

  1. 자료형[] 변수명 ex) int[] a; → int 자료형만 저장 가능한 배열
  2. 자료형 변수명[] ex) int a[];
  • 배열을 선언하면 스택 메모리에 변수의 공간만 생성하고, 공간 안은 비운채로 둔다. 실제 데이터인 객체를 생성하지 않았기 때문
  • 참조 자료형 변수의 빈 공간을 초기화할때는 null값을 사용 → null 값은 힙 메모리의 위치(번지)를 가리키고 있지 않다는 의미 = 연결된 실제 대이터가 없다
  • 자바의 메모리구조
    • 클래스 영역 정적 영역 상수 영역 메서드 영역

스택 영역

힙 영역

  • 스택영역 : 기본자료형이든 참조 자료형이든 상관없이 모든 지역 변수가 위치하는 영역
  • 힙 영역 : 객체가 위치하는 공간,
    • 객체는 잠조 자료형 변수가 가리키는 실제 데이터

2. 힙 메모리에 배열의 객체 생성하기

  • 모든 참조 자료형의 실제 데이터(객체)는 힙 메모리에 생성된다.
  • 배열의 객체 생성
    • new 자료형[배열의 길이]
    • ex) new String[5];
  • new 키워드를 이용해 객체를 생성하면 JVM은 힙 메모리 내에 비어 있는 공간에 객체를 생성한다.
  • 배열의 길이를 반드시 지정해야 한다.

3. 배열 자료형 변수에 객체 대입하기

  1. 자료형[] 변수명 = new 자료형[배열의 길이]

    ex) int[] a = new int[3];

    → int 자료형 3개를 저장할 수 있는 공간을 힙 메모리에 넣어 두고 어디에 넣었는지를 참조

    변수 a에 저장하라!

  2. 자료형[] 변수명;

    변수명 = new 자료형[배열의 길이];

    ex) int[] a;

    a = new int[3];

  • 스택 메모리 공간은 값을 초기화하지 않으면 빈 공간으로 존재한다.
  • 힙 메모리는 어떤 상화에서도 빈 공간이 존재하지 않는다.
    • 값을 주지 않으면 컴파일러가 값을 강제로 초기화 한다.
    • 강제 초기화 값 : 기본자료형일때 숫자 - 0, 불리언 - false 로값이 초기화 이외의 모든 참조 자료형 - null

객체에 값 입력하기

  • 인덱스 : 배열은 값을 저장할 수 있는 공간마다 방 번호가 있는데, 이 번호를 인덱스라고 한다.
  • 인덱스는 0부터 시작하며, 1씩 증가한다.
  • 배열 객체에 값 대입하기
    • 참조 변수명[인덱스] = 값; ex) int[]a = new int[3] a[0] = 3; a[1] = 4; a[2] = 5;
  • 처음 배열을 선언함과 동시에 객체를 생성하면 힙 메모리의 모든 값은 초기화된다.
  • 배열 객체 값 읽어오기
    • 참조 변수명[인덱스];
    • EX) System.out.println(a[0]);

1차원 배열을 생성

  1. 배열 객체를 생성하고 값 대입하기
    1. 자료형[] 참조 변수명 = new 자료형[배열의 길이];

      참조 변수명[0] = 값;

  2. 배열 객체 생성과 함께 값 대입하기
    1. 초깃값을 직접넣어 주므로 컴파일러에 따른 강제 초기화 생략된다.
    2. 자료형[] 참조 변수명 = new 자료형[](값, 값, ...}
      1. 배열의 길이 지정 x
      2. 배열의 길이는 값의 개수로 결정
  3. 대입할 값만 입력하기
    1. 자료형[] 참조 변수명 = {값, 값, 값 ...};
    2. 선언과 값의 대입 분리불가 → 선언과 동시에 값을 대입할 때만 사용가능 → 메서드의 입력 매개 변숫값으로 사용 불가

참조 변수와 배열 객체의 초기화

  • 스택 메모리 변수를 초기화 하지 않으면 메모리 공간은 텅 비어있다.
  • 모든 변수는 초기화 이후에만 출력가능
  • 기본자료형 초깃 값 - ‘값’ ex) int a = 0;
  • 참조자료형 초깃 값 - ‘null’ ex) int[] b = null;
  • 힙 메모리는 모든 공간에 값이 들어가 있어야 하며, 초기화를 하지 않았을 때 자바 가상 머신이 강제 초기화
  • 기본 자료형 변수를 복사하면 실제 데이터 값 1개 더 복사됨. 이후 복사된 값 변경해도 원본값 영향 X
    • int a = 3; int b = a; b = 7; System.out.println(a); // 3 System.out.println(b); // 7
  • 참조 자료형 변수를 복사하면 실제 데이터가 복사되는 것이 아니라 실제 데이터의 위칫값이 복사된다.
    • 하나의 참조변수를 이용해 데이터 수정시, 다른 참조 변수가 가리키는 데이터도 변경됨
    • int[] a = {3, 4, 5}; int[] b = a; b[0] = 7; System.out.println(a[0]); // 7 System.out.println(b[0]); // 7

배열의 길이

  • 배열 참조 변수.length → 배열 참조변수가 가리키는 곳에 가면 배열 객체가 있는데, 그 배열의 방의 개수를 가져오라.
  • 반복문 활용
    • for
    • for -each문
      • 배열이나 컬렉션등의 집합 객체에서 원소들을 하나씩 꺼내는 과정을 반복하는 구문
      • 컬렉션은 배열과 달리 동일한 타입을 저장하지만 크기에 변화 줄수 있는 자료형
      • for(원소 자료형 변수명 : 집합 객체) { }
  • System.out.println(Arrays.toString(1차원 배열 참조 변수)) → 모든 배열의 원소가 출력된다.

2차원 정방 행렬 배열(직사각형)

  • 가로 및 세로 방향의 2차원으로 저장하는 배열
a[0][0]a[0][1]a[0][2]a[0][3]
a[1][0]a[1][1]a[1][2]a[1][3]
a[2][0]a[2][1]a[2][2]a[2][3]
  • 2차원 배열 선언 방법
    • 자료형[][] 변수명
    • 자료형 변수명[][]
    • 자료형[] 변수명[]
  • 메모리는 2차원 데이터를 바로 저장할 수 없다.
    • 2차원 데이터를 1차원 데이터들로 나눠 저장
    • 2차원 배열은 1차원 배열을 원소로 포함하고 있는 1차운 배열
  1. 배열 객체를 생성하고 값 대입하기

    • 자료형[][] 참조 변수명 = new 자료형 [행의 길이][열의 길이]; 참조 변수명[0][0] = 값; 참조 변수명[0][1] = 값; 참조 변수명[행의 길이 -1][열의길이 -1] = 값;
    • 몇 차원의 배열이든 최종적으로는 1차원 배열로 분할가능
  2. 배열 객체의 행 성분부터 생성하고 열성분 생성하기

    • 자료형[][] 참조 변수명 = new 자료형[행의 길이][]; 참조 변수명[0] = 1차원 배열의 생성; 참조 변수명[1] = 1차원 배열의 생성; 참조 변수명[행의 길이 -1] = 1차원 배열의 생성;

    ex) int [][] a = new int[2][]; // 행성분 생성

    a[0] = new int[3];

    a[0][0] = 1; a[0][1] = 2; a[0][2] = 3; //열성분 생성

    a[1] = new int[3];

    a[1][0] = 4; a[1][1] = 5; a[1][2] = 6; // 열성분 생성

    int[][] a = new int[2][]; // 행성분 생성

    a[0] = new int[]{1, 2, 3};

    a[1] = new int[]{4, 5, 6}; // 열 성분 생성

  3. 배열의 자료형과 함께 대입할 값 입력하기

자료형[][] 참조 변수명 = new 자료형[][] {{값, 값, ..., 값}, ..., {값, 값, ...값}} ;

ex) int[][] a = new int[][] {{1, 2, 3}, {4, 5, 6}};

  • 대괄호 안에는 반드시 크기 지정 X
  • 배열의 선언과 객체 대입 분리해 표현 간으 ex) int[][] b; b = new int[][] {{1, 2, 3}, {4, 5, 6}};
  1. 대입할 값만 입력하기

    자료형[][] 참조 변수명 = {{값, 값, ..., 값}, ..., {값, 값, ..., 값}};

    ex) int[][] a = {{1, 2, 3}, {4, 5, 6}};

    • 배열 선언과 객체 대입 분리 불가

2차원 비정방 행렬 배열

  • 각 행마다 열의 길이가 다른 2차원 배열
  • 행마다 크기가 다른 1차우너 배열이 할당된다는 점 제외하면 정방형과 동일

2차원 배열의 출력

  • 기본적으로 이중 for 문을 사용해야한다.
  • 바깥쪽 for문에는 행의 개수를 나타내는 a.length
  • 안쪽 for문에는 각 행별 열의 개수를 나타내는 a[i].length를 사용해야한다. ex) int[][] a = {{1, 2}, {3, 4, 5}}; for(int i = 0; i < a.length; i++) { for(int j = 0; j < a[i].length; j++) { System.out.println(a[i][j]); } }
  • for-each 문
    • for(int[] m: a) {

           for(int n: m {
      
      Systme.out.println(n);
      
      }

      }

main() 메서드의 입력 매개변수

  • public static void main(String[] ar) { } → 여러 개의 String 객체를 묶어 저장하는 문자열 배열

    • String[] 타입의 참조 변수 ar
  • main() 메서드를 실행하는데 필요한 자료를 배열 타입으로 넘겨줄 수 있다.

    • 입력매개변수의 각 원소는 공백 문자(스페이스바)로 구분되며, 모든 원소는 입력매개변수가 String[]이므로 문자열로 인식됨.
  • 타입 변환 메서드

    • 문자열 → 정수 : Integer.parseInt(문자열)
    • 문자열 → 실수 : Double.parseDouble(문자열)
    • 정수 → 문자열 : String.valueOf(정수)
    • 실수 → 문자열 : String.valueOf(실수)

문자열 저장하는 String 클래스

  1. String 참조 변수명 = new String(”문자열”)

    ex) String str = new String(”안녕”);

  2. String 참조 변수명 = “문자열”

    ex) String str = “안녕”;

  • 특징
    • 한번 정의된 문자열은 변경할 수 없다.
      • 문자열 내용 변경시, JVM은 새로운 문자열을 포함하고 있는 객체를 생성해 사용하고 기존의 객체는 버린다. = 객체안의 값을 변경하면 새로운 객체를 생성
      • String str1 = new String(”안녕”); String str2 = str1; str1 = “안녕하세요”; System.out.println(str1); // 안녕하세요 System.out.println(str2); // 안녕
      • 배열은 객체의 값 자체가 수정되므로 참조 변수 복사이후 하나의 변수에서 수정하면 나머지 변수에도 적용되는 것과 대비
    • 문자열 리터럴을 바로 입력해 객체를 생성할 때 같은 문자열끼리 객체를 공유.(메모리 효율성 증가위해)
      • new로 생성할 때는 동일한 문자열 객체가 힙 메모리에 있든, 없든 무조건 새롭게 객체를 생성
      • 문자열 리터럴로 생성할 때는 힙메모리에 리터럴로 생성된 동일 문장열을 포함하고 있는 개게체가 있으면 그 객체를 공유.

String 객체의 ‘+’연산

    • 연산을 통해 문자열을 연결할 수 있다.
      • String str1 = “안녕” + “하세요” + “!”; System.out.println(str1) // 안녕하세요!
        • 처음 “안녕” + “하세요” 가 수행될때 객체가 하나 새로생성
        • “안녕하세요” + “!”가 수행될 때 또 객체가 만들어짐
        • 최종적으로 참조변수에는 마지막 객체의 위칫값이 저장
  • 문자열 + 기본자료형 or 기본자료형 + 문자열 연산
    • 모든 연산은 동일한 자료형 끼리만 가능
    • 먼저 기본 자료형을 문자열로 바꾸고, 문자열 + 문자열 연산 수행 System.out.println(1 + “안녕”); //1안녕 System.out.println(1 + “안녕” + 2); //1안녕2 System.out.println(”안녕” + 1 + 2); // 안녕12 System.out.println(1 + 2 + “안녕”); // 3안녕 → + 연산은 아펭서 부터 연산을 수행하는데 정수 + 정수 먼저 수행후 3 + “안녕”에서 문자열로 변환됨
  • String 클래스의 주요 메서드
    • length(): 문자열의 길이를 리턴한다.
    • charAt(): 문자열에서 특정 인덱스에 위치해 있는 문자를 알아내다.
    • indexOf(): 문자열에서 특정문자나 특정 문자열을 앞에서부터 찾아 위칫값을 알아낸다.
    • lastIndexOf(): 문자열에서 특정 문자나 특정 문자열을 뒤에서 부터 찾아 위칫값을 알아냄
    • String.valueOf(): 기본 자료형을 문자열로 바꾸는 정적메서드
    • concat(): 2개의 문자열을 연결. + 연산자와 동일한 기능
    • getBytes(): 문자열을 byte 배열로 변환.
    • toCharArray(): 문자열을 char 배열로 변환.
    • toLowerCase(): 영문 문자를 모두 소문자로 변환
    • toUpperCase(): 영문 문자를 모두 소문자로 변환
    • replace(): 일부 문자열을 다른 문자열로 대체
    • substring(): 문자열의 일부만을 포함하는 새로운 문자열 객체를 생성
    • split(): 특정 기호를 기준으로 문자열을 분리한다.
    • trim(): 문자열의 좌우 공백 제거
    • equals(): 두 문자열의 위칫값이 아닌 실제 데이터값 비교. 대소문자구분 (==)는 메모리 번지(stack) 비교
    • equalsIgnoreCase(): 두 문자열의 위칫값이 아닌 시제 데이터값 비교. 대소문자구분 X
profile
백엔드 개발자

0개의 댓글