반응형

1️⃣ 변수
- 자료를 저장하기 위한 메모리 공간
- 타입에 따라 크기가 달라짐
- 메모리 공간에 값(value)을 할당(assign) 후 사용
🔹 변수의 타입
- 기본형 (primitive type)
- 미리 정해진 크기의 데이터 표현
- 변수 자체에 값 저장
- 참조형 (reference type)
- 크기가 미리 정해질 수 없는 데이터의 표현
- 변수에는 실제 값을 참조할 수 있는 주소만 저장
- 기본형 8개 빼고는 다 참조형임
🔹 기본형의 크기

- 파란색의 의미
- 정수형에서는 int가 기본, 실수형에서는 double이 기본이다
- byte는 8bit인데 왜 2^7까지만 처리하지?
- 8칸 중에 맨 앞 칸은 부호 비트이기 때문이다
정수 계산 시 overflow 주의
필요한 수의 크기를 고려해서 int 또는 long 등 타입 선택
실수의 연산은 정확하지 않다
- 부동소수점 정밀도 오차 때문
- 유효 자릿수를 이용한 반올림 처리
정확한 연산을 하려면?
- 정수로 만들어서(정수가 되도록 10^n을 곱함) 연산한 후에 다시 10^n으로 나눔
2️⃣ 형 변환 (Type casting)
- 변수의 형을 다른 형으로 변환하는 것
- char → int, int → char ..etc
- primitive는 primitive끼리, reference는 reference끼리 형 변환 가능
- boolean은 다른 기본형과 호환되지 않음
- 기본형과 참조형의 형 변환을 위해서 Wrapper 클래스 사용
- Wrapper 클래스는 8개 (기본형이 8개니까)
🔹 형 변환 방법
- 형 변환 연산자(괄호) 사용
- 명시적 형 변환
- 큰집 → 작은집
- 값 손실이 발생할 수 있으므로 프로그래머 책임 하에 형 변환 진행
- 묵시적 형 변환
- 작은집 → 큰집
- 값의 크기, 타입의 크기가 아닌 타입의 표현 범위가 커지는 방향으로 할당할 경우
- 자료의 손실 걱정이 없으므로 형 변환 연산 생략
cf) float이 long보다 bit 수가 작아도 정수와 실수는 저장 방식 자체가 다르기 때문에 long보다 float이 더 큰 거임
🔹 오버플로우
int i1 = Integer.MAX_VALUE;
int i2 = i1 + 1; // 오버플로우 (int 값 범위 벗어남)
long l1 = i1 + 1; // 오버플로우 (이미 int 값 범위 벗어난 값을 long에 담는 것임)
long l2 = (long) (i1 + 1); // 오버플로우 (이미 i1에 1 더해서 깨진 값을 long으로 변환하는 것임)
long l3 = (long) i1 + 1; // ㄱㅊ (long으로 변환한 i1에 1을 더한 것이라 괜찮음)
int i3 = 1000000 * 1000000 / 1000000; // 값 깨짐 (이미 곱했을 때 깨짐)
int i4 = 1000000 / 1000000 * 1000000; // ㄱㅊ (나누는 게 먼저여서 괜찮음)
- 산술 이항 연산자는 연산 전에 피연산자의 타입을 일치시킴
- 피연산자의 크기가 4byte(int) 미만이면 int로 변경한 후 연산 진행
- 두 개의 피연산자 중 큰 타입으로 형 변환 후 연산 진행
🔹 `|`와 `||`의 차이
- `(조건식1) | (조건식2)`
- 앞에가 true여도 뒤에도 연산함
- `(조건식1) || (조건식2)`
- 앞에가 true면 뒤는 연산하지 않음 (숏서킷)
- `&`와 `&&`도 마찬가지
- &&는 앞에가 false면 뒤는 연산하지 않음
3️⃣ 조건문
- if문 - if문 여러 개보다 가능할 때는 if, else if 사용 권장
- switch문 - break 유의!!
- switch 문에서는 long, float, double, 참조 타입, boolean 불가능
- switch는 내부적으로 정수 테이블 점프(int-based jump table)를 사용하기 때문에 32bit 정수로 표현 가능해야 함
4️⃣ 반복문
- 변수 초기화, 반복 조건, 증감식, 실행문
- for, for-each, while, do-while
5️⃣ 배열
동일한 타입의 데이터 n개 이상을 하나의 연속된 메모리 공간에서 관리하는 것
- 동일한 타입의 변수를 여러 개 사용하면 변수의 개수 증가, 코드의 길이 증가, 반복문 적용 불가, 변수의 수가 동적으로 결정될 경우 사용 불가 → 배열 사용
- reference 타입
🔹 Array 만들기 #1
`타입[] 변수명;` 또는 `타입 변수명 [];`
- ex) int [] points; String [] names;
🔹 변수 생성
- new keyword와 함께 저장하려는 데이터 타입 및 길이 지정 `new data_type[length]`
- `new int [3]`: int 타입의 자료 3개를 저장할 수 있는 배열을 메모리에 생성
- `points = new int [3]`: 생성된 배열을 points라는 변수에 할당
- points는 메모리에 있는 배열을 가리키는 reference 타입 변수
🔹 배열 요소의 초기화

- 배열의 생성과 동시에 저장 대상 자료형에 대한 기본값으로 default 초기화 진행
🔹 배열의 생성과 메모리 사용 과정
`int [] points = new int[3];`
- 배열 선언: int [] points;
- 배열 생성: new int[3];
- int 타입의 데이터 3개를 담을 수 있는 메모리 공간 확보
- 메모리에 연속된 공간 차지 → 크기 변경 불가!
- Type에 대한 default 초기화
- 참조 값 할당: point = new int[3];
- 배열의 주소를 변수에 할당하여 참조하게 함
- 요소에 값 할당: points[0] = 1;
- points[1] = ‘A’; ← ‘A’는 형 변환되어 65로 들어감 (아스키코드)
cf) for문 대신 `ArraystoString()`으로 출력
cf) `toCharArray()`: 문자열을 배열로 변환
🔹 Array 만들기 #2
- 생성과 동시에 할당한 값으로 초기화
- `int [] b = new int [] {1, 3, 5, 7, 9};`
- `int [] c = {1, 3, 5, 7, 9};`
- 선언과 생성을 따로 처리할 경우 초기화 주의
- `int [] points;` // 선언할 때는 배열의 크기를 알 수 없을 때
- `points = new int [] {1, 3, 5, 7, 9};`
🔹 for-each with Array
- 가독성이 개선된 반복문
- 배열 및 Collections에서 사용
- index 대신 직접 요소(element)에 접근하는 변수를 제공
- naturally read only (copied value)
int intArray [] = { 1, 3, 5, 7, 9 };
for (int x : intArray) {
System.out.println(x);
}
🔹 Array is Immutable
- 배열은 최초 메모리 할당 이후, 변경할 수 없음
- 개별 요소는 다른 값으로 변경이 가능하나, 요소를 추가하거나 삭제할 수는 없음
- 새로운 배열을 참조할 수 있으나 그것은 이전 연결을 끊고 새로운 배열에 연결한 것뿐임
cf) `System.arrayCopy`, `Arrays.copyOf`: 배열 복사 method
- 얕은 복사: 주소 값만 그냥 넣어주는 거 (복사본을 수정하면 원본도 수정됨)
- 깊은 복사: 배열값을 새로 만들어서 똑같이 넣어주는 것
🔹 2차원 Array 만들기 #1
- int Type 기준으로 4 x 3 배열 만들기
- 선언
- `int [][] intArray;`
- `int intArray [][];`
- `int [] intArray [];`
- 생성
- `intArray = new int[4][3];`
- 값 할당
- `intArray[0][2] = 3;`
- 선언
int 100차원 배열은 int 99차원 배열을 저장하는 배열이다.
결국 다 1차원 배열이다. 그 1차원 배열에 들어가 있는 데이터가 배열인 것.
🔹 2차원 Array 만들기 #2
- int Type 기준으로 4 x 3 배열과 값을 동시에 만들기
- 선언, 할당, 생성 동시에
- `int [][] intArray = {{ 0, 1, 2 }, { 0, 1, 2 }, { 0, 1, 2 }, { 0, 1, 2 }};`
- 선언, 할당, 생성 동시에
🔹 2차원 Array 만들기 #3
- int Type 기준으로 4 x ? 배열 만들기
- 2차원 배열 선언 선언 / 1차원 배열 생성
- `int [][] intArray = new int[4][];`
- 2차원 배열 선언 선언 / 1차원 배열 생성
- 1차 Array만 생성 후, 필요에 따라 2차 배열을 생성함
- 2차 생성
- `intArray[0] = new int[3];`
- `intArray[1] = new int[2];`
- `intArray[2] = {1, 2, 3};` (X)
- 2차 생성
반응형