----------- 전날 관련 내용 복습 -----------
정수형 타입은 이진수 방식으로 값이 저장
실수형 타입은 가수,지수 방식으로 값이 저장
--> int(4byte) 타입보다 float(4byte) 타입이 훨씬 더 큰 값을 표현 가능하다.


2.7 자동 타입 변환

값의 허용 범위가 작은 타입허용 범위가 큰 타입으로 대입될 때 발생

byte < short, char < int < long < float < double

 

예시)

byte byteValue = 10;
int intValue = byteValue;

→ byteValue가 int 타입으로 자동 형 변환되어 대입된다.

 

※ 정수 타입이 실수 타입으로 대입될 경우에는 무조건 자동 타입 변환이 된다.

(실수 타입은 정수 타입보다 허용 범위가 더 크기 때문 → 저번시간에 말한 저장방식의 차이 때문)

 

예시)

long longValue = 5000000000L;
float floatValue = longValue;	// 5.0E9f 로 저장됨
double doubleValue = longValue;	// 5.0E9 로 저장됨

 

 

char 타입의 경우 int 타입으로 자동 변환되면 유니코드 값이 int 타입에 대입된다.

char charValue = 'A';
int intValue = charValue; 	// 65가 저장됨

 

예외) char 타입보다 허용 범위가 작은 byte 타입은 char 타입으로 자동 변환 될 수 없다.

char 타입의 허용 범위는 음수를 포함하지 않는데, byte 타입은 음수를 포함하기 때문

 

 

2.8 강제 타입 변환 (Casting)

큰 허용 범위 타입작은 허용 범위 타입으로 자동 타입 변환될 수 없다.

 

강제 타입 변환 : 작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입

int intValue = 10;
byte byteValue = (byte) intValue;	// 강제 타입 변환

 

강제 타입 변환의 목적은 원래 값이 유지되면서 타입만 바꾸는 것.

따라서 작은 허용 범위 타입에 저장될 수 있는 값을 가지고 강제 타입 변환을 해야 한다.

int intValue = 130;
byte byteValue = (byte) intValue;

이렇게 되면 byte의 값의 허용 범위는 -128 ~ +127 까지이기 때문에 130의 값을 온전히 보존하여 저장할 수 없다.

따라서 사용시 유의해주어야 한다.

 

2.9 연산식에서 자동 타입 변환

자바는 실행 성능을 향상시키기 위해 컴파일 단계에서 연산을 수행한다.

byte result = 10 + 30;	// 텍스트 에디터의 소스 코드

byte result = 40;	// 컴파일 단계에서 이렇게 인식

 

byte x = 10;
byte y = 20;
byte result = x + y;  // 컴파일 에러

컴파일러는 정수를 기본적으로 int로 인식하고 연산하기 때문에 byte 변수 + byte 변수의 값이 int 형으로 자동 변환되어 연산을 수행하기 때문에 연산의 결과값을 받는 변수의 타입은 int형이어야 한다.

byte x = 10;
byte y = 20;
int result = x + y;	 // int 타입으로 받아야 함

 

추가 예시)

int x = 10;
int y = 20;
int result = x + y;

위의 코드는 x와 y가 자동 형 변환이 일어나지 않고 연산되어 result값에 들어가게 된다.

메모리는 더 잡아먹지만 자동 형 변환 과정이 일어나지 않기 때문에 연산 속도는 더 빠르다.

따라서 특별한 이유가 없다면 정수 연산에서 int 타입으로 변수를 선언하자!

 

실수형도 마찬가지이다.

컴파일러는 실수를 기본적으로 double로 인식하고 연산하기 때문에 float 변수 + float 변수의 값이 double 형으로 자동 변환되어 연산을 수행한다. 이 경우에도 연산속도에 차이가 있다.

따라서 특별한 이유가 없다면 실수 연산에서 double 타입으로 변수를 선언하자!

 

 

2.10 문자열을 기본 타입으로 변환

프로그램에서 문자열을 숫자 타입으로 변환하는 경우가 매우 많다.

 

문자열을 기본 타입으로 변환하는 방법

변환 타입 사용 예
String → byte byte value = Byte.parseByte(str);
String → short short value = Short.parseShort(str);
String → int int value = Integer.parseInt(str);
String → long long value = Long.parseLong(str);
String → float float value = Float.parseFloat(str);
String → double double value = Double.parseDouble(str);
String → boolean boolean value = parseBoolean(str);
반대의 경우
기본 타입 → String String str = String.valueOf(기본타입값);

 

 

 

2.11 변수 사용 범위 (Scope)

중괄호 { } 블록 내에 선언된 변수는 해당 중괄호 { } 블록 내에서만 사용 가능하고

그 중괄호 { } 블록을 벗어나면 사용할 수 없다!

if(true){
	int a = 10;
}
System.out.println(a);	// 컴파일 에러

 

 

2.12 콘솔로 변수값 출력

메소드 의미
println(내용); 괄호 안의 내용을 출력하고 행을 바꿈
print(내용); 괄호 안의 내용을 출력하고 행은 바꾸지 않음
printf("형식문자열", 값1, 값2, ... ); 형식 문자열에 맞추어 뒤의 값을 출력

 

※ 형식 문자열

% [값의 순번$]  [좌우 정렬(-,0)]  [전체 자릿수]  [.소수자릿수]  변환 문자(d,f,s 등)

 

예시)

System.out.printf("%6d | %-10s | %10s\n", 1, name, job);

 

 

2.13 키보드 입력 데이터를 변수에 저장

import java.util.Scanner;

// main 메소드 안에서
Scanner scan = new Scanner(System.in); // Scanner 타입의 변수 scan에 Scanner 객체를 생성하여 대입

String str = scan.nextLine(); // str 변수에 키보드로 입력받은 문자열을 저장

 

Scanner의 nextLine() 메소드는 사용자가 입력한 내용을 String(문자열) 타입으로 저장하게 해준다.

엔터를 치기전까지의 문자열을 str 변수에 저장한다.

 

추가 정보)

자바는 기본 타입 8가지의 값이 동일한지 비교할 때는 "==" 연산자를 이용.

String 타입 값이 동일한지 비교할 때는 equals() 메소드를 이용한다.

int x = 10;
int y = 10;
System.out.println(x == y);	// 결과값으로 true를 반환

String str1 = "홍길동";
String str2 = "홍길동";
System.out.println(str1.equals(str2));	// 결과값으로 true를 반환

 

 


 

 

3장 연산자

 

3.1 부호/증감 연산자

우리가 아는 +, - 연산자. 변수값의 부호를 변경할 때 사용.

byte b = 100;
byte result = -b;	// 컴파일 에러
int result = -b;	// result의 값은 -100

부호를 변경하는 것도 연산.

★ 정수 타입 연산의 결과는 int 타입이라고 배웠다. 따라서 int 타입 변수에 대입해주어야 한다.

 

※ 증감 연산자

연산식 설명
++ 피연산자 피연산자의 값을 1 증가시킴
-- 피연산자 피연산자의 값을 1 감소시킴
피연산자 ++ 다른 연산을 수행한 후 피연산자의 값을 1증가 시킴
피연산자  -- 다른 연산을 수행한 후 피연산자의 값을 1감소시킴
int x = 1;
int y = 1;
int result1 = ++x + 10;		// result1 값은 11, 연산하기 전 x는 2가 됨
int result2 = y++ + 10;		// result2 값은 10, 연산을 한 후 y값은 2가 됨

 

 

3.2 산술 연산자

연산자 설명
+ 덧셈 연산
- 뺄셈 연산
* 곱셈 연산
/ 나눗셈 연산
% 나눗셈의 나머지를 산출하는 연산

 

 

3.3 오버플로우와 언더플로우

● 오버플로우(overflow) : 타입이 허용하는 최대값을 벗어나는 것

● 언더플로우(underflow) : 타입이 허용하는 최소값을 벗어나는 것

 

예를 들어 byte 타입은 -128 ~ +127의 허용범위를 갖는다.

여기서 byte 타입이 +127값에서 +1을 연산하게 된다면 된다면 -128값이 되고,

-128값에서 -1을 연산하게 되면 +127값으로 된다.

따라서 우리는 항상 해당 타입의 범위 내에서 연산이 수행되도록 코딩에 신경써야 한다.

 

 

3.4 정확한 계산은 정수 연산으로

산술 연산을 정확하게 하려면 실수 타입을 사용하지 않는 것이 좋다.

int apple = 1;
double pieceUnit = 0.1;
int number = 7;

double result = apple - number*pieceUnit;
System.out.println(result);

result의 값은 0.3이 나와야 하는데, 0.299999999... 가 나온다.

부동 소수점 방식을 사용하는 실수 타입에서 흔히 일어난다.

따라서 정확한 계산이 필요하다면 정수 연산으로 변경하여 계산해야 한다.

 

 

3.5 나눗셈 연산 후 NaN과 Infinity 처리

5 / 0.0 → Infinity

5 % 0.0 → NaN(Not a Number)

 

Infinity 또는 NaN 상태에서 계속해서 연산을 수행하면 데이터가 엉망이 될 수 있다.

그렇기 때문에 /와 %연산의 결과가 Infinity 또는 NaN인지 먼저 확인해야 한다.

boolean result = Double.isInfinite(변수);
boolean result = Double.isNaN(변수);

 

 

3.6 비교 연산자

연산자 설명
== 값이 같은지 검사
!= 값이 다른지 검사
> 값이 큰지 검사
>= 값이 크거나 같은지 검사
< 값이 작은지 검사
<= 값이 작거나 같은지 검사

※ 문자열(String)을 비교할 때는 equals() 또는 !equals() 메소드를 사용한다.

 

 

3.7 논리 연산자

연산자 설명
&& 또는 & 모두 true일 경우에만 결과가 true
|| 또는 | 하나만 true면 결과는 true
^ 하나는 true이고 다른 하나가 false일 경우에만 결과가 true
! 논리값을 바꾼다

 

 

3.11 삼항(조건) 연산자

조건식 ? 값 or 연산식 : 값 or 연산식

→ 조건식이 true일 경우 콜론(:) 앞의 값이 선택되고, false일 경우 콜론(:) 뒤의 값이 선택되어 반환된다.

 

 

3.12 연산의 방향과 우선순위

기본적으로 곱셈이 더하기보다 먼저 수행하는 것처럼 연산의 우선순위는 수학적 지식과 같다.

먼저 연산하고 싶은 것은 괄호 ()로 묶어 표현하자.

 

 


 

4장 조건문과 반복문

 

4.1 코드 실행 흐름 제어

조건문 반복문
if, switch for, while, do-while

→ 외우려 하지말자. 이해하고 넘어간다.

 

 

4.2 if 문

if ( 조건식1 ) {
	실행문;
    ...
} else if ( 조건식2 ) {
	실행문;
    ...
} else {
	실행문;
    ...
}

조건식1 에 만족하는 경우, 첫번째 if문으로 들어가 코드를 실행하고 나머지는 건너 뛰게 된다.

조건식2 도 마찬가지로 조건식1이 만족하지 않고 조건식2가 만족하는 경우 두번째 if문의 코드를 실행하고 종료한다.

마지막으로 조건식1과 조건식2를 만족하지 않는 경우 else 구문의 코드를 실행하고 종료된다.

'JAVA' 카테고리의 다른 글

14일차 2024 - 3 - 15  (0) 2024.03.14
13일차 2024 - 3 - 14  (0) 2024.03.14
12일차 2024 - 3 - 13  (0) 2024.03.13
2일차 2024 - 2 - 27  (0) 2024.02.28
1일차 2024 - 2 - 26  (0) 2024.02.27

+ Recent posts