
📅2023. 12. 18 8일차
생성자는 반환값이 없지만, 반환 타입을 void형으로 선언하지 않습니다.
생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있습니다.
객체를 초기화하는 방법이 여러 개 존재할 경우에는 하나의 클래스가 여러 개의 생성자를 가질 수 있습니다.
즉, 생성자도 하나의 메소드이므로, 메소드 오버로딩이 가능하다는 의미입니다.
생성자 실행 순위
표준 배열보다는 느리지만 배열에서 많은 조작이 필요한 경우 유용하게 쓰임.
List 인터페이스에서 상속받아 사용된다.
ArrayList는 객체가 추가되어 용량을 초과하면 자동으로 부족한 크기만큼 용량이 늘어난다.
- T는 제네릭으로 Type을 뜻한다.
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40, 1);
numbers.remove(0);
for (int i = 0; i < numbers.size(); i++) {
int num = numbers.get(i);
System.out.printf("%d : %d\n", i, numbers.get(i));
}
}
}
class ArrayList<T> {
Object[] array;
int size;
ArrayList() {
size = 0;
array = new Object[3];
}
boolean isFull() {
return array.length == size;
}
void sizeUp() {
Object[] newArray = new Object[array.length * 2];
for (int i = 0; i < array.length; i++) {
newArray[i] = array[i];
}
array = newArray;
}
void add(int data) {
if (isFull()) {
sizeUp();
}
array[size] = data;
size++;
}
int getLastIndex() {
return size - 1;
}
void add(Object data, int index) {
if (isFull()) {
sizeUp();
}
int lastIndex = getLastIndex();
for (int i = lastIndex; i >= index; i--) {
array[i + 1] = array[i];
}
array[index] = data;
size++;
}
void remove(int index) {
for (int i = index + 1; i < size; i++) {
array[i - 1] = array[i];
}
size--;
}
T get(int index) {
return (T) array[index];
}
int size() {
return size;
}
}
i) public : 모든 접근을 허용
ii) protected : 같은 패키지(폴더)에 있는 객체와 상속관계의 객체들만 허용
iii) default : 같은 패키지(폴더)에 있는 객체들만 허용
iv) private : 현재 객체 내에서만 허용
try{
//예외가 발생될만한 코드
}catch(FileNotFoundException e){ //FileNotFoundException이 발생했다면
}catch(IOException e){ //IOException이 발생했다면
}catch(Exception e){ //Exception이 발생했다면
}finally{
///어떤 예외가 발생하던 말던 무조건 실행
}
try 블록 : 이 블록에서 예외가 발생할만한 코드가 쓰인다.
cath(예외 종류) 블록 : 이 부분에서 예외가 발생되었을 때 처리하는 동작을 명시한다.
finally 블록 : 여기서는 예외가 발생하건 발생하지 않건 공통으로 수행되어야할 코드가 쓰여진다. 임시 파일의 삭제 등 뒷정리 코드가 쓰인다.
- 프로그램을 개발 하다 보면 유효하지 않은 메모리인 가바지(Garbage)가 발생하게 된다. C언어를 이용하면 free()라는 함수를 통해 직접 메모리를 해제해주어야 한다.
- 하지만 Java나 Kotlin을 이용해 개발을 하다 보면 개발자가 메모리를 직접 해제해주는 일이 없다. 그 이유는 JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해주기 때문이다. 대신 Java에서 명시적으로 불필요한 데이터를 표현하기 위해서 일반적으로 null을 선언해준다.
Person person = new Person();
person.setName("Mang");
person = null;
// 가비지 발생
person = new Person();
person.setName("MangKyu");
- 제네릭(Generic)은 직역하자면 '일반적인'이라는 뜻이다. '데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법'이다.
- 제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다.
ArrayList <Array List>articles = new ArrayList<Array List>();
// <Array List> Array List만 들어갈 수 있음
ArrayList <Integer>articles = new ArrayList<Integer>();
// <Integer> 정수만 들어갈 수 있다는 뜻
// < > 요소의 타입을 지정해주는 공간이라고 생각하면 된다
List<Article> articles = new ArrayList<>(); // 생략버전
제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.
비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.
| 타입 | 설명 |
|---|---|
| T | Type |
| E | Element |
| K | Key |
| V | Value |
| N | Nember |
- 했던 내용 전부 복습
- 코드업 최대한 많이
- WIKI 정리
Array List 복습 필이 해야겠다!! Generic 다시 한 번 보자 그리고 현재까지 부족한 거 찾아서 보안!!