객체 Object
의사나 행위가 미치는 대상. 데이터 단위
절차 지향 프로그래밍 ⇒ 시간순, C언어
객체 지향 프로그래밍 ⇒ 객체 선언, 객체간 인터렉션/협력/관계, JAVA C++ C# Python
객체 지향 구현?
객체 정의 → 각 객체의 기능 구현 → 기능들간의 소통을 통한 객체간 협력 구현
동일한 자료형의 순차적 자료 구조
인덱스 연산자[]
를 이용하여 빠른 참조가 가능
물리적 위치와 논리적 위치가 동일 ⇒ 순차적/연속적인 자료구조
배열의 순서는 0부터 시작
자바에서는 객체 배열을 구현한 ArrayList
를 많이 활용함
배열은 array, 배열의 각 요소들은 element 엘리먼트라고 많이 부름
기본자료형 → 크기가 정해져있음 VS 객체 배열
동일한 타입의 데이터를 한 곳에 모아 순차적으로 처리
new 데이터타입[배열크기];
new
→ JVM 은 객체 생성에 필요한 메모리 공간을 확보
new int[2];
→ int(4byte) 타입의 데이터 2개를 저장
정수 2개를 저장할 수 있는 메모리 공간(8byte) 확보
배열 객체가 생성되는 순간
→ 0부터 시작하는 인덱스 번호가 배열의 저장공간에 자동으로 부여
→ 각 인덱스에 기본값 할당 = 배열의 기본 초기화
데이터타입[] 참조변수 = new 데이터타입[배열크기];
사실 프로그램에서 객체 사용 시, 객체들의 메모리 주소를 직접 이용하는 것은 불가능
객체의 메모리 주소 → 참조변수에 할당
⇒ ❗ 참조변수로 메모리 상의 객체를 사용 ❗
참조변수 = new 데이터타입[배열크기];
int, long, float, double . . .
String, Date, Student . . .
int score = 10; // 기본 자료형
int[] scoreList = new int[5]; // 참조 자료형
System.out.println("기본형 score : " + score); // 10 출력
System.out.println("참조형 scoreList : " + scoreList); // 주소값 [I@515f550a 출력
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[]
배열의 길이와 요소의 개수는 동일하지 않다
배열을 선언하면?
요소 개수만큼 메모리가 할당되지만, 실제 요소(데이타)가 없는 경우도 있음
length 변수
배열 객체의 길이를 확인할 때 사용
배열의 length 속성
배열의 개수를 반환해주기 때문에 요소의 개수와는 다름
length를 활용하여 오류가 나는 경우?
요소의 개수에 대한 변수(count
)를 따로 유지
Enhancedfor = 인핸스드 for문
실무에서 많이 사용
배열의 n개 요소를 0
~ n-1
까지 순차적으로 순회할 때 간단하게 사용
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
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
객체 타입의 배열
기본 자료형 배열인 경우
→ 선언과 동시에 배열의 크기만큼의 메모리가 할당
객체 배열인 경우
→ 객체의 주소가 들어갈 메모리(4byte, 8byte)만 null로 할당
→ 각 요소 객체는 생성하여 저장
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", "오작가");
System.arrayCopy(src, srcPos, dest, destPos, length)
자바에서 제공되는 배열 복사 메서드
System.
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();