본문 바로가기

개발일지/Java + Spring

211019 Java - Array

배 열

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 의미한다. 즉, 같은 데이터 타입의 변수가 여러 개 필요할 때 사용한다. 같은 타입의 변수가 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