자바 기본
변수, Variable
- 자료를 저장하기 위한 메모리 공간으로 타입에 따라 크기가 달라짐.
- 메모리 공간에 값을 할당 후 사용.
타입이란
- 기본형, primitive type
미리 정해진 크기의 데이터 표현.
변수 자체에 값 저장
- 참조형, reference type
크기가 미리 정해질 수 없는 데이터의 표현
변수에는 실제 값을 참조할 수 있는 주소만 저장.
논리형 boolean
정수형 byte, short, int(기본형), long
실수형 float, double(기본형)
문자형 char
- byte는 왜 2^7까지만 표현?
맨 앞 비트는 부호비트, sign bit 라서
int는 약 20억
long 뒤에는 l, L 을 써야함.
float 뒤에는 f를 써야함.
float과 double의 차이는 정밀도.
Integer => 래퍼클래스, wrapper class
.MAX_VALUE 에 1을 더하면?
- 오버 플로우, overflow 일어남.
- 오버 플로우가 에러는 아님.
double d1 = 2.0
double d2 = 1.1
double d3 = d1 - d2 => 0.899999999...
실수에선 정확한 연산이 되지 않는다.
따라서 정수에서 연산을 하고 다시 바꿔준다.
또는 BigDecimal을 사용.
형 변환, type casting
- 변수의 형을 다른 형으로 변환하는 것
- primitive끼리 reference끼리
- boolean은 다른 기본 형과 형변환 x
- (자료형)을 앞에 붙여서
묵시적 형 변환
- 값의 크기, 타입의 크기가 아닌 타입의 표현 범위가 커지는 방향으로 할당할 경우는 묵시적 형변환 발생.
- bye => short,char => int => long => float => double
- 자료 손실이 걱정 없으므로 형변환 연산 생략
- char과 short는 호환 안 됨. char은 음수쪽이 없고 양수쪽은 더 크기 때문. unsigned sign 차이.
명시적 형 변환
- 값 손실이 발생할 수 있으므로 프로그래머 책임하에 형변환 진행.
int i1 = Integer.MAX_VALUE;
long l1 = i1+1; => 이미 i1+1에서 overflow. 연산의 기본은 int.
long l2 = (long)(i1+1) => 이것도 괄호 안에서 overflow
long l3 = (long)i1+1 => OK
int i3 = 100000 * 100000 / 100000 => 곱하기에서 깨짐.
int i4 = 100000 / 100000 * 100000 => OK
# 연산자
- 어떤 기능을 수행하는 기호(+_*/...)
- 우선순위 및 결합 방향.
- 괄호 좀 표시해라.. 읽기좋은코드가 좋은 코드.
- 산술 이항 연산자는 연산 전에 피 연산자으 ㅣ타입을 일치시킨다.
- 피연산자의 크기가 4byte 미만이면 int로 변경한 후 연산 진행.
- 두 개의 피연산자 중 큰 타입으로 형 변환 후 연산 진행
a = 10;
b = 20;
System.out.println((a += 10) > 15 || (b -= 10) > 15);
=> ||는 short circuit이라서 앞에가 true면 뒤는 실행도 안 시킨다.
# 조건문
if(?)
- ?에는 boolean
switch(?)
- int... 따로 찾기
- break 안 걸면 끝까지 감.
Math.random()
- 0<=...<1 사이 랜덤 실수 반환.
- 4-9 사이를 랜덤으로 가져오고 싶다면.
(int)(Math.random()*6) + 4;
- 사실 랜덤에 nextInt도 있음..
# 반복문
rand.nextInt(6)
- 0보다 같거나 크고 6보다 작은 값을 리턴.
%0.1f
- 값을 소수점 한 자리까지 표시.
배열
동일한 타입의 변수를 여러 개 사용하면
- 변수의 개수 증가
- 코드의 길이 증가
- 반복문 적용 불가
- 변수의 수가 동적일 경우 사용 불가
배열이란
- 동일한 타입의 데이터 0개 이상을
- 연속된 메모리 공간에서 관리하는 것
int[] => 이것도 참조형, reference type
생성
- new keyword와 함께 데이터 타입 및 길이 지정.
- 메모리의 연속된 공간 차지 => 크기 변경 불가
- Type에 대한 defalut 초기화
- 배열 변수 이름은 그저 주소값만 가지고 있음.
참조형 변수 기본형 => null (널널하다......(ᵔᗜᵔ*))
int [] arr = new int[3];
arr[1] = 'A'
- char => int 묵시적 형변환.
arr[2] = 1.5
배열 출력을 편안하게
- Arrays.toString();
특정 위치의 문자열을 가져와라
- String.charAt();
문자열을 문자의 배열로 바꿔줘라
- String.toCharArray();
Char로 된 숫자를 계산하기
- char - '0' 또는 48
- '0' => 48, 'A' => 65, 'a' => 97
- 16*3, 16*4+1, 16*6+1
선언과 생성을 따로 처리할 경우 초기화 주의
int [] arr;
arr = {1,3,5,6,8};
int [] arr = new int {1,3,5,6,8};
for-each 배열 (항상된 for문)
for( int x : intArray){
###
}
- 인덱스는 사용불가.. 필요없을 때 사용.
naturally read only(copied value)
- 인덱스 관리도 안 하고 변경도 안 되기에 빠름.
Array is Immutable
- 배열은 최초 메모리 할당 이후, 변경할 수 없음.
int [] nums = {1,2,3};
nums = new int[] {1,2,3,4};
nums[1] = 100;
- 개별 요소는 다른 값으로 변경이 가능하나, 새로운 요소를 추가하거나 삭제할 수 없음.
배열 추가학습
row-level에서 가져와 써야 알고리즘 개발자.. 바로 가져와야 빠름.
자동완성 소스 형식을 따르면 좋을듯..?
- int[] arr = new int[3]; 등등...
- int arr, arr2[], arr3[][] 이렇게도.
int[] arr = new int[] {1,2,3};
- 배열 중괄호로 선언 시 []안에 배열의 길이 쓰면 안 됨.
int[] arr;
arr = {1,2,3}
OOP, Object Oriented Programming
- 모든 걸 객체로 보는 건 아님. 지향할 뿐.
- primitive, 기본형은 객체로 보지 않음.
int a = 10;
Integer b = 10;
wrapper class
- 8개의 기본 타입에 해당하는 데이터를 객체로 표현하기 위해 포장. 해주는 클래스
- 각각의 타입에 해당하는 데이터를 인수로 전달받아 해당 값을 가지는 객체로 만듬
- 래퍼 클래스는 모두 java.lang 패키지에 포함되어 제공.
- 외부에서 변경할 수 없다.
- 변경하기 위해선 새로운 포장 객체를 만들어야.
- Byte, Short, Integer, Long, Float, Double, Character, Boolean
일반형, 참조형 그려보고 하세요.
System.arraycopy(src, srcPos, dest, destPos, length);
- C.. 아님 c임.
int[] copy = new int[newlength];
Arrays.copyOf(int[] original, int newLength);
int[] arr = {1,2,3};
int[] brr = Arrays.copyOf(arr, arr.length);
자바는 2차원 열의 길이를 다르게 할 수 있지만..
C는 안 된다. 사실 알고리즘에서 다르게 할 필요는 별로 없다.
자바는 다차원 배열시. 메모리가 한 줄로 있는 게 아니라 배열 속에 배열을 가리키는 주소가 있는 것.
int[] [] arr => 오른쪽 부터 읽기. arr은 배열. 그 안에 int[] 배열이 있음.
new int[5][];
if문은 꽤 오래걸림.
ctr + i => 들여쓰기 자동 교정.
새로운 변수 선언시 nx, ny 이런식으로. new? next?
# X 상하좌우의 숫자 더하기, 중복X
int[] dx = {0,0,-1,1};
int[] dy = {-1,1,0,0};
...
int nx= i+dx[d];
int ny= i+dy[d];
...
if(nx<0||nx>=4||ny<0||ny>=4) {
continue;
}
if(arr[nx][ny] == 'X') {
continue;
}
sum+= arr[nx][ny] - '0';
if(arr[nx][ny] != '0') {
arr[nx][ny] = 0;
}
실습 lv1-lv5
git 기준 level 3까지는 해야 따라갈 수 있음.
과제 lv2, lv4 중 하나는 해야..
commit..commit..commit => 좌상단 제출하기.
git bash.
git
- 2.1 ~ 2.5 정도..
- git init
- git status
- git add .
- git commit -m 'message'
프로젝트 만들때 내 아이디 기준. 그룹으로 만들면 지울래도 안 지워짐.
- git config --list
확인. 내 아이디인지.
git config --global user.name "박창준"
git config --global user.email "qmak01@naver.com"
git commit -am 'message'
- add와 commit 한 번에.
git log
- log 띄워 줌.
git checkout ##6자리이상##
- branch, commit 간 이동.
git checkout master
- 맨 마지막 커밋 상태로.
git push
- clone한 놈은 master origin이 저장되있음.
- init한 놈은 뒤에 master origin 붙여야.
과제 때문에 이 ㅈ...
과제 url 복사 => git clone http://### => eclipse로 코드 작성 => git commit -am '#message#' => git push => 과제 제출하기.
보충수업 19-20시
git 사용법, 1차원 배열, 2차원 배열
import 잘 하시오.
git init
- .git 레파지토리 생성
git add
- stage에 올림
git commit
- remote에 올림. local에 있는 거 정리.
git pull
git push
-
int[] ia = new int[3];
ia[0] =10;
ia[1] =11;
ia[2] =12;
ia[3] =13;
System.out.println(Arrays.toString(ia));
System.out.println(ia.length);
for(int i=0;i<ia.length;i++) {
System.out.println(ia[i]);
}
for(int a:ia) System.out.println(a);
int[] ia = {1,2,3};
int[] ia = new int[]{1,2,3};
int[] ia
ia = {1,2,3};
System.out.println(Arrays.deepToString(ia));
for(int[] a:ia) {
System.out.println(Arrays.toString(ia));
}