| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- 내일배움카드
- spring boot
- 국비지원교육
- 클래스 class
- Algorism study
- tomcat
- 개발자취업부트캠프
- 게시판 리뷰 만들기
- View
- #javaStudy
- 클래스 상속
- Spring
- #패스트캠퍼스 #국비지원교육 #메가바이트스쿨 #MegabyteSchool #개발자취업부트캠프 #내일배움카드
- Entity
- 패스트캠퍼스
- Interface
- MVC 패턴
- Java
- MegabyteSchool
- GIT
- Sts
- github
- side project
- 게시판 만들기
- group study
- MVC
- AWS
- crud
- array
- 메가바이트스쿨
- Today
- Total
tuter77
Java : 배열(2), 2차원 배열, ArrayList 본문
● 배열
- 배열 내부에는 중간에 자료가 빠지면 이어진 자료들을 당겨줘야한다.
[1,1,1,1,null,1,1,1]인 경우 [1,1,1,1,1,1]과 같이 변경.
▷배열 초기화 하기
- 배열은 선언과 동시에 자료형에 따라 초기화 된다.(정수는 0, 실수는 0.0, 객체는 null)- 필요에 따라 초기값을 지정할 수 있다.
예시)int[ ] numbers = new int[ ] {10, 20, 30}; //개수 생략해야함.int[ ] numbers = {10, 20, 30}; // new int[] 생략가능int[ ] ids;ids = new int[ ] {10, 20, 30}; //선언 후 배열을 생성하는 경우는 new int[ ] 생략 불가.
▷ 배열 사용하기
- [ ] 인덱스 연산자 활용 : 배열요소가 저장된 메모리의 위치를 연산하여 찾아준다.
예시)
▷ 배열의 길이와 요소(데이터)의 개수.
- 배열을 선언하면 개수만금 메모리가 할당되지만, 실제 데이터가 없는 경우도 있다.
- 배열의 length속성은 배열의 개수를 반환해주기 때문에 데이터의 개수와는 다르다.
- length 활용시 오류가 나는 경우.
double[] dArr = new double[5];
dArr[0] = 1.1;
dArr[1] = 2.1;
dArr[2] = 3.1;
double mtotal = 1;
for(int i=0; i<dArr.lenth; i++){
mtotal *= dArr[i];
}
System.out.println(mtotal);
남은 배열의 초기값이 0이기 때문에 곱하기를 하면 결과가 당연히 0이 나오는 오류가 발생한다.
이런경우 요소의 개수에 대한 변수(count)를 따로 유지한다.
double[] dArr = new double[5];
int count = 0;
dArr[0] = 1.1; count++
dArr[1] = 2.1; count++
dArr[2] = 3.1; count++
double mtotal = 1;
for(int i=0; i<count; i++){
mtotal *= dArr[i];
}
System.out.println(mtotal);
count 까지만 for문이 돌기 때문에 오류가 없다.
▷ 문자 배열을 만들어 A-Z까지 배열에 저장하고 이를 다시 출력하기(향상된 for문 사용하기.)
위의 실습처럼 문자열도 배열로 지정가능하며, 유니코드를 이용하면 알파벳과 같은 것은 for문으로 자동으로 배열에 입력할 수 있다.
▷ 객체 배열 선언과 구현.
- 기본 자료형 배열은 선언과 동시에 배열의 크기만큼의 메모리가 할당되지만, 객체배열의 경우엔 요소가 되는 객체의 주소가 들어갈(4바이트, 8바이트) 메모리만 할당되고(null로) 각 요소 객체는 생성하여 저장해야한다.
예제)
book 클래스를 만들어 멤버변수로 책제목과 저자를 선언한다. 생성자를 하나만들고, 생성자에 매개변수로 title과 author를 지정해준다.아래는 private로 선언된 변수들을 호출하거나 수정할 get/set 메서드이고 그 아래엔 간단히 정보를 보여줄 메서드를 만들었다.
테스트할 클래스를 새로만들어 library 배열을 선언해주고 객체의 주소들이 저장될 개수를 5로 설정했다.
가운데 주석처리된 부분은 생성된 배열안이 null값으로 들어있는지 확인하기 위함이다.그 아래에 배열[인덱스]로 객체(매개변수)를 생성해주고 객체의 주소와 정보를 향상된 for문으로 출력해보았다.
▷객체 배열 복사하기.
- System.arrayCopy(src, srcPos, dest, destPos, length) 를 사용하는데 이는 자바에서 제공되는 배열복사 메서드이다.
(static 메서드이며, 매개변수로는 소스가 되는 array, 소스 어디서부터, 어디로, 어디부터, 배열의 몇개를 복사할 것인가 가 들어간다.)
그림으로 보면, 1. src array
| (index)0 | 1 | 2 | 3 | 4 |
2. destination array
| (index)0 | 1 | 2 | 3 | 4 |
소스 arr의 어디 인덱스(srcPos)부터 몇개(length)를 dest arr의 어디로(destPos) 보낼것인지를 매개변수로 결정한다.
src[0]에서 src[4]까지 복사하는데 dest[2]부터 넣는다고 하면 배열의 크기가 안맞아 오류가 나게된다.
- 얕은 복사는 객체 주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정된다(즉, 두 배열이 같은 객체를 가리킨다.)
예시) System.arraycopy(library, 0, copyLibrary, 0, 5);
때문에 복사된 배열이 다른 객체를 갖게 하고싶으면, 새로운 객체를 생성해야한다.
그 새로운 객체에 이전 객체의 내용만 복사해서 붙여넣어주면 된다.
예시)
위 예제 처럼 새로 객체를 생성한 뒤 for문과 get/set 메서드를 이용해 내용을 복사해서 붙여넣은 후 출력해보면, 주소와 내용이 다르게 저장되는 것을 볼 수 있다.
● 2차원 배열
▷ 다차원 배열
- 이차원 이상으로 구현 된 배열- 평면(2차원 배열) 이나 공간(삼차원 배열)을 활용한 프로그램 구현.- 2차원 배열은 DB테이블과 같이 행열로 이루어진 배열이다. 예제) (중첩for문이 유사하다.)
| arr[0][0] | arr[0][1] | arr[0][2] |
| arr[1][0] | arr[1][1] | arr[1][2] |
예시)
위의 예시처럼, 각 요소를 일일히 입력해주는 경우와, 틀만 new int[3][4]처럼 지정하는 경우 두가지가 있다.
for문을 사용하면 아래와 같이 값을 일일히 찍어볼 수 있다.(구구단처럼)
● 객체 배열을 구현한 클래스 ArrayList
▷java.util패키지에서 제공되는 ArrayList
- 기존의 배열 선언과 사용방식은 배열의 길이를 정하고 요소의 개수가 배열의 길이보다 커지면 배열을 재할당하고 복사해야 했다.
- 배열의 요소를 추가하거나 삭제하면 다른 요소들의 이동에대한 구현을 해야한다.
- ArrayList는 객체 배열을 좀 더 효율적으로 관리하기위해 제공되는 클래스이며, 이미 많은 메서드들이 최적의 알고리즘으로 구현되어있어, 각 메서드의 사용 방법만 익히면 유용하게 쓸 수 있다.
아래는 유용한 메서드들과 설명이다.
이 메서드들이 궁금하면 에디터 내에서 ArrayList(뿐아니라 여러 라이브러리도 동일)을 블럭 처리한 후 F1을 누르게되면 안의 내용들을 살펴볼 수 있다.)
- boolean add(E e) : 요소 하나를 배열에 추가한다. E는 요소의 자료형을 의미한다.
- int size() : 배열에 추가된 요소 전체 개수를 반환한다.
- E get(int index) : 배열의 index위치에 있는 요소값을 반환한다.
- E remove(int index) : 배열의 index위치에 있는 요소값을 제거하고 그 값을 반환한다.
- boolean isEmpty() : 배열이 비어있는지 확인한다.
예시)
▷ArrayList를 활용한 성적 산출 프로그램.
- 예제 시나리오.
1001학번 Lee와 1002학변 Kim, 두 학생이 있다.
lee학생은 국어와 수학 2과목을 수강했고, kim학생은 국어, 수학, 영어, 3과목을 수강했다.
lee학생의 국어는 100점, 수학은 50점이며, kim학생의 국어는 70점, 수학은 85점, 영어는 100점이다.
Student와 Subject 클래스를 만들고 ArrayList를 활용하여 두 학생의 성적과 총점을 출력하라.
Student 클래스
아래 보기
Subject 클래스
아래 보기
StudentTest 클래스(기능구현)
아래 보기
위 내용은 2022.12.28에 공부한 내용입니다.
'JavaStudy' 카테고리의 다른 글
| Java : 상속(2) 및 복습. (0) | 2023.01.29 |
|---|---|
| Java : 상속, 배열(로테이션) (0) | 2023.01.29 |
| Java : 싱글톤 패턴, 배열 (0) | 2023.01.29 |
| Java : 객체간의 협력(static, 변수 메모리) (0) | 2023.01.29 |
| Java : 참조자료형 변수, 접근제어 지시자, 정보은닉 (1) | 2023.01.29 |