▶Arrays._____
배열을 다루는데 유용한 여러 가지 method를 제공한다.
java.util.Arrays가 fullname이다
util의 하위Package임을 알 수 있다.
특징으로 객체를 생성하지 않는 static method이다.
※배열을 한 번에 출력하는 메소드 Arrays.toString
Arrays.toSring은 Arrays라는 Class의 toString이라는 Method
int[] arr1 = {11,12,13,14,15}; //배열을 선언했다.
System.out.println(Arrays.toString(arr1));
Arrays라는 Class에서 toString을 호출하여 arr1을 파라미터로 넣었다.
이때의 결과물은 [11, 12, 13, 14, 15] 이다.
이 데이터는 적혀있는 이름대로 Array(배열)의 Element(요소), Item(요소)들을 하나의 String 타입으로 return한 값이다.
※배열의 길이를 더 늘리고싶다. 하지만 바꿀수없으니 배열복사를 이용하자
int[] intarr = new int[5]; // index를 0부터 4까지 부여했다.
intarr[5] = 55; // 그렇다면 5를 선언할수 있을까?
배열의 길이가 5로 선언되면 길이를 변형할수 없다.
위의 예시와 같이 5번 index를 아래에서 추가로 선언하여 컴파일 해보면
우리는 배열의 길이를 늘리고싶다고 하여 마음대로 선언한다고해도 자바에서 받아들일수 없다는것을 이를 통해 확인했다.
그렇기때문에 우리는 새로운 배열을 선언하고, 기존의 index넘버와 동일한 index넘버에 같은 데이터를 넣고싶다.
그 방법은 여러가지가 존재한다.
방법1. for문의 활용 "깊은복사(Deep copy)"
int[] oriArr = {1,2,3,4,5};
int[] copyArr = new int[oriArr.length*2]; // 복사될 예정인 배열 선언. 그 길이는 원본 배열의 2배
for(int i=0;i<oriArr.length;i++){ // 방법1. for문을 이용하여 복사본으로 선언한 배열에 그대로 대입해주었다.
copyArr[i]=oriArr[i];
}
이때 copyArr 는 [1, 2, 3, 4, 5, 0, 0, 0, 0, 0] 이 된다.
index 5, 6, 7, 8, 9 가 비어있는것이 보인다.
새로 생성된 것이므로 oriArr와 copyArr의 주소 hash는 다른 상태이다. 따라서 원본의 변화에 영향을 받지 않는다.
방법2. 새배열명 = 원본배열명; "얕은복사(Shallow copy)"
// 위의 내용에 이어서 실행
copyArr = oriArr; // 오른쪽의 oriArr를 copyArr에 대입한다.
이때 copyArr는 [1, 2, 3, 4, 5] 이 된다.
이때 copyArr는 새로운 주소를 갖지 않고 oriArr의 주소를 그대로 참조하여 읽어온다.
따라서 oriArr의 변화가 생길경우 copyArr또한 같은 변화가 생긴다.
이를 통해서 알게된 것은 "="을 통해 복사한 배열은 우변의 주소hash를 좌변에 그대로 대입해주는 것이다. 결코 값을 대입하는것이 아니다.
int oriArr = [1,2,3,4,5};
int copyArr = new int[5];
copyArr = oriArr;
System.out.println(Arrays.toString(copArr)); // 이때는 [1,2,3,4,5] 를 출력
oriArr[0] = 20; // 원본 배열의 0번 index를 20으로 변경
System.out.println(Arrays.toString(copArr)); // 이때는 [20,2,3,4,5] 를 출력
같은 주소를 갖기때문에 이런식으로 원본이 바뀔때 사본도 따라서 변경됨을 보여준다.
☞두가지 방식을 비교해 보았을때 공간을 늘리고 싶을때 필요한 복사는 Deep copy이다.
두 방식의 비교는 면접에서도 제시되기때문에 정확히 알아둘 필요가 있다.
그 외의 다른 복사방법도 알아보자.
방법3. Object.clone(); 을 이용 (Deep copy)
Object의 하위이기때문에 따로 "Object."을작성해줄필요는 없다.
// 원칙적으로 부모클래스인 Object클래스의 clone()을 상속받았다.
copyArr = oriArr.clone();
System.out.println("oriArr의주소: "+oriArr);
System.out.println("copyArr의주소: "+copyArr); // 주소가 서로 다름을 확인 (깊은복사!!)
(주의) Object.clone()은 1차원배열에서는 Deep copy이나 2차원에서는 Shallow copy를 한다.
방법4. Arrays.copyOf(,); 을 이용 (Deep copy)
오버로딩의 예시로 좋은 Arrays 클래스의 copyOf() 메소드다.
우리는 이중에서도 int[]일때에 맞추어 적용할 것이다.
// 복사받을배열 = Arrays.copyOf(복사할배열, Index 0부터 복사할 배열의개수)
copyArr = Arrays.copyOf(oriArr,oriArr.length);
System.out.println("oriArr의주소: "+oriArr);
System.out.println("copyArr의주소: "+copyArr); // 이번에도 주소가 다르다(깊은복사~)
방법5. Arrays.copyOfRange(,,); 을 이용(Deep copy)
위의 것과 차이는 시작과 끝나는 곳을 지정 할 수 있다.
// 방법5. Arrays.copyOfRange(,,); 이용
// Arrays 클래스의 copyOfRange 라는 method
// 복사받을배열=Arrays.copyOfRange(원본,시작index,마지막index-1)
copyArr = Arrays.copyOfRange(oriArr,0,oriArr.length);
System.out.println("oriArr의주소: "+oriArr);
System.out.println("copyArr의주소: "+copyArr); // 이번에도 주소가 다르다(깊은복사~)
System.out.println(Arrays.toString(oriArr));
System.out.println(Arrays.toString(copyArr));
System.out.println("copyOfRange 0to3");
copyArr = Arrays.copyOfRange(oriArr,0,3);
System.out.println("oriArr의주소: "+oriArr);
System.out.println("copyArr의주소: "+copyArr); // 마지막의 index에서 1을 뺀다 그 이유는 나중에..
System.out.println(Arrays.toString(oriArr));
System.out.println(Arrays.toString(copyArr));
System.out.println("copyOfRange 1to3");
copyArr = Arrays.copyOfRange(oriArr,1,3);
System.out.println("oriArr의주소: "+oriArr);
System.out.println("copyArr의주소: "+copyArr); // 시작이 1이었으므로 oriArr[1],oriArr[2] 의 정보만 return
System.out.println(Arrays.toString(oriArr));
System.out.println(Arrays.toString(copyArr));
포인터의 위치를 지정하는 것으로 보인다. 포인터의 위치는 각 Index의 바로 앞에 위치하기때문에 해당 Index의 앞번호까지 포함시킨다고 보는것이 가장 무난하다.
방법6. System.arraycopy( , , , , ); 을 이용
"Object" Class의 자식 Class인 "System" Class에서 static의 성질(다시한번 말하지만 객체를 만들지 않는다.)을 가지며
그중 arraycopy라는 method를 사용해보자.
가장 parameter가 많은 만큼 사용할 수 있는 기능도 많기때문에 잘 살펴보아야겠다.
// 방법6. System.arraycopy(object src, int srcPos, Object dest, int destPos, int length); 이용
// System 클래스의 arraycopy 라는 method
// System.arraycopy(원본배열, 원본배열 시작 index, 새배열, 새배열의 시작 index, 복사해올 배열데이터의 길이);
//
System.arraycopy(oriArr, 0, copyArr, 4, 5); // oriArr의 index[0]부터 복사, copyArr의 index[4]부터 5개를 붙여넣는다.
System.out.println("oriArr의주소: "+oriArr);
System.out.println("copyArr의주소: "+copyArr); // 이번에도 주소가 다르다(깊은복사~)
System.out.println(Arrays.toString(oriArr));
System.out.println(Arrays.toString(copyArr));
이떼 Object는 int, boolean, char, string.... 어떠한 타입이든 사용을 할수 있다는 뜻이다.
기본 타입으로 입력해도 자바는 알맞은 Class를 찾아서 가게 되어 객체화된다.
이것을 우리는 다형성 이라고 부른다
▶오버로딩, 오버라이딩
면접에서 주요하게 사용되는 개념 / 실용적으로 사용할수도 있어야한다.
※Overloading
Method가 같은 Class에서 사용됨에도 다양한 방향으로 사용 될 수 있음을 뜻한다.
간단한 단어로 과적(짐을 싣어나를때 쓰는 표현이 맞다)
다양한 형태로 사용할수 있게끔 같은 Class의 같은 method에서 여러가지 형태로 사용 되는 형태이다.
다만 parameter에 사용 된것이 달라짐에 따라서 주의해야할 것들이 많아지므로 조심해야할 필요가 있다.
※Overriding
상위Class에 따라서 하위에서 같은 method가 다른 방향으로 해석 되는 것을 뜻한다.
간단한 단어로 재정의로 받아들이려고 한다.
기본적으론 Object의 상속을 받아 사용되지만 다른 Class를 호출 받아 사용 할 경우 method의 기능이 달라진다.
예시) Date클래스의 toString() 과 String클래스의 toString()은 다른역할을 하여 다른 값을 return하고 구체적인 차이는 차차 알아보는것으로 하자.
▶Class (설계도)
1. 객체 지향 프로그래밍(Object Orientral Programming)
부품 객체들을 먼저 만들고 이것들을 하나씩 조립하여 완성된 프로그램을 만드는 방법
★객체(Object) : 물리적으로 존재하는 것들 중에서 추상화할수 있는 속성과 동작을 가질 수 있는 모든 것
필드(속성)과 메소드(동작)로 구성된 자바 객체로 모델링 할수 있다.
특징1> 캡슐화
특징2> 상속
특징3>다형성
2. 클래스 선언 규칙
※자바의 작성 규칙을 동일하게 따른다.
>하나 이상의문자
>첫번째글자엔 숫자X
>$, _ 를 제외한 다른 특수문자는 사용 불가능
>자바키워드는 사용할수 없다. (int, for.... 등등)
※선언방식
class ex1Class;
ex1Class = new class(); // 변수명을 선언한 후 그 클래스에 대한 정보 입력
class ex2Class= new class(); // 한번에 선언해버린다
※클래스를 구성하는 요소
>Field(필드)
>Constructor(생성자)
>Method(메소드)
★★★
오늘의 예습 : 클래스 복습
'JAVA > JAVA 국비지원 수업 정리' 카테고리의 다른 글
JAVA 10일차 수업 (0) | 2023.05.11 |
---|---|
JAVA 9일차 수업 (2) | 2023.05.10 |
JAVA 8일차 추가공부 log (0) | 2023.05.09 |
JAVA 7일차 수업 log (2) | 2023.05.08 |
JAVA 6일차 수업 log (0) | 2023.05.04 |