gradle compileJava
.Jar
Garbage
Dangling pointer
명시적, 암시적 형변환
산술연산자의 기준은 int
부동소수점 비교연산
논리연산자
증감연산자
1교시
gradle compileJava
(task)
gradle을 통해서 자바 컴파일 시키기
java 실행
.jar 설명
*.jar : java archive *.war : web archive *.ear : enterprise archive (기업용) JAR zip 형식으로 class, xml, properties,json,jpg,png,gif 포함하고 있다. |
위와 같이 함수 입력하면
JVM stack 에 method의 로컬 변수를 준비 // no, no2 => 배열의 레퍼런스(인스턴스의 주소 저장)
heap: new 명령으로 만드는 변수 준비 //[5]=> 배열의 인스턴스
2교시
Garbage
int [] no = new int[5];
no = new in[3]
$ JVM stack
no 이름의 배열 준비
$ Heap
no 이름의 5개 인스턴스에서 3개로 변경됨
기존 [5] : 가비지 (인스턴스 주소를 잃어버려 접근할 수 없음. 메모리 낭비)
가비지는 누가 언제 해제시키는가 !?
A: JVM 보조 프로세스인 "가비지 콜렉터"가 해제시킨다.
-Heap 메모리가 부족할 때, JVM이 한가할 때 동작한다.
Dangling pointer
#C언어
int * P = (int*)malloc(12)
P[0] = 100; (*P=100;)
p[1] = 200; (*(P+1)=200;
free(P); //강제 해제
무효한 주소를 갖고 있는 포인터를 danling pointer라고 부른다.
3교시
1.8234534564567568E17
'e17'은 지수 표기법에서 사용되는 지수 부분을 나타냅니다. 'e'는 10의 지수를 의미하며, 뒤에 오는 숫자는 10의 몇 제곱을 의미합니다. 따라서, 'e17'은 10의 17제곱을 의미합니다.예를 들어, 주어진 숫자인 1.8234534564567568E17은 1.8234534564567568 곱하기 10의 17제곱을 의미합니다. 이는 매우 큰 숫자를 표현하는 간편한 방법입니다.
Wrapper class :
premitive 타입의 값을 더 정교하게 다를 수 있는 도구함(class = function 묶음(메서드 묶음))
byte -> java.lang.Byte short -> java.lang.Short int -> java.lang.Integer long -> java.lang.Long char -> java.lang.Charactor float -> java.lang.Float double -> java.lang.Double boolean -> java.lang.Boolean |
wrapper class 사용: 클래스명(값) |
리터럴의 연산 결과와 값 할당
-> 리터럴의 경우 변수 크기에 상관없이 값을 온전히 저장할 수 있으면 언제든 가능
*리터럴
1. 리터럴 & 리터럴 = 리터럴
2. 변수 & 리터럴 = 리터럴(x)
0930 명시적 형변환
// "명시적 형변환(explicit type conversion = explicit type casting)"?
// - 컴파일러에게 강제로 값을 넣을 것을 명령하는 것.
//
// float ==> int
float f = 3.14f;
int i = (int)f; // 소수점 이하가 제거된다.
System.out.println(i);
// double ==> long
double d = 9876.56789;
long l = (long)d; // 소수점 이하가 제거된다.
System.out.println(l);
명시적 형변환 : 큰 정수 변수의 값을 작은 정수 변수에 저장
=> 앞 쪽 바이트의 값이 짤려서 들어간다.
암시적 형변환 (정수 -> 부동소수점)
int i = 5;
int j = 2;
float r = i/j
r = i / float j;
암시적/명시적
i = 5.0, j = 2.0
자바 산술연산자의 기준은 int
연산은 4byte(int) 기준으로 이루어지기 때문에 연산 후 4byte보다 작은 byte(1바이트), short(2바이트)에 넣을 수 없기 때문에 컴파일 오류// 컴파일러는 문장 자체가 옳은지 그른지만 확인해서 컴파일 해주기때문에 변수 값에 머가 들었는지 안 따지고 안 중요함. 문장이 옳아야 기계어로 바꿔줌 .
예외: 리터럴일 경우 변수 크기에 상관없이 값을 온전히 저장할 수 있다면 가능
byte x = 5, y = 6, z;
z = x; // OK!
z = y; // OK!
// z = x + y; // 컴파일 오류!
short s1 = 5;
short s2 = 6;
short s3;
s3 = s1; // OK!
s3 = s2; // OK!
// s3 = s1 + s2; // 컴파일 오류!
float에서 double로 형변환 하지말고
그냥 쌩으로 바꾸기 . 애초에 첨부터 DOUBLE롤 쓰기. 몸무게 시력 키 같은 더하기배기 필요없는 숫자는 FLOAT 쓰기
오후 수업 1교시
부동소수점 비교 연산
소수점 숫자에 따라 연산이 되는 경우가 있고 안 되는 경우가 있음.. (결과 뒤에 극소수값이 붙어버려서)
극소수 값을 지정해서 뺀 값이 그보다 작으면 TRUE로 봄
// 소수점 뒤에 붙은 극소수의 값을 무시하면 된다.
// => JVM이 자동으로 처리하지 않는다.
// => 다음과 같이 개발자가 직접 처리해야 한다.
double EPSILON = 0.00001;
System.out.println(Math.abs((d1 + d2) - (x + y)) < EPSILON);
Math.abs(양수를 넣든 음수를 넣든) => 결과값:양수
논리연산자는 숫자 못 취급 (&,&&,|,||,^)
논리연산자 => 비트연산자 취급함
System.out.println(a & b);
// a = 0000 0000 0000 0000 0000 0000 0110 1100
// b = 0000 0000 0000 0000 0000 0000 0101 0101
// --------------------------------------------
// 0000 0000 0000 0000 0000 0000 0100 0100 = 68
System.out.println(a | b);
// a = 0000 0000 0000 0000 0000 0000 0110 1100
// b = 0000 0000 0000 0000 0000 0000 0101 0101
// --------------------------------------------
// 0000 0000 0000 0000 0000 0000 0111 1101 = 125
System.out.println(a ^ b);
// a = 0000 0000 0000 0000 0000 0000 0110 1100
// b = 0000 0000 0000 0000 0000 0000 0101 0101
// --------------------------------------------
// 0000 0000 0000 0000 0000 0000 0011 1001 = 57
// 비트 연산에서 not은 ! 연산자가 아니라 ~ 연산자 이다.
System.out.println(~a);
// a = 0000 0000 0000 0000 0000 0000 0110 1100
// --------------------------------------------
// 1111 1111 1111 1111 1111 1111 1001 0011 = -109
논리 연산자 : && vs &, || vs |
&& 연산의 오른쪽을 실행하기 전에 결과를 알 수 있다면 JVM은 실행의 효율을 위해 && 연산의 오른쪽을 실행하지 않음
& 연산자의 경우 왼쪽 값으로 결과를 예측할 수 있다 하더라도, 결과에 상관없이 & 오른쪽 문장을 무조건 실행함
&&, ||, ! 의 피연산자(operand)는 반드시 boolean 이어야 한다.
그리고 계산 결과는 boolean이다.
0351
System.out.println(57 % 4);
System.out.println(57 & 0b11);
나누기 대신 나머지 값을 &연산해서 나머지 값 구할 수 있음
4로 나누니까 나머지 3까지니까 0b11
짝수로 나누는 값밖에 추출할 수 없음.
x & 0x1 = 0 (짝수), 1 (홀수) ???????
x % 2 = 0(짝수), 1(홀수)
// % 연산자를 이용하여 짝수/홀수 알아내기
System.out.println(57 % 2 == 0 ? "짝수" : "홀수");
// & 연산자를 이용하여 짝수/홀수 알아내기
System.out.println((57 & 0x1) == 0 ? "짝수" : "홀수");
& | 연산 활용
비트 연산자 & 활용: 특정 값을 차단하고 특정 값만 통과시킬 때
=> 특정 비트의 값만 추출하고 싶을 때 사용할 수 있다.
# 비트 연산자 & 활용: 그림의 한 픽셀에서 빨강 색을 제거하고 싶다.
int pixel = 0x003f4478; // 각 바이트의 값이 '00RRGGBB' 이라 가정하다.
System.out.println(pixel & 0x0000ffff);
// pixel = 00000000_00111111_01000100_01111000
// & 00000000_00000000_11111111_11111111
// 00000000_00000000_01000100_01111000
# 비트 연산자 | 활용: 픽셀에서 파란색의 값을 강화시키고 싶다.
int pixel = 0x003f4478; // 각 바이트의 값이 '00RRGGBB' 이라 가정하다.
System.out.println(pixel | 0x00000057);
// pixel = 00000000_00111111_01000100_01111000
// | 00000000_00000000_00000000_01010111
// 00000000_00111111_01000100_01111111
강화: or 연산
약화: & 연산
오후수업 2교시
비트이동
비트이동
System.out.println(i << 1);
// 0[0000000000000000000000000000001 ]
// [00000000000000000000000000000010] = 2
System.out.println(i << 2);
// 00[000000000000000000000000000001 ]
// [00000000000000000000000000000100] = 4
1비트 이동은 곱하기 2 한 것과 같은 효과를 준다. 실무에서 많이 사용
비트 이동 => '2**이동비트'를 곱한 것과 같은 결과를 만든다. (x * 2의 n승) =(x << n)
i = 11; // [00000000000000000000000000001011]
System.out.println(i << 1); // 0[00000000000000000000000000010110] => 22
System.out.println(i << 2); // 00[00000000000000000000000000101100] => 44
System.out.println(i << 3); // 000[00000000000000000000000001011000] => 88
속도가 빠름
x >> n = (x / 2의 n승)
>>, <<
양수일 땐 빈 곳에 0, 음수일 땐 빈 곳에 1 채우기
>>>, <<<
음수여도 빈 곳에 0 채우기
아나그램.. 단어의 철자를 재배열해서 다른 단어로 만들어내는것
오후수업 3교시
증감연산자
int i = 100; i = i +1 ; i += 1 ; ==>컴파일// i = i +1 i ++ ; ==>컴파일// i = i +1 |
||
int a = 100; System.out.println(a); a=a+1; |
= | System.out.println(a++); |
후위연산자 컴파일하면 이루어지는 과정 |
int temp = i ; i = i + 1; System.out.println(temp); |
|
상위연산자 컴파일하면 이루어지는 과정 |
System.out.println(++b) b+=1; System.out.println(b) |
리터럴에 적용할 수 없고, 변수에 동시에 적용할 수도 없다.
// int x = ++100; // 컴파일 오류!
// x = 100++; // 컴파일 오류!
// ++y++; // 컴파일 오류!
// (++y)++; // 컴파일 오류!
'[네이버클라우드] 클라우드 기반의 개발자 과정 7기 > 웹프로그래밍' 카테고리의 다른 글
[NC7기-28일차(6월2일)] - 웹프로그래밍 9일차 (0) | 2023.06.02 |
---|---|
[NC7기-27일차(6월1일)] - 웹프로그래밍 8일차 (0) | 2023.06.01 |
[NC7기-25일차(5월30일)] - 웹프로그래밍 6일차 (0) | 2023.05.30 |
[NC7기-24일차(5월26일)] - 웹프로그래밍 5일차 (0) | 2023.05.26 |
충격적인 숫자 리터럴 (0) | 2023.05.25 |