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)); 와 같이 () 연사자를 사용해여 에러를 해결할 수 있다.
'TIL > Java' 카테고리의 다른 글
[Java] 대소문자 구별없이 비교하기 : equalsIgnoreCase() (0) | 2022.02.20 |
---|---|
[SIST] Java_days04 (0) | 2022.02.18 |
[SIST] Java_days02 (0) | 2022.02.16 |
[SIST] Java_days01 (0) | 2022.02.15 |
[Java] 복제와 참조 (0) | 2022.02.09 |