배열의 길이를 알아보는 함수
배열의 길이를 알고 싶을 때 사용하는 건 두가지가 있다.
첫번째는 Size 함수를 이용하는 것과 두번째는
lastIndex -1 을 하는 것 두가지가 있는데 이 두가지는 뭘 사용해도 크게 문제 없다.
( 그냥 취향차이..)
보통 lastIndex -1 이라고 쓰는데 만약 한개의 데이터만 넣었다고 가정하면 1 -1 = 0 이라서
결국에는 0이다 즉, 자바에서는 0부터 숫자를 세기 때문에 배열의 길이가 0이 되는거고
0이 뜨면 그냥 1이라고 생각하면 된다 -> 하지만 Size 함수는 그냥 길이를 알아보는거라서 1넣으면 1 뜬다.
class Main {
public static void main(String[] args) {
ArrayList ar = new ArrayList();
ar.add(100);
ar.add(200);
ar.add(300);
ar.add(400);
System.out.println(ar.size); // 여기에서 출력하면 4가 나온다
class ArrayList {
int size;
int[] intArr;
ArrayList() {
size = 0; // 초기값
intArr = new int[3]; // intArr 배열의 크기
}
위에서 4가 나오는 이유는 ar.add 에 100,200,300,400 해서 총 4개의 데이터가 들어가 있기 때문에
길이는 4라서 4가 나오는거고 lastIndex-1 을 하게 되면 3이 뜬다 그러면 0,1,2,3 해서 총 길이가 4이다.
배열의 삭제
배열을 삭제하는데에는 여러가지 방법이 있다, 물론 배열을 아예 삭제한다는 개념은 아니며 배열을 한 번 생성해서
길이를 정해주면 그 배열의 길이 중간 또는 끝을 삭제하는 건 불가하고 데이터를 없애서 빈 배열로 만든다 봐야한다.
이번에 볼 건 위와 같은 개념인데 총 길이 10의 배열이 있는데 중간에 있는 배열의 데이터를 냅두고
그 뒤에 있는 배열의 데이터를 덮어써서 맨 뒷 배열의 데이터를 없애는거라고 보면 되는데 이렇게 되면 우리가 눈으로 보기엔
중간 배열의 데이터가 삭제된 것 처럼 보이기 때문에 중간 배열을 삭제했다고 본다.
class Main {
public static void main(String[] args) {
ArrayList ar = new ArrayList();
ar.add(100);
ar.add(200);
ar.add(300);
ar.add(400);
for(int i = 0; i < 10; i++) {
ar.add(500 + (i * 100));
}
ar.removeAt(1); // 1번 배열의 데이터 삭제를 위함
System.out.println("size: " + ar.size);
int value = ar.get(0);
System.out.println(value);
// 출력 : 100
value = ar.get(1);
System.out.println(value);
// 출력 : 200
value = ar.get(2);
System.out.println(value);
// 출력 : 300
//value = ar.get(3);
//System.out.println(value);
// 출력 : 400
ar.showAllValues();
}
}
class ArrayList {
int size;
int[] intArr;
ArrayList() {
size = 0;
intArr = new int[3];
}
void add(int value) {
// 버스 확장공사 로직
if( size == intArr.length ) {
int[] newArr = new int[intArr.length * 2];
for( int i = 0 ; i < intArr.length; i++ ) {
newArr[i] = intArr[i];
}
intArr = newArr;
}
// 마지막 들어온사람 태우는 로직
intArr[size] = value;
size++;
}
int get(int index) {
return intArr[index];
}
int size() {
return size;
}
void removeAt(int index) {
for(int i = index; i < size; i++) {
intArr[i] = intArr[i+1]; // i를 removeAt이 받는 int index로 주고 size인 배열의 길이만큼 for을 돌린다.
}//intArr[i] 번째 배열에 intArr[i+1] 번의 데이터를 넣는다.
// 즉, 첫 for문 시작 때에는 intArr[1] 번째 배열에 intArr[2]번째의 데이터를 넣는다.
size--; // 이걸 안하면 맨 뒷 배열도 출력이 되며 0으로 출력이 되기 때문에 그 부분을 없애기 위함임
}
void showAllValues() {
for(int i = 0; i < size; i++) {
System.out.printf("%d번 항목: %d\n",i , get(i));
}
}
}
여기에서 봐야할 건 다른 함수보다는 removeAt 이라는 함수를 봐야한다.
showAllValues는 확인을 위한 함수라서 removeAt만 보면 된다.
removeAt(1) 을 통해서 1번째 배열을 삭제하기 위한 코드이며 i는 1로 시작을 하니까
1번째 배열의 데이터를 i+1 의 데이터로 덮어쓴다 그러면 만약에 0~9 번째 배열에
100,200,300,400,500~~ 이 있다고 한다면 200이 없어지고 200자리에 300으로 출력이 될거다
근데 당연히 0번째에 100 1번째에 300 이런식으로 나오게 되며 따지면 1번째 배열의 200이라는 데이터를
300으로 바꾼거라고 보면 되며 9번째 배열에는 0이 되며 실질적으로 빈 배열이 된다.
(0번째 배열이 100인 이유는 removeAt(1) 이며 0번째 배열이 아닌 1번째 배열부터 for문이 시작되기 때문임)
만약 int i = index가 아닌 0이었다면 당연히 removeAt(1) 이라서 실행이 되진 않겠지만 쉽게 생각하기 위해서
실행이 된다고 가정하면 int i = 0 으로 for 문이 돌아갔다면 당연히 0번째 배열의 데이터인 100이 200으로 바뀔것이다.
삭제하는게 되게 여러가지 방법이 있기는 한데 어제 방법 여러가지를 찾아보고 다 해봤지만 안되더라..
수업 시간에 removeAt 이라고 해서 버스를 비유해서 설명해주셨는데 뭔가 설명은 이해가 되는데
막상 코드로 짜는게 어렵더라.. 그래서 최대한 쉽게 생각해서 이해를 해야 이해가 되기 때문에
위와 같이 정리를 해보았다, 잊지말자 배열은 for문과 함께 사용되는 경우가 정말 많이 있다..!
제네릭(Generic)
제네릭의 경우에는 설명하기가 굉장히 애매한데, 일단 우리가 일반적으로 자바에게 타입 자체를 알려줘야하는 경우가 있다.
들어가는 타입이 int인지 double인지 String인지 기타 등등 이런 타입을 선언을 해줘야하는 경우가 있는데
문제는 이것도 한두개여야지 그냥 선언을 해주는데 100개 이상의 경우에는 하나하나 하기엔 힘이 드는 경우가 있다.
그래서 이럴 때 사용하는 것이 제네릭 이라는 것인데 뜻이 뭐 일반적인 이라는거란다.
그냥 일반화를 해서 넣는다 이런 개념같은 것 같은데 솔직히 뭔소리인지는 솔직히 정말 잘 모르겠다...
일단 사용한거부터 한 번 보면
class Main {
public static void main(String[] args) {
저장소 a저장소1 = (int) new 저장소();
a저장소1.setData(30);
int a = a저장소1.getData();
System.out.println(a);
저장소 a저장소2 = (Double) new 저장소();
a저장소2.setData(5.5);
double b = a저장소2.getData();
System.out.println(b);
저장소 a저장소3 = (사과) new 저장소();
a저장소3.setData(new 사과());
사과 c = a저장소3.getData();
System.out.println(c);
}
}
class 저장소 {
Object data;
Object getData() {
return (T)data;
}
void setData(Object inputedData) {
this.data = inputedData;
}
}
class 사과 {
}
원래 일반적으로 위의 코드 처럼 하나하나 얘가 int 값이 진짜 맞다 또는 double 값이 진짜 맞아 이런 것을
자바한테 하나하나 알려줘야 에러 발생이 되지 않고 실행이 되게 된다.
근데 제네릭을 사용하게 된다면
package com.example.MyJavaProject;
//code.oa.gg/java8/1350
// 문제 : 제너릭을 사용해서 중복을 제거해주세요.
class Main {
public static void main(String[] args) {
저장소<Integer> a저장소1 = new 저장소<>();
a저장소1.setData(30);
int a = a저장소1.getData();
System.out.println(a);
저장소<Double> a저장소2 = new 저장소<>();
a저장소2.setData(5.5);
double b = a저장소2.getData();
System.out.println(b);
저장소<사과> a저장소3 = new 저장소<>();
a저장소3.setData(new 사과());
사과 c = a저장소3.getData();
System.out.println(c);
}
}
class 저장소<T> {
Object data;
T getData() {
return (T)data;
}
void setData(T inputedData) {
this.data = inputedData;
}
}
class 사과 {
}
이런식으로 해서 사용을 할 수 있다.
'Java' 카테고리의 다른 글
| 2022-09-08 자바 (0) | 2022.09.08 |
|---|---|
| 2022-09-07 자바 (제네릭, 해쉬맵(간단)) (0) | 2022.09.07 |
| 자바 배열 (array) 알아보기 from 점프 투 자바 (0) | 2022.09.06 |
| 2022-08-31 자바 수업 (static, final) (0) | 2022.09.01 |
| 2022-08-30 자바 수업 (0) | 2022.08.30 |
댓글