7. 17

바르고·2023년 7월 17일
0

자바 기본


변수, Variable
 - 자료를 저장하기 위한 메모리 공간으로 타입에 따라 크기가 달라짐.
 - 메모리 공간에 값을 할당 후 사용.
 
타입이란
 - 기본형, primitive type
   미리 정해진 크기의 데이터 표현.
   변수 자체에 값 저장
 - 참조형, reference type
   크기가 미리 정해질 수 없는 데이터의 표현
   변수에는 실제 값을 참조할 수 있는 주소만 저장.
   
 논리형 boolean
 정수형 byte, short, int(기본형), long
 실수형 float, double(기본형)
 문자형 char
 
  - byte는 왜 2^7까지만 표현?
    맨 앞 비트는 부호비트, sign bit 라서
 
 int는 약 20long 뒤에는 l, L 을 써야함.
 float 뒤에는 f를 써야함.
 floatdouble의 차이는 정밀도.
 
 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
 - 자료 손실이 걱정 없으므로 형변환 연산 생략
 - charshort는 호환 안 됨. 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' // 65
 - char => int 묵시적 형변환.
arr[2] = 1.5 // double 할당 불가.

배열 출력을 편안하게
 - 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}; // OK

for-each 배열 (항상된 for)
for( int x : intArray){
	###
}
 - 인덱스는 사용불가.. 필요없을 때 사용.

naturally read only(copied value)
 - 인덱스 관리도 안 하고 변경도 안 되기에 빠름.

Array is Immutable
 - 배열은 최초 메모리 할당 이후, 변경할 수 없음.
int [] nums = {1,2,3}; // garbage... 자바는 garbage collector가 알아서 삭제.
nums = new int[] {1,2,3,4}; // 새로운 배열이 다른 메모리 공간에 생성. nums는 주소변경.
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} // X, 앞에 new int[] 빼먹으면 안 됨.

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][]; // OK, 뒤에 할당해도 됨. 이래서 행마다 열의 길이를 다르게 할 수 있음.

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]; // new x
int ny= i+dy[d]; // new y
...	
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; // 한 번 더한 숫자는 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; // ArrayIndexOutOfBoundsException 
		
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}; // OK
int[] ia =  new int[]{1,2,3}; // OK
		
int[] ia
ia = {1,2,3}; // ERROR
		
		
System.out.println(Arrays.deepToString(ia));

for(int[] a:ia) {
	System.out.println(Arrays.toString(ia));
}




profile
바르고의 다락방

0개의 댓글