Arrays
1.배열 하나의 이름으로 같은 자료형 데이터를 여러개 저장할 수 있는 메모리 구조
2. 배열 특징: 메모리가 연속적으로 생김, 참조형이다.
그림으로 이해하기
[1차원(선형) 배열]
** 수정***
이거 자꾸 헷깔려서 주말에 다시 정리
//1.배열선언
int [ ] arr ;
//2.메모리 할당
int [ ] aarrr = new int [3];
//3.초기화하기 일일이 버전
int [ ] aarrrr = new int [3]; // 일일이 넣으려면 메모리를 먼저 할당 해야 가능함.
aarrrr[0]=10;
aarrrr[1]=20;
aarrrr[2]=30;
int [ ] arrrrrr ; //아니면 이렇게 하던지
arrrrrr = new int [ ] {10,20,30};
//선언과 동시에 메모리할 및 초기화 하는법(코드가 간결하니 이렇게 거의 쓰겠지)
int [ ] aaaaaaaaar = new int [ ] {2,3,4,5,6,7,8}; // new 자료형 [ ]{ } 형태
int [ ] aaaaar = {1,2,3,4,5,}; //초기화자{ } 만 쓰는형태
배열선언
int [ ] arrNum ; : 이건 int [ ] arrNum 이렇게 써도 동일
arrNum = 10 ; : 이 형식 노노노노!!! stack 에 직접 데이터를 저장할 수 없다.
arrNum = new int [ 5 ] ; :참조형에서 직접 데이터저장하려면 "new연산자" 를 사용하여 메모리 생성 (메모리를 할당한 다라고 함)!! 요건 heap영역에 생성됨
그러면 생성된놈에 주소가 생기는데 그 주소가 stack에 arrNum에 들어감.
즉, stack에 arrNum이 heap에 저장된놈의 주소를 참조 해서 가져오는 시스템 ?
System.out.println(arrNum); 16진수로 주소가 출력 됨
=>출력
[I@1e81f4dc
System.out.println(arrNum[0]); 배열명[숫자] 를 요소명이라고 한다 , [ ]안의 숫자는 인덱스라고 함
=>출력
0
System.out.println(arrNum[4]); 요소명은 변수처럼 사용할 수 있다
=>출력
0
System.out.println("[배열 초기화 전]");
for(int i=0 ; i<5 ; i++ ) {("arrNum[%d] : %d%n", i , arrNum[i]); 배열은 초기화 하지 않아도 기본값이 세팅
} 되어 있음!! int는 0, double 0.0 참조형은 null
System.out.printf("arrNum[%d] : %d%n", i , arrNum[i]);
}
=>출력
[배열 초기화 전]
arrNum[0] : 0
arrNum[1] : 0
arrNum[2] : 0
arrNum[3] : 0
arrNum[4] : 0
배열 초기화해보자 : 메모리 생성 후 최초값 할당
arrNum[0] = 10;
arrNum[1] = 20;
arrNum[2] = 30;
arrNum[4] = 50;
System.out.println("[배열 초기화 후]");
for(int i=0 ; i<5 ; i++ ) {
System.out.printf("arrNum[%d] : %d%n", i , arrNum[i]);
}
=> 출력
[배열 초기화 후]
arrNum[0] : 10
arrNum[1] : 20
arrNum[2] : 30
arrNum[3] : 0
arrNum[4] : 50
cf. arrNum[5] = 60; 컴파일은 되지만 실행이 안된다. 5번방은 없어요
출력해보자 **** cf. 배열의크기(배열의 총 개수?) 얻는법 : 배열명.length
System.out.println("배열의 크기:"+arrNum.length);
=>출력
배열의 크기:5
for(int i =0; i <arrNum.length ; i++) { i 범위를 하드코딩하는건 위험 값 바뀔때마다 일일이 고칠껴?
if(i == arrNum.length-1) 마지막요소인경우 (마지막엔 , 출력 안하려고)
System.out.printf("arrNum[%d]:%d",i,arrNum[i]);
else
System.out.printf("arrNum[%d]:%d,",i,arrNum[i]);
}
3항문으로 만들어보기
for( int i=0 ; i <arrNum.length ; i++ ){
System.out.printf( i == arrNum.length-1 ? "arrNum[%d]:%d%n" : "arrNum[%d]:%d,",i,arrNum[i] );
}
=>출력
arrNum[0]:10,arrNum[1]:20,arrNum[2]:30,arrNum[3]:0,arrNum[4]:50
배열선언과 동시에 메모리 할당
String [ ] strArray = new String [3] ; 배열의 크기가 3인 메모리 생성 됨
System.out.println(strArray); stack에 저장되어있는 strArraym의 주소가 출력 됨
System.out.println("[배열 초기화 전]");
for(int i=0 ; i < strArray.length ; i++) {
System.out.printf("strArray[%d]:%s%n", i,strArray[i] );
}
=>출력
[배열 초기화 전]
strArray[0] : null
strArray[1] : null
strArray[2] : null
String형 배열 초기화 하기
strArray[0] : "한국";
strArray[1] : "소프트웨어";
strArray[2] : "인재개발원";
System.out.printf("[배열 초기화 후]")
for(int i=0 ; i < strArray.length ; i++) {
System.out.printf("strArray[%d]:%s%n", i,strArray[i] );
}
=>출력
[배열 초기화 후]
strArray[0] : 한국
strArray[1] : 소프트웨어
strArray[2] : 인재개발원
배열 선언과 동시에 초기화
방법1. {} 배열 초기화자만 사용
double [] abArr = {100,3.14,99.9}; {}를 배열 초기화자 라고 한다!
for( int i=0 ; i <= abArr.length ; i++){
System.out.printf("abArr[%d]: %.2f%n",i,abArr[i]);
}
=>출력
abArr[0] : 100.00
abArr[1] : 3.14
abArr[2] : 99.90
방법2. new 자료형[]{}
double [] abArr = new double [] {100,3.14,99.9}
=> 결과는 위에꺼랑 똑같다
boolean형 배열선언
boolean [ ] blArr ; 선언했지? 그리고나서
blArr = { true, 3>2, 3>2 && 5 <3, false} ; 요렇게 초기화자는 쓰면 안된다! 초기화자는 배열선언과 동시만 가능하다!
boolean [ ] blArr = {true, 3>2, 3>2 && 5 <3, false};
for(int i=0 ; i< blArr.length ; i++){
System.out.printf("blArr[%d]: %s%n ", i,blArr[i]);
}
=>출력
blArr[1] : true
blArr[2] : false
blArr[3] : false
**** Scanner클래스의 메소드 정리 ****
예]사용자가 12(엔터)치면 버퍼에 1|2|'\r'|'\n' 저장됨
nextInt() : 버퍼에 있는 엔터값(\r\n)은 읽지 않는다. nextInt()는 숫자만 읽는다 즉 숫자 12반환
nextLine() : 엔터값도 읽는다 하지만 엔터값을 제외한 부분만 반환한다. 즉, 문자열 "12"반환 버퍼에는 엔터값 이 존재하지 않는다
학생 수 만큼 이름 입력받기 (총 학생 수를 알 수 없어요)
Scanner sc = Scanner(System.in);
System.out.println("학생수를 입력하세요:);
int numberOfStudents = sc.nextInt();
sc.nextLine(); //얘는 엔터값을 읽어서 위에서 사용 안하고 걍 이거 이용해서 버퍼를 비워준다!
이거 안비워주면 다음코드 실행할 때 1번째 학생 이름 입력도 안했는데 엔터값 처리되어서
2번째 학생이름 입력으로 걍 넘어감
System.out.println("입력받은 학생 수:"+numberOfStudents);
학생 수 만큼 메모리 생성하기
String[ ] names = new String[ numberOfStudents ];
for( int i =0 ; i < numberOfStudents ; i++ ){
System.out.printf("%d번째 학생의 이름을 입력하세요?",i+1);
names[i] = sc.nextLine();
}
출력하기
for( int i =0 ; i < names.length ; i++ )
System.out.printf("%d번째 학생이름:%s%n",i+1,name[i] ) ;
문제
int [ ] jumsu = {98,99,180,34,67,990,1004,19,5,189,55,66,78};
int sum = 0;
문1. int형 배열 jumsu에 저장된 점수의 총합과 평균을 구해라 그리고 출력하라.
for( int i=0 ; i<= jumsu.length ; i++){
sum += jumsu[i];
}
System.out.printf("점수의 총합:%s, 평균:%.2f%n", sum, (double) sum/jumsu.length );
문2.상기 jumsu 배열에 저장된 값 중 최대값을 구하라
int max = jumsu[0];
for(int i = 0 ; i < jumsu.length ; i++){
if(max < jumsu[i] ) max = jumsu[i]; 첫값 잡아서 비교하고 max값 바꾸고
}
System.out.println("최대값:"+max);
***** 문3.상기 jumsu 일차원 배열을 크기 순서대로 재 배치후 출력하라.(내림차순으로, 2중for문사용)
for( int i=0 ; i < jumsu.length ; i++ ){ // 이게 i랑 k랑 서로 비교 대조해 나가는 방식이니까 행렬이 만들어짐.
for(int k=i+1 ; k< jumsu.leng; k++){
if(jumsu[i])< jumsu[k]){ //i가 k보다 크다면
int temp = junsu[k]; //temp라는 빈 공간에다가 k값을 옮겨놓고
jumsu[k] = jumsu[i]; //k의 빈공간에 i값을 넣고
jumsu[i] = temp; i의 빈 공간에 temp에 있던 k값을 넣으면 자리바꿈 완료!!!!
} ** **요 방법 꼭 익혀두자!! 면접 문제로 나올 수 있음 잘 알아두기!!!*
}
}
출력
for( int i=0 ; i< jumsu.length-1 ; i++ ){
system.out.printf("jumsu[%d]:%-5d",i,jumsu[i]);
}
'학원 > JAVA' 카테고리의 다른 글
9.21 6-3일 차 ArrayExample (1) | 2022.09.21 |
---|---|
9.21 6-2일 차 ArrayType02(2차원배열) (1) | 2022.09.21 |
9.20 5-5일 차 컴퓨터와 가위바위보 게임 (1) | 2022.09.20 |
9.20 5-4일 차 Break & Continue (0) | 2022.09.20 |
9.20 5-3일 차 DoWhileStatement (0) | 2022.09.20 |