TIL/Java

[SIST] Java_days03

야리니 2022. 2. 17. 21:39
728x90
반응형

1. 실수의 진법 변환

1) 3.625를 2진수로 변환하기

    정수를 제외하고 실수만 2로 곱하여 실수가 0이 될 때까지 반복

    0.625 * 2 = 1.25

    0.25 * 2 = 0.5

    0.5 * 2 = 1.0

    계산하여 나온 정수의 값을 순서대로 나열하면 0.625의 2진수 값은 101이 나온다.

    3의 2진수 값은 11이므로 즉, 3.625는 11.101이다.

    다시 10진수로 변환하려면 1*2^-1(2의 마이너스 1승) + 1*2^-2 + 1*2^-3으로 계산하면 된다.

 

  ☞ 참고

   여기서 짚고 넘어가야할 점은 소수값이 0이 나오지 않으면 무한으로 값이 나오게 된다.

   float와 double 모두 오차가 있는 자료형이지만, double이 float보다 2배 정도 정밀하여 '배정도 정밀도'라고 한다.

   double이 더 정밀하게 표현할 수 있는 이유는 값을 저장하는 형식이 다르기 때문이다.

    - float  1(S)  8(E지수) 23(M가수)

    - double 1(S) 11(E지수) 52(M가수)

       ex) 10진수 예 - 지수/가수

       1234.5678 * 10^3 = 1.2345678

         > 10의 n승에 따라서 같은 위치에 소수점을 줄 수 있음 > 부동소수점 표기(소수점의 위치가 바뀌지 x)

         ^3 > E3으로 바꾸면 1.2345678E3 > E 뒤에 있는 3 : 지수, E 앞에 있는 1.2345678 : 가수

 

2. 실수의 자료형

실수의 자료형은 float와  double 2가지가 있다.

실수의 기본 자료형 : double

double을 사용할 때는 접미사를 사용하지 않지만, float을 사용할 때는 접미사 F 또는 f를 붙여야 사용이 가능하다.

float 자료형을 가진 변수에 접미사를 붙이지 않으면 Type mismatch: cannot convert from double to float라는 에러메시지가 나타난다.

ex)

float height;

// 에러메시지 : Type mismatch: cannot convert from double to float
// 해석 : 타입 불일치, double타입을 float타입으로 형변환할 수 없다.
// float   double  > 같은 실수를 나타내지만 자료형이 다름
// height = 175.3; //접미사 f를 붙이자

height = 175.3f;
System.out.println(height);

 

☞ 참고

  - 정수의 기본 자료형 : int

  - long의 접미사 : L 또는 l

  - byte와 short는 접미사 X

 

3. 형(Data Type)변환

1) 자동 형변환 2가지

   ㄱ. 작은 자료형의 값을 큰 자료형에 대입할 때 자동형변환이 된다.

   ㄴ. 작은 자료형 연산(+, -, / 등) 큰 자료형 -> 결과값은 큰 자료형으로 자동형변환이 된다.

2) 강제 형변환 

 

   ex1) 자동 형변환이 되는 첫 번째 경우

int i = 100;   // 4byte
long j = 10L;  // 8byte
		
long j = int i; // 자동형변환 : 우측에 있는 자료형이 좌측에 있는 자료형보다 크기가 작기 때문에 자동으로 형변환이 된다.
j = i;

 

   ex2) 자동 형변환이 되는 두 번째 경우

int a = 100;
long b = 100; // 자동 형변환되는 1) 경우가 적용 > l을 안붙인 100은 int이고 자동으로 long으로 형변환 됨
long c = b + a; // long b + int a
System.out.println(c); // long으로 자동 형변환되어 결과 : 200 출력

 

   ex3) 강제 형변환이 되는 경우

int total = 152;
// double avg = total / 3; > 계산기 값 : 50.666667
//              int형 / int형 = int형 이므로, 결과가 50이 되고 이 값이 double로 출력되어 50.0으로 나옴
// 이런 경우 개발자가 강제로 int -> double로 형 변환 필요
double avg = (double)total / 3;
// () cast 연산자 > ()안에는 변환하고자 하는 타입(data type)을 넣음
// double / int => double

System.out.printf("총점:%d, 평균:%f\n", total, avg);
// 결과 값
// 총점:152, 평균:50.666667

   

 ☞ 참고

    ( ) : cast 연산자 > ( )안에는 변환하고자 하는 타입(data type)을 넣음

 

3) byte끼리 연산했는데 int가 나오는 이유

   - 이유 : int보다 작은 자료형은 CPU로 연산할 때 처리단위 기본이 int이기 때문에 int로 처리

             short + int -> int

             short + short -> int

             byte + byte - > int 

   ex)

byte kor, eng, mat;
short total;
double avg;

kor = 35;
eng = 44;
mat = 72;

// total은 short이기 때문에 int인 kor, eng, mat을 강제 형변환
total = (short)(kor + eng + mat);

//            short / int -> int : 소수점이 안나오기 때문에 강제 형변환 필요
avg = (double)total / 3;

System.out.printf("국어:%d\n영어:%d\n수학:%d\n총점:%d, 평균:%f\n", kor, eng, mat, total, avg);
// 결과
// 국어:35
// 영어:44
// 수학:72
// 총점:151, 평균:50.333333

 

  만약 total = kor + eng + mat; 이렇게 코드를 작성하면 에러가 발생하게 된다.

  에러메시지 : Type mismatch: cannot convert from int to short

  해석 : int타입을 short타입으로 형변환 할 수 없다.

 

4. 상수(constant)와 리터럴(literal)

1) 상수(constant)?

    고정된 수 + 저장공간 <-> 변수(메모리상의 저장공간)  ex)PI(원주률값)

    상수는 final을 사용!

2) 리터럴(literal)?

   고정된 수 > 3.14(실수 리터럴), 'A'(문자 리터럴), 10(정수 리터럴), true(불린 리터럴) 등등 > 값자체

ex)

PI 상수 > PI는 상수, 3.141592는 리터럴이라고 한다

int r = 12; // 원의 반지름
		
// PI 상수 > PI는 상수, 3.141592는 리터럴

final double PI = 3.141592;

// 에러메시지 : The final local variable PI cannot be assigned. It must be blank and not using a compound assignment
// 해석 : 지역변수 PI는 final로 선언했기 때문에 값을 바꿀 수 없다. 만약 정말 값을 바꾸고 싶으면 final을 지워라
// PI = 3.142592;

 

만약, 상수에 다른 값을 할당하려고 하면 에러가 발생하게된다.

에러메시지 : The final local variable PI cannot be assigned. It must be blank and not using a compound assignment

해석 : 지역변수 PI는 final로 선언했기 때문에 값을 바꿀 수 없다. 만약 정말 값을 바꾸고 싶으면 final을 지워라

 

☞ 참고

   - 상수를 선언 할때
     1) 대문자로 선언하는 것을 권장
     2) 상수명이 만약 first name처럼 단어+단어라면, FIRST_NAME _(언더바)를 사용하여 구분

 

5. 표준입력

표준입력과 관련하여 아직 정확한 문법 설명이나 scanner를 배우지 않아 아래 코딩은 암기하라고 하셨다.

 

- 표준 입력장치(키보드)로부터 입력받아 출력

 

- 자바 언어는 모든 입력, 출력(Input/Output == IO)은 스트림(Stream)

 

- 스트림(Stream) 2가지 종류

  ㄱ. 텍스트(문자) 스트림

  ㄴ. 바이트(0/1) 스트림

 

- System.in > 입력스트림 > 바이트스트림

 

- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

> br 변수를 통해서 읽기 작업을 하면 키보드로부터 입력한 값을 읽을 수 있다.

[주의] > import문이 있어야 된다.

           import java.io.BufferedReader; 

           import java.io.InputStreamReader;

          + 필요한 모든 import 구문 자동 완성 단축키 : Ctrl + Shift + O
             두 개의 패키지 안에 있으면 대화상자가 띄워져서 선택하라고 하기도 함

 

- InputStreamReader > 바이트스트림을 문자스트림으로 변환하는 클래스객체

 

- 처리 되는 방식

   1) [키보드]  -> A B

   2) System.in 입력스트림  -> 0100 0001

   3) InputStreamReader 클래스(바이트스트림으로 변환)  -> 'A''B'

   4) BufferedReader 클래스(문자열로 변환) -> "AB"

- readLine(); > read(읽기) + Line(한 줄) > 입력한 한 줄을 다 읽겠다.

  readLine(); 을 실행하면 블러킹이 된다. 입력하지 않아서 막혔다고 생각하면 된다.

  readLine()의 리턴자료형이 String이기 때문에 String 자료형을 가지고 있는 name 변수를 사용

  여기서 확인해야될 것은 name = br.readLine(); 코드를 작성하면 에러가 발생한다.

   에러메시지 : Unhandled exception type IOException

   해석 : 처리되지 않았다. IOException(IO예외)를 처리되지 않았다.

  우리는 아직 예외를 배우지 않아서 에러가 나는 부분에 커서를 올려 클릭한 후 Add throws declaration를 선택하여

  에러를 해결하는 방식을 암기하라고 하셨다.

 

위에서 정리한 것을 코드로 작성한 내용은 다음과 같다.

 

여기서 조금 더 심화과정을 코딩하면 다음과 같다.

위에서 확인해야할 부분은 Byte.parseByte이다.

byte를 String으로 형변환을 하고 싶은데 앞에서 배운 강제형변환으로도 실행이 되지 않고, kor = br.readLine(); 이라고 코드를 작성하면 에러가 발생한다.

 에러메시지 : Type mismatch: cannot convert from String to byte

 문제 원인/해걸 : String "90" -> byte 형변환

 

이 문제를 해결하기 위해 사용한 것이 Byte.parseByte이다.

즉, Byte.parseByte("문자열")을 입력하면 문자열을 byte로 변환을 해준다.

 ex) String("90")   -> byte      >  Byte.parseByte("90");

      String("90")   -> int        >  Integer.parseInt("90");

      String("90")   -> double  >  Double.parseDouble("90");

 

6. 래퍼(Wrapper) 클래스

- 래퍼(Wrapper) 클래스란? 기본형을 사용하기 쉽도록 기능(메소드, 필드)을 구현해 놓은 클래스이다.

   

   int가 표현할 수 있는 최대의 값은 2147483647이고, byte가 표현할 수 있는 최대의 값은 127이다.

   기본형 int -> Integer 클래스, 기본형 byte -> Byte 클래스

int i = Integer.MAX_VALUE;
System.out.println(i);
// 결과 값 : 2147483647

byte b = Byte.MAX_VALUE;
System.out.println(b);
// 결과 값 : 127

 

- 기본형    -> 래퍼클래스(Wrapper)      래퍼클래스.parse자료형 ex) xxxx.parsexxx("90");
// char      -> Character                
// byte      -> Byte                             Byte.parseByte("90");
// short     -> Short                    
// int        -> Integer                          Integer.parseInt("90");
// long      -> Long                            Long.parseLong("90");
// float      -> Float                            Float.parseFloat("90");
// double   -> Double                         Double.parseDouble("90");
// boolean  -> Boolean  

☞ 참고

- ( ) cast 연산자는 같은 숫자형일때만 형변환 가능

   ex) double -> int, int -> double 가능

        ㄴ 클래스들간의 형변환할 때도 사용한다. (UpCasting/DownCasting  > 클래스 배울 때 상세히 배울 예정)

 

7. 연산자(operator)

1) 연산자(operator) 정의?   연산을 수행하는 기호   > + ; , () {} 등등

2) 덧셈 연산자 > 3 + 5

    피연산자(operand)? 연산자의 작업 대상(변수, 상수, 리터럴, 수식)

3) 연산자의 종류

            [기능]
      ㄱ. 산술 연산자 : + - * / %     
      ㄴ. 비교 연산자                  
      ㄷ. 논리 연산자
            1) 일반논리 연산자 : !  && ||
            2) 비트논리 연산자 : ~  &  |  ^
      ㄹ. 대입 연산자
      ㅁ. 기타 연산자
      ㅂ. 쉬프트 연산자 : >>  << >>>

     [피연산자의 갯수]
      ㄱ. 단항 연산자
      ㄴ. 이항 연산자
      ㄷ. 삼항 연산자

 

7-1. 산술연산자 설명

int x = 3;

System.out.println(x + 5);   > 덧셈 연산자

System.out.println(x - 5);   > 뺄셈 연산자

System.out.println(x * 5);   > 곱셈 연산자

System.out.println(x / 5);   > 나눗셈 연산자

System.out.println(x % 5);   > 나머지를 구하는 연산자

 

[주의]

System.out.println(x / 5);

x의 자료형은 int, 5의 자료형은 int이므로, int/int => int라 결과값도 int인 0이 나온다.

 

[정수와 실수 관련한 주의사항]

 1) System.out.println(x / 0);   > 런타임(실행) 오류 발생

    에러메시지 : java.lang.ArithmeticException: / by zero

    해석 : 산술적예외(오류,에러) > 0으로 나누고자 해서 오류 발생

 

 2) System.out.println(x % 0);   > 런타임(실행) 오류 발생

    에러메시지 : java.lang.ArithmeticException: / by zero

    해석 : 산술적예외(오류,에러) > 0으로 나누고자 해서 오류 발생

 

 3) System.out.println(3.14 / 0);  > 실수 / 0 => Infinity 무한대 리터럴

 

 4) System.out.println(3.14 % 0); >  실수 % 0 => NaN 리터럴(Not a Number == 숫자가 아니다) > 값자체

 

7-2. 비교연산자 설명

- 비교연산자에는 >  <  >=  <=  ==(같다)  !=(다르다)  6가지가 있다.

- 결과는 true/false 논리형만 가질 수 있다.

   ex) 

    System.out.println(3 > 5); // false
    System.out.println(3 < 5); // true
    System.out.println(3 >= 5); // false
    System.out.println(3 <= 5); // true

 

 [주의]

 1) 같다라는 비교 연산자는 == (= 2개!)
     ex) int x = 3;
           System.out.println(x = 5);   > 결과는 5가 나옴

           System.out.println(3 == 5); // false


 2) =!은 !=와 완전히 다른 의미이다.
     ex) System.out.println(3 != 5); // true

 

7-3. 논리연산자 설명

논리연산자는 1) 일반논리연산자와 2) 비트논리연사자로 나눌 수 있다.

1) 일반논리연산자 : &&  ||  !

2) 비트논리연산자 : ~  &  |  ^

오늘은 일반논리연산자에 대해서만 공부했기에 일반논리연산자만 정리하도록 하겠다.

 

+ 참(true)을 1로 생각해서 계산하면 아래 논리곱과 논리합을 이해하기 쉽다.

ㄱ. && : 일반 논리 AND 연산자(논리곱)

           true && true -> true      피연산자 모두 true 일때만 true이다.
           true && false -> false
           false && ture -> false
           false && false -> false

ㄴ. || :일반 논리 OR 연산자(논리합)

           true && true -> true      피연산자 중에 하나만 true이면 true이다.
           true && false -> true 
           false && true -> true 
           false && false -> false   

ㄷ. ! : 부정연산자 == not연산자(비트논리연산자에 없어서 일반논리 안붙여도됨)

           참(true)을 부정하면 거짓(false)이 되고, 거짓(false)을 부정하면 참(true)가 된다.
           !true -> false
           !false -> true
           !!!false -> true

 

☞ 참고

System.out.println(!5 > 3); 

위의 코드는 에러가 발생한다.

에러메시지 : The operator ! is undefined for the argument type(s) int

해석 : not(!)이라는 부정연산자는 int타입에는 사용할 수 없다. > 부정연산자는 true/false 값만 올 수 있음

즉, 비교연산자보다 부정(!)연산자가 우선순위가 높아서 ! 뒤에 피연산자가 5 int 정수값이 왔다.

System.out.println(!(5 > 3)); 와 같이 () 연사자를 사용해여 에러를 해결할 수 있다.

 

728x90
반응형