[Java] 배열
배열을 배워봅시당
배열이 뭘까요 ? 특별한 객체 입니다.
그럼 객체는 뭘까요 ? 데이터를 나타내는 속성과 기능을 나타내는 메서드의 집합입니다.
배열은 메서드가 length() 하나 밖에 없습니다.
배열은 같은 종류의 여러 데이터들을 효율적으로 저장하고 관리하고 사용할 수 있게 하는 자료구조입니다.
자료구조 ? 다양한 여러 데이터들을 효율적으로 저장하고 관리하기 위한 기법입니다.
자료구조에 따라서 저장하는 방법이 다 다릅니다. ⇒ 저장하는 목적이 다양하기 때문입니다.
대표적인 자료구조로 ⇒ 큐와 스택이 있습니다.
배열은 자료구조 중에서 가장 단순한 자료구조입니다.
순차적으로 값을 저장하고 각각의 값들은 고유한 인덱스를 가집니다.
변수의 종류로는 기본형과 참조형이 있는데,
기본형은 실제 값을 저장하고 참조형은 객체의 주소를 저장합니다.
배열은 객체입니다.
즉, reference 변수를 이용해서 배열을 사용할 수 있습니다.
배열의 각 요소는 서로 연속적입니다.
여기서 말하는 요소는 배열 각각의 저장된 값을 말합니다.
이 각각의 요소는 변수라고 볼 수 있습니다.
연속적이라는 말은 순차적이란 의미입니다.
배열 변수 ? 메모리 어딘가 저장된 배열 값의 주소를 저장하고 있습니다.
new ? 자바에서 객체를 생성할 때 사용하는 키워드 입니다.
new int[5] ⇒ 5개의 int 값을 저장할 수 있는 배열을 생성합니다.
배열 변수는 배열 객체의 시작주소를 저장하고 있습니다.
주소를 (저장하고 있다.) = (가리킨다.) = (참조하고 있다.) ⇒ 모두 같은 의미입니다.
배열을 생성할 때는 배열의 크기를 정해줘야 합니다. ⇒ new int[5]
int[] score ⇒ 배열 변수를 만들 때는 크기를 지정하지 않는데, 주소를 저장하기 때문에 크기를 정할 수 없습니다.
생성할 때 배열의 크기를 정해주는 것입니다.
자바는 어떤 경우라도 개발자가 메모리에 접근해서 만질 수 없습니다.
C 언어는 가능합니다.
배열 선언 방법은
1. 타입[] 변수이름
2. 타입 변수이름[]
2가지 방법이 있습니다.
선언하는 배열 변수가 하나 일 땐 두 가지 선언 방법이 똑같으나,
선언하는 배열 변수가 여러 개가 되면 의미가 달라지니 주의해야 합니다.
new의 역할은 ?
1. 객체를 생성하고
2. 생성된 객체의 시작주소 반환합니다.
배열의 초기화
메서드 안에서 선언된 로컬변수(메서드 변수)는 선언하고 반드시 초기화 해줘야합니다.
객체는 메서드에 속하는게 아닙니다. ⇒ 따라서 자동으로 초기화 됩니다.
배열은 객체이므로 자동으로 초기화 됩니다.
숫자형 배열을 만들었다면 기본이 0 입니다. 각각이 0을 가지고 있습니다.
메서드 밖에서 선언하는 변수는 자동으로 초기화 됩니다.
배열 자동 초기화는 null 입니다.
배열의 초기화는 ? 생성된 배열에 처음으로 값을 저장하는 것 입니다.
메서드는 값을 입력 받을 수 있는데, 메서드가 배열을 입력받을 수도 있습니다.
배열이름.length
는 배열의 크기를 알려줍니다.
.length()는 배열 객체의 유일한 메서드입니다.
.length()로 배열의 끝을 알 수 있습니다.
배열의 크기를 항상 알고있는 것은 아닙니다. 배열의 크기를 모르는 경우도 얼마든지 많습니다.
여태껏 일차원 배열에 대해서 말했는데, 다음으로 다차원 배열이라는 것이 있습니다.
다차원 배열을 이해하는 방법으로
행과 열로 설명하는 것은 초보자를 위한 것이지
컴퓨터 데이터가 2차원 평면은 없습니다.
이렇게 이해하기 시작하면 안됩니다.
int [] [] score = new int [5] [3];
[3] 일차원 배열의 크기
[5] 이차원 배열의 크키
뒤에서 부터 읽으면 됩니다. '일차원 배열의 크기(3)를 5개 만들어라.'
다차원 배열에서 마지막 차원의 배열만 실제값을 가집니다.
앞에 있는 배열은 다음 차원의 배열을 가리키고 있습니다. 값이 아닌 주소를 가집니다.
가변배열 ? 마지막 차원의 배열은 크기가 가변적일 수 있습니다.
ex. 반 마다 학생 수가 다를 수 있음
int [][] score = new int[5][] ⇒ 이렇게 마지막 대괄호 비어있을 수 있습니다.
마지막 차원에만 서로 다른 크기의 배열을 가질 수 있습니다.
가변배열은 많이 안씁니다. 제일 큰 크기 기준으로 만들어서 필요한 만큼만 채워쓰면 되기 때문입니다.
main 메소드가 중요한 이유 ? 자바 프로그램의 시작점이기 때문입니다.
main 메소드를 가진 클래스가 Java 프로그램의 시작점입니다.
String[] args의 의미 ? 프로그램이 시작되어질 때 사용자로부터, 프로그램이 시작될 때 필요로하는 값들을 입력 받을 수 있게 해줍니다. 모두 문자열로 받겠다는 의미고 문자열은 여러개 일 수 있습니다.
args ? 매개변수
복습
배열 ? 같은 종류의 여러 데이터를 효율적으로 관리하기 위한 자료구조
같은 종류의 데이터만 저장할 수 있다
배열의 크기가 정해지고 나면 바꿀 수 없음 ⇒ 고정적
다른 배열이 필요하다면 새롭게 만들어야함
객체를 생성하는 과정이 필요함
객체 사용 과정 : 생성 → 초기화 → 사용
배열 요소 ? 각각의 값들을 실제로 저장하는 저장공간 = 변수
배열의 각 요소는 연속적이다
연속적이다 의미 ? 1. 저장한 순서대로 유지된다. 2. 하나의 연속된 메모리 공간을 이용한다.
각각의 데이터로 저장해놓고 찾아다니는 것 보다 배열로 저장하면 값을 빠르게 찾을 수 있다
new의 역할 2가지 ? 1. 객체 생성 2. 생성된 객체의 시작주소 반환
객체의 시작주소를 변수에 저장함 ⇒ refernce
(변수할 때 기본변수와 참조형변수 했었음, 참조형 변수 = reference 변수)
객체를 위한 메모리 공간 ⇒ heap
배열변수와 일반변수를 함께 선언하는 것은 권장하지 않음
따라서 배열 변수는 타입 뒤에 선언하는 것이 일반적임
⇒ 타입 [] 변수이름
⇒ 4바이트씩 정수값을 읽는 방법으로 데이터를 읽으면 됨
인덱스 벗어난 배열에 접근하면 exception(예외) 일어남
exception이라는 것은 핸들링 가능한, 처리가능한 오류임
배열의 크기를 반환하는 length가 있음
배열은 객체이기 때문에 생성과 동시에 자동으로 초기화 된다
객체는 생성과 동시에 초기화됨 ⇒ 배열도 객체 ⇒ 배열도 생성과 동시에 초기화
reference를 저장하는 배열을 만들 수 있음
reference 배열을 만들었다 ⇒ null 값으로 초기화됨
null : 현재 아무런 값도 가지고 있지않다라는 명시적 표현
배열 : 선언 → 생성 → 초기화(의미있는 값으로 저장) → 사용
처음 배열은 의미없는 값으로 초기화하니까
int[] score = new int[] {100, 90, 80, 70, 60};
⇒ new int[] 안에 크기를 지정할 수 없음. 중괄호 안의 값들이 결정하는 것임
int[] score;
score = new int[] {100, 90, 80, 70, 60};
⇒ 선언과 생성 따로하려면, new int[] 써줘야함
다차원배열 ? 언제나 마지막 차원의 배열만 실제 값을 저장한다
그럼 앞단의 차원의 배열들은 ? 다음 차원의 배열들의 주소를 저장한다
3차원 넘어가는 배열은 잘 사용하지 않음
배열의 복사
1. for문을 이용한 배열복사
2. System.arraycopy()