배 열
같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 의미한다. 즉, 같은 데이터 타입의 변수가 여러 개 필요할 때 사용한다. 같은 타입의 변수가 100개 1000개 등 많은 수가 필요할 수 있으니 그럴 때 이용하면 된다.
배열에 배열명은 그 배열에 시작 주소를 가리킨다.
타입[] 변수이름; <- 이걸 더 많이 씀!! | int[] score; String[] name; |
타입 변수이름[]; | int score[]; String name[]; |
배열을 이해하는 게 중요한 이유는 클래스와도 연관이 깊다.
먼저 배열이 아닌 일반 변수로 할당되는 예를 들어보자.
int a = 3;
int b = 5;
int c = 7;
메모리 상에서 내부에 어떻게 변수가 만들어질까?
프로그램 실행할 때 마다 JVM이 OS한테 요청을 한다.
아파트로 예를 들 수 있다.
a는 10층에 있어라~ 입주청소까지 하고나서 3을 넣어 놨다.
b는 2층에 있어라~ 입주청소 및 5를 넣었다.
c는 8층에 할당을 받고 7로 선언을 해줬다.
여기서 주소는 랜덤으로 정해지게 된다.
이렇게 일반 변수에 값을 할당해주면 메모리 안으로 값이 바로 들어간다.
하지만 String은 클래스이기 때문에 별개이다.
이것은 배열과 비슷한 방식이다.
배 열 Array
기본 문법 : int[] score = new int[5];
여기서 score는 배열명(=변수명)이다.
변수명에는 배열의 시작 주소값을 갖고 있다.
이 주소값은 4byte다.
주소값을 가르키기 때문에 어떤 변수가 와도 사이즈는 동일하다.
나누어서도 많이 사용한다.
int[] score;
score는 int타입의 배열이다.
score = new int[5];
스코어는 방을 5개 가지고 있다.
new로 int 타입의 방을 5개 만들고,
마지막에 = 연산자로 스코어에 배열의 첫번째 주소를 대입해준다.
한 번에 데이터 타입이 같은 데이터들을 처리할 수 있다.
그런 배열의 단점은? 한 번 선언하면 변경할 수 없다는 것이다.
하지만 배열 복사를 배워서 변경할 수 있도록 알아볼 예정이다.
public static void main(String[] args) {
int[] score = new int[5];
int k = 1;
score[0] = 50;
score[1] = 60;
score[k+1] = 70;
score[3] = 80;
score[4] = 90;
int tmp = score[k+2] + score[4];
for(int i=0; i<score.length; i++)
{
System.out.printf("score[%d] : %d\n", i, score[i]);
}
System.out.printf("tmp : %d \n", tmp);
}
score[0] : 50 score[1] : 60 score[2] : 70 score[3] : 80 score[4] : 90 tmp : 170 |
int tmp = score[k+2] + score[4];
score[3]에 있는 80과 score[4]에 있는 90
서로 더해서 tmp 값은 170이 나왔다.
배열에 감싸여 있는 포문의 경우 보통 배열의 인덱스[ ]가 0부터 시작하기 때문이다.
score.length;
변수명.사이즈(=5)
lenth는 0부터 시작하는 인덱스와 다르게 사이즈를 측정하기 때문에 5 값을 가르킨다.
System.out.printf("score[5] \n", score[5]);
마지막에 이걸 추가하면 에러가 뜬다.
public static void main(String[] args) {
int[] iArr1 = new int[10];
int[] iArr2 = new int[10];
int[] iArr3 = new int[] {100, 95, 80, 70, 60};
//int[] iArr3 = {100, 95, 80, 70, 60};
char[] chArr = {'a', 'b', 'c', 'd'};
int i;
for(i = 0; i < iArr1.length; i++)
{
iArr1[i] = i + 1;
}
for(i = 0; i < iArr2.length; i++)
{
iArr2[i] = (int)(Math.random() * 10) + 1; //1~10
}
//출력
for(i = 0; i < iArr1.length; i++)
{
System.out.print(iArr1[i]+", ");
}
System.out.println();
System.out.println(Arrays.toString(iArr2));
System.out.println(Arrays.toString(iArr3));
System.out.println(Arrays.toString(chArr));
//오브젝트 클래스에 있는 투스트링
System.out.println(iArr3);
//주소값을 바로 찍는다.
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, [8, 7, 10, 10, 6, 3, 8, 2, 10, 2] [100, 95, 80, 70, 60] [a, b, c, d] [I@6d06d69c |
iArr1 - for문으로 읽고 출력
iArr2 - for문으로 랜덤값 입력하고, Arrays.toString()로 읽기
iArr3 - 선언과 동시에 값 할당하고, Arrays.toString()으로 읽기
chArr - 캐릭터 타입으로 할당하고, Arrays.toString()으로 읽기
마지막 iArr3은 주소값만 찍는다.
int[] iArray1 = new int[5]; 이런 방법도 있지만
int[] iArray3 = new int[] { 100, 95, 80, 70, 60 };
이렇게 선언 하자마자 값을 할당해주는 방법도 있다.
char[] chArr = { 'a', 'b', 'c', 'd' };
캐릭터 타입은 일반변수 선언할 때처럼 (')안에 넣어준다.
iArry2[i] = (int)(Math.random() * 10) + 1;
랜덤 함수로 아무값을 입력해준다.
[I@6d06d69c
[ 주소값을 나타내는 특수기호
I 인트 타입이라는 걸 알려준다.
@ 주소가 이제부터 시작이다~
자바 버츄얼 머신에서 읽는 법이다.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] iArr1 = new int[10];
int[] iArr2 = new int[10];
int i;
System.out.print("iArr1 배열의 값을 입력하세요.> ");
for(i=0; i<iArr1.length; i++)
{
iArr1[i] = sc.nextInt();
iArr2[i] = iArr1[i];
}
for(i=0; i<iArr1.length; i++)
{
System.out.printf("iArr1[%d] = %d\n",i,iArr1[i]);
}
System.out.println();
for(i=0; i<iArr2.length; i++)
{
System.out.printf("iArr2[%d] = %d\n",i,iArr2[i]);
}
}
for문을 많이 사용하게 될 경우 처음부터 int i를 선언하는 방법도 있다.
iArr1값을 iArr2에 옮기는 방법이다.
입력과 동시에 Arr2에 받아서 출력하는 방법이 있다.
둘 다 데이터 타입과 크기가 같기 때문에 가능하다.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] iArr1 = new int[10];
int[] iArr2 = new int[10];
int i, j;
System.out.print("iArr1 배열의 값을 입력하세요.> ");
for(i=0; i<iArr1.length; i++)
{
iArr1[i] = sc.nextInt();
}
for(i=0, j=iArr2.length-1; i<iArr1.length; i++, j--)
{
iArr2[j] = iArr1[i];
}
for(i=0; i<iArr1.length; i++) {
System.out.printf("iArr1[%d] = %d\n",i,iArr1[i]);
}
System.out.println();
for(i=0; i<iArr2.length; i++)
{
System.out.printf("iArr2[%d] = %d\n",i,iArr2[i]);
}
}
iArr1의 인덱스 0~9를 iArr2의 9~0까지 반대로 갖고 와서 출력하고 싶다면?
나의 경우 iArr1[i]로 설정하고, iArr2[j]를 설정했다.
오늘 처음으로 알게 된 것!
for문에서 동시에 i와 j를 돌릴 수 있다!
대신 조건식은 하나여야하고, 초기화와 증감식은 두 개도 괜찮다.
for(i=0, j=iArr2.length-1; j>=0; i++, j--)
{
iArr2[j] = iArr1[i];
}
for(i=0, j=iArr2.length-1; i<iArr1.length; i++ j--)
{
iArr2[j] = iArr1[i];
}
이런 방법이 있겠쥬?
for( i = 0 ; i < iArr1.length ; i++)
{
iArr2[i] = iArr1[(iArr1.length - 1) - i] ;
System.out.printf("iArr2[%d] = %d \n", i, iArr2[i] );
}
이런 방법도 있다!
개발자 레벨이 올라가게 되면 자바 뿐만 아니라 C언어도 배우게 되니까 알아두면 좋다!
'개발일지 > Java + Spring' 카테고리의 다른 글
211020 Java - 시험 풀이 (0) | 2021.10.20 |
---|---|
211020 Java - Array 배열 복사 하는 방법과 메소드 (0) | 2021.10.20 |
211019 Java - while (0) | 2021.10.19 |
JAVA 211019 - today (0) | 2021.10.19 |
포문 printf (0) | 2021.10.18 |