📓 Do it! 자바 프로그래밍 입문
this 예약어
- 생성된 인스턴스 스스로를 가리키는 예약어
- 클래스의 생성자에서 다른 생성자를 호출할 수 있음
- 생성된 클래스 자신의 주소 값을 반환할 수 있음
static 변수
- static 변수 = 정적 변수 = 클래스 변수
- 클래스에서 공통으로 사용하는 변수
- 프로그램이 실행되어 메모리에 올라갔을 때 딱 한 번 메모리 공간이 할당됨
- static으로 선언한 변수는 인스턴스 생성과 상관없이 먼저 생성되고 그 값을 모든 인스턴스가 공유하게 됨
변수 유효 범위
1. 지역 변수(로컬 변수)
- 함수 내부에 선언
- 함수 내부에서만 사용
- 스택 메모리
- 함수가 호출될 때 생성되고 함수가 끝나면 소멸함
2. 멤버 변수(인스턴스 변수)
- 클래스 멤버 변수로 선언
- 클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서 사용 가능
- 힙 메모리
- 인스턴스가 생성될 때 힙에 생기고, 가비지 컬렉터가 메모리를 수거할 떄 소멸됨
3. static 변수(클래스 변수)
- static 예약어를 사용하여 클래스 내부에 선언
- 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능
- 데이터 영역
- 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 ㅅ생성되고 프로그램이 끝나고 메모리를 해체할 때 소멸됨
배열
1. 배열 선언과 초기화- 배열: 자료가 연속으로 나열된 자료 구조- 배열 요소: 배열을 이루는 각각의 자료
자료형[] 배열이름 = new 자료형[개수];
자료형 배열이름[] = new 자료형[개수];
- 배열을 선언하면 그와 동시에 각 요소의 값이 초기화됨
- 자료형에 따라 정수는 0, 실수는 0.0, 객체 배열은 null
- 배열 선언과 동시에 특정 값으로 초기화할 수도 있음
//배열 초기화하기
int[] studentIDs = new int[] {101, 102, 103}; //개수는 생략함
int[] studentIDs = new int[3] {101, 102, 103;} //오류 발생
int[] studentIDs = {101, 102, 103}; //int형 요소가 3개인 배열 생성
//배열의 자료형을 먼저 선언하고 초기화하는 경우에는 new int[]를 생략할 수 없음
int[] studentIDs; //배열 자료형 선언
studentIDs = new int[] {101, 102, 103}; //new int[]를 생략할 수 없음
2. 배열 복사하기
1) 기존 배열과 배열 길이가 같거나 더 긴 배열을 만들고 for문을 사용하여 각 요소 값을 반복해서 복사하는 방법
2) System.arraycopy() 메서드 사용
- src: 복사할 배열 이름
- srcPos: 복사할 배열의 첫 번째 위치
- dest: 복사해서 붙여 넣을 대상 배열 이름
- destPos: 복사해서 대상 배열에 붙여넣기를 시작할 첫 번째 위치
- length: src에서 dest로 자료를 복사할 요소 개수
- 객체 배열의 요소에 저장된 값은 인스턴스 자체가 아니고 인스턴스의 주소 값
- 객체 배열을 복사할 때 인스턴스를 따로 생성하는 것이 아니라 기존 인스턴스의 주소 값만 복사
- 두 배열의 서로 다른 요소가 같은 인스턴스를 가리키고 있으므로 복사되는 배열의 인스턴스 값이 변경되면 두 배열 모두 영향을 받음
3. 깊은 복사(deep copy)
- 얕은 복사(shallow copy): 주소 값만 복사
- 인스턴스를 따로 관리하고 싶다면 직접 인스턴스를 만들고 그 값을 복사해야 됨
4. 향상된 for문(enhanced for loop)
- 처음에서 끝까지 모든 요소를 참조할 때 사용하면 편리
- 배열 요소 값을 순서대로 하나씩 가져와서 변수에 대입
- 따로 초기화와 종료 조건이 없기 때문에 모든 배열의 시작 요소부터 끝 요소까지 실행
for(변수 : 배열){
반복 실행문;
}
다차원 배열
- 배열의 모든 요소를 참조하려면 각 행을 기준으로 열 값을 순회하면 됨
int [ ] [ ] arr = new int [2] [3];
int [ ] [ ] arr = {{1, 2, 3}, {4, 5, 6}};
public class TwoDimension{
public static void main(String[] args){
int [][] arr = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
System.out.println();
}
}
}
- 중첩 for문은 배열 인덱스용으로 i, j 두 변수를 사용. i는 행, j는 열.
- 전체 배열 길이인 arr.length는 행의 개수를, 각 행의 길이 arr[i].length는 열의 개수를 나타냄
ArryList 클래스
1. ArrayList 클래스의 주요 메서드
- boolean add(E e): 요소 하나를 배열에 추가합니다. E는 요소의 자료형을 의미합니다.
- int size( ): 배열에 추가된 요소 전채 개수를 반환 합니다.
- E get(int index): 배열의 index 위치에 있는 요소 값을 반환합니다.
- E remove(int index): 배열의 index 위치에 있는 요소 값을 제거하고 그 값을 반환합니다.
- boolean isEmpty( ): 배열이 비어 있는지 확인합니다.
2. ArrayList 클래스 활용하기
ArrayList<E> 배열이름 = new ArrayList<E>( );
- 배열을 선언하는 부분의 < >안에 사용할 객체의 자료형(E)를 쓰면 됨
ArrayList<Book> library = new ArrayList<Book>();
- ArrayList는 java.util 패키지에 구현되어 있는 클래스이기 때문에 ArrayList를 사용하기 위해서는 컴파일러에게 ArrayList가 어디에 구현되어 있는지 알려줘야 함
- ArrayList를 사용하려면 자바 클래스를 선언하기 전에 import java.util.ArrayList; 문장을 반드시 써줘야 함
- 임포트(import): 내 코드에 없는 클래스를 가져와 사용할 때 이 클래스가 어디에 구현되어 있다고 알려주기 위해 코드 맨 위에 선언하는 것