。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

[네이버클라우드] 클라우드 기반의 개발자 과정 7기/웹프로그래밍

[NC7기-26일차(5월31일)] - 웹프로그래밍 7일차

quarrrter 2023. 5. 31. 19:56

gradle compileJava

.Jar

Garbage

Dangling pointer

명시적, 암시적  형변환

산술연산자의 기준은 int 

부동소수점 비교연산

논리연산자

증감연산자

 


 

1교시

gradle compileJava

           (task)
gradle을 통해서 자바 컴파일 시키기 

java 실행

build 폴더 생성되고 그 안에 class 생성됨

  

 

gralde build task - java plugin 과정

.jar 설명

*.jar : java archive
*.war : web archive
*.ear : enterprise archive (기업용)

JAR
zip 형식으로 class, xml, properties,json,jpg,png,gif 포함하고 있다.

 

no = no2

위와 같이 함수 입력하면 

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)++; // 컴파일 오류!