자바의 객체와 배열(Array), 참조변수와 참조자료형, 객체배열

Yeppi's 개발 일기·2022년 5월 18일
0

JAVA

목록 보기
9/27

1. 객체와 배열이란?

1) 객체와 객체지향

  • 객체 Object
    의사나 행위가 미치는 대상. 데이터 단위

  • 절차 지향 프로그래밍 ⇒ 시간순, C언어
    객체 지향 프로그래밍 ⇒ 객체 선언, 객체간 인터렉션/협력/관계, JAVA C++ C# Python

  • 객체 지향 구현?
    객체 정의 → 각 객체의 기능 구현 → 기능들간의 소통을 통한 객체간 협력 구현


2) 배열이란?

  • 동일한 자료형의 순차적 자료 구조

  • 인덱스 연산자[] 를 이용하여 빠른 참조가 가능

  • 물리적 위치와 논리적 위치가 동일 ⇒ 순차적/연속적인 자료구조

  • 배열의 순서는 0부터 시작

  • 자바에서는 객체 배열을 구현한 ArrayList를 많이 활용함

  • 배열은 array, 배열의 각 요소들은 element 엘리먼트라고 많이 부름

  • 기본자료형 → 크기가 정해져있음 VS 객체 배열


3) 배열의 필요성

동일한 타입의 데이터를 한 곳에 모아 순차적으로 처리


4) 배열 객체

new 데이터타입[배열크기];

  • new
    → JVM 은 객체 생성에 필요한 메모리 공간을 확보

  • new int[2];
    → int(4byte) 타입의 데이터 2개를 저장
    정수 2개를 저장할 수 있는 메모리 공간(8byte) 확보

  • 배열 객체가 생성되는 순간
    → 0부터 시작하는 인덱스 번호가 배열의 저장공간에 자동으로 부여
    → 각 인덱스에 기본값 할당 = 배열의 기본 초기화


🍑 배열 초기화 🍑

  • int → 0
  • double → 0.0
  • String → null


2. 참조 변수와 참조 자료형

데이터타입[] 참조변수 = new 데이터타입[배열크기];

1) 참조 변수

  • 사실 프로그램에서 객체 사용 시, 객체들의 메모리 주소를 직접 이용하는 것은 불가능

  • 객체의 메모리 주소 → 참조변수에 할당
    ⇒ ❗ 참조변수로 메모리 상의 객체를 사용 ❗

  • 참조변수에 실제로 배열 객체의 주소를 할당
    참조변수 = new 데이터타입[배열크기];

🍑 참조 변수와 null 🍑

  • 참조변수가 주소를 가지지 않는 상태
  • 가비지 컬렉션 : 참조되지 않는 객체 → JVM이 자동으로 메모리에서 제거


2) 참조 자료형

  • 변수의 자료형, 데이터 타입
  • 기본 자료형 int, long, float, double . . .
    → 사용하는 메모리의 크기가 정해져 있음
  • 참조 자료형 String, Date, Student . . .
    → 클래스에 따라 메모리의 크기가 다름
  • 참조 자료형을 사용 할때는 해당 변수에 대해 생성하여야 함
    (String 클래스는 예외적으로 생성하지 않고 사용할 수 있음)

📌 기본 자료형 VS 참조 자료형 실습 📌

		int score = 10; // 기본 자료형
		int[] scoreList = new int[5]; // 참조 자료형 
		
		System.out.println("기본형 score : " + score); // 10 출력
		System.out.println("참조형 scoreList : " + scoreList); // 주소값 [I@515f550a 출력


3. 배열 실습

1) 선언 & 초기화

배열 선언

  • 동일한 결과를 가지는 두 가지 방식
int[] arr1 = new int[10];
int arr2[] = new int[10];

배열 초기화 하기

  • 배열은 선언과 동시에 자료형에 따라 초기화 됨
    • 필요에 따라 초기값 지정
    • 정수는 0, 실수는 0.0, 객체는 null
  • 배열 객체를 생성하면서 동시에 초기화까지 처리
int[] numbers = new int[] {10, 20, 30}; // 개수 생략해야 함`

// 선언과 동시에 초기화할 때만 가능
int[] numbers2 = {10, 20, 30}; // new int[]  생략 가능 

int[] numbers3; 
numbers3 = new int[] {10, 20, 30}; // 선언후 배열을 생성하는 경우는 new int[]


2) length

배열의 길이와 요소의 개수는 동일하지 않다

  • 배열을 선언하면?
    요소 개수만큼 메모리가 할당되지만, 실제 요소(데이타)가 없는 경우도 있음

  • length 변수
    배열 객체의 길이를 확인할 때 사용

  • 배열의 length 속성
    배열의 개수를 반환해주기 때문에 요소의 개수와는 다름

  • length를 활용하여 오류가 나는 경우?
    요소의 개수에 대한 변수(count)를 따로 유지



3) 향상된 for문

Enhancedfor = 인핸스드 for문

  • 실무에서 많이 사용

  • 배열의 n개 요소를 0 ~ n-1 까지 순차적으로 순회할 때 간단하게 사용

    for( 변수 : 배열) {
    
    }

📌 기본 for문 VS 향상된 for문 실습 📌

		int[] scoreList = {12, 45, 97, 99, 100};

		System.out.println("배열의 길이 : " + scoreList.length); // 5
		
        // 기본
		for (int i = 0; i < 5; i++) {
			System.out.println("scoreList[" + i + "] : " + scoreList[i]);
		}
		
        // 향상된
		for (int score : scoreList) {
			System.out.println("score : " + score);
		}

출력결과

배열의 길이 : 5
scoreList[0] : 12
scoreList[1] : 45
scoreList[2] : 97
scoreList[3] : 99
scoreList[4] : 100
score : 12
score : 45
score : 97
score : 99
score : 100


4) 타입 변환

  • 타입변환이 가능한 경우에 한해서 다른 타입의 데이터도 저장 가능

int-double 타입 변환 실습

  • int 형의 데이터를 double 형의 배열에 저장
		double[] scoreList = {11, 66.4, 99, 77.3, 88.7};
		
		System.out.println("scoreList 배열의 크기 : " + scoreList.length);

		for (int i = 0; i < scoreList.length; i++) {
			System.out.println("scoreList[" + i + "] : " + scoreList[i]);
		}

출력결과

scoreList 배열의 크기 : 5
scoreList[0] : 11.0
scoreList[1] : 66.4
scoreList[2] : 99.0
scoreList[3] : 77.3
scoreList[4] : 88.7


4. 객체 배열이란?

1) 객체 배열이란?

객체 타입의 배열

  • 기본 자료형 배열인 경우
    → 선언과 동시에 배열의 크기만큼의 메모리가 할당

  • 객체 배열인 경우
    객체의 주소가 들어갈 메모리(4byte, 8byte)만 null로 할당
    각 요소 객체는 생성하여 저장



2) 객체 배열 선언하기

  • Book[] library = new Book[5];
  • 각 요소의 객체를 생성해야 데이터값도 들어감
		Book[] library = new Book[5];

		library[0] = new Book("책1", "일작가");
		library[1] = new Book("책2", "이작가");
		library[2] = new Book("책3", "삼작가");
		library[3] = new Book("책4", "사작가");
		library[4] = new Book("책5", "오작가");


3) 객체 배열 복사하기

  • System.arrayCopy(src, srcPos, dest, destPos, length)
  • 자바에서 제공되는 배열 복사 메서드

    • static 메서드 ⇒ System.
    • 복사한 배열의 주소, src array ⇒ srcPos
    • 복사될 배열의 주소 ⇒ destPos
    • 몇개 카피, 얼마나 복사할 지 ⇒ length
  • 복사되는 곳(dest)의 크기 > 복사한(scr) 크기보다 작으면?
    ⇒ 오류, 그 외에는 정상

얕은 복사

  • 객체 주소만 복사되어 한쪽 배열의 요소를 수정 → 같이 수정

  • 값 변경 → 복사된 객체 배열까지 동일하게 변경

⇒ 즉, 두 배열이 같은 객체를 가리킴


깊은 복사

  • 각각의 객체를 생성하여, 그 객체의 값을 복사

⇒ 즉, 배열이 서로 다른 객체를 가리키도록 함

    	Book[] library = new Book[5];
    	Book[] copyLibaray = new Book[5];
    
  		library[0] = new Book("책1", "일작가");
		library[1] = new Book("책2", "이작가");
		library[2] = new Book("책3", "삼작가");
		library[3] = new Book("책4", "사작가");
		library[4] = new Book("책5", "오작가");

    	copyLibaray[0] = new Book(); // 객체를 각각 다 만들어줌
    	copyLibaray[1] = new Book();
    	copyLibaray[2] = new Book();
    	copyLibaray[3] = new Book();
    	copyLibaray[4] = new Book();
profile
imaginative and free developer. 백엔드 / UX / DATA / 기획에 관심있지만 고양이는 없는 예비 개발자👋

0개의 댓글