배열
배열은 여러 데이터를 순차적으로 관리하는 일종의 자료구조로, 프로그램 개발에 꼭 필요한
기본 구성 요소이다.
배열을 사용하면 인덱스 위치를 써서 배열에 있는 임의 원소를 사용할 수 있기 때문에 올바른 임의 접근이 가능하다.
배열의 모든 원소는 그냥 변수이다.
즉, 여덟개의 원시 변수 유형이나 레퍼런스 변수이다. 그런 유형의 변수에 집어넣을 수 있는 것은 모두 그 유형의
배열 원소로 대입할 수 있다.
따라서 int형 배열(int[])의 각 원소에는 int가 들어간다.
그렇다고 Dog 배열(Dog[])의 각 원소에도 Dog가 들어가는것은 아니다.
레퍼런스 변수에는 객체 자체가 아닌 레퍼런스가 들어간다.
배열은 원시변수의 배열이든 객체 레퍼런스에 대한 배열이든 상관없이 항상 객체이다.
물론, 원시값을 저장하도록 선언된 배열 객체를 만들 수 있다. 즉, 배열 객체의 원소가 원시 값이더라도
배열 자체는 절대 원시 값이 아니다.
배열에 어떤 것이 들어가든 배열자체는 언제나 객체라는점을 꼭 기억해야 한다.
배열의 개념
보통 배열은 인덱스(순차번호)와 데이터로 구성된 일종의 자료구조를 말한다.
사용분야
집합형의 데이터를 관리할 필요가 있을 때 사용.
int[] num = new int[4];
int num[] = new int[4]; //위 코드와 이 코드는 크기가 4인 배열을 선언하는 것이다.
int[] num = {10, 20, 40, 99} //배열 선언과 함께 초기값을 할당.
int[][] num = {{10, 20}, {30, 40}, {50, 60}}; //2차원 배열 선언과 함께 초기값 할당
int[][] table = new int[5][10]; //5행 10열의 배열.
배열의 특징
1. 같은 자료형으로만 구성한다.
2. 배열 안 데이터는 0부터 시작하는 인덱스를 참조한다.
3. 배열을 선언할 때 크기를 지정해야 하며, 나중에 그 크기를 변경할 수 없다.
4. 특정한 값으로 초기화하지 않은 배열 안 데이터를 참조하며 Null Pointer Exception이 발생한다.
5. 배열의 인덱스는 1이 아닌 0부터 시작한다.
다차원배열
일차원적인 배열 만으로는 한계가 있다.
예로 학교를 생각해보면 각 반마다 학생이 여러명이 있고, 반 자체도 여러 반이 있는데
이걸 일차원적인 배열로 표현을 하려면 각 반마다 일일히 배열을 선언해줘야 하는 상황이 발생한다.
그래서 이것을 다차원배열로 설정해준다.
위 예제 코드 중 제일 마지막 줄을 보면 [5][10]으로 되어있는데 5행 10열의 값이 나온다는 의미이다.

이 2차 배열의 초기화는 다음과 같이 할 수 있다.
int[][] table = { {1,2,3,4,5,6,7,8,9,10},
{2,3,4,5,6,7,8,9,10,1},
{3,4,5,6,7,8,9,10,1,2},
{4,5,6,7,8,9,10,1,2,3},
{5,6,7,8,9,10,1,2,3,4} };
이 배열에서 table.length를 호출하면 5가 나올 것이고 table[0].length를 호출하면 10이 반환된다.
하나의 배열은 2,3 혹은 그 이상의 차원을 가질 수 있는데 2차원 이상을 갖는 배열을 다차원 배열이라고 한다.
3차원 배열은 육면체로 그릴 수 있는데 그 이상의 배열은 그림으로 나타내기 어렵다.
2차원 배열은 매우 일반적이지만 프로그램에서 다차원배열은 조심해서 사용해야 한다.
여러 레벨에서 방대한 정보를 다루게되면 관리가 어려워지기 때문이다.
배열의 선언
java에서 배열은 객체이다. 배열을 생성하기 위해서는 배열을 반드시 선언해야 한다.
배열의 크기는 length를 사용하여 확인할 수 있다.
배열의 특징
자바는 객체지향 언어이고 객체 타입의 참조변수를 지원하기 때문에 배열에서도 원시 자료형 외의 객체타입을
사용할 수 있다.
예제
class Dog {
String name;
public static void main(String[] args) {
//Dog 객체를 만들고 접근한다.
Dog dog1 = new Dog();
dog1.bark();
dog1.name = "Bart";
//이번에는 Dog 배열을 만든다.
Dog[] myDogs = new Dog[3];
//그리고 개를 몇마리 넣는다.
myDogs[0] = new Dog();
myDogs[1] = new Dog();
myDogs[2] = dog1;
//배열 레퍼러느를 써서 Dog 객체에 접근한다.
myDogs[0].name = "Fred";
myDogs[1].name = "Marge";
//myDogs[2]의 이름은???
System.out.print("마지막 개의 이름 : ");
System.out.println(myDogs[2].name);
//이제 순환문을 써서 배열에 들어있는 모든 개가 짖도록 한다.
int x = 0;
while(x < myDogs.length) {
myDogs[x].bark();
x = x + 1;
}
}
public void bark() {
System.out.println(name + "이(가) 왈! 하고 짖습니다.");
}
public void eat() {}
public void chaseCat() {}
}
출력결과
null이(가) 왈! 하고 짖습니다.
마지막 개의 이름 : Bart
Fred이(가) 왈! 하고 짖습니다.
Marge이(가) 왈! 하고 짖습니다.
Bart이(가) 왈! 하고 짖습니다.
정리
●변수에는 원시변수와 레퍼런스. 이렇게 두 종류가 있다.
●변수를 선언할 때는 반드시 이름과 유형이 있어야 한다.
●원시 변수의 값은 그 값을 표시하는 비트로 구성된다.(5, 'a', true, 3.1416 등)
●레퍼런스 변수의 값은 힙에 들어있는 객체를 건드릴 수 있는 방법을 나타내는 비트이다.
●레퍼런스 변수는 리모컨과 같다. 레퍼런스 변수에 대해 점 연산자(.)를 사용하는 것은 리모컨의 버튼을 눌러서
메소드나 인스턴스 변수에 접근하는 것과 비슷하다.
●레퍼런스 변수가 아무 객체도 참조하지 않으면 그 값은 null이 된다.
●배열은 항상 객체이다. 배열에 원시변수를 저장하도록 선언해도 마찬가지이다.
원시배열같은것은 없다. 원시변수가 들어있는 배열이 있을 뿐이다.
'JAVA' 카테고리의 다른 글
REST API의 개념 (0) | 2020.05.19 |
---|---|
REST (0) | 2020.05.19 |
this, this(), super, super() (1) | 2020.05.08 |
접근제어자 (0) | 2020.05.08 |
제어문, 반복문 예제 (1) | 2020.04.30 |