자바의 정석_기초편 Chapter 2 中 [10 ~ 17] (230726, 수)
CH2-10 : 기본형과 참조형.
값(data) 는 문자와 숫자로 나뉜다.
문자는 말그대로 'A', '1', 'ABC"
숫자는 정수와 실수로 나뉜다.
정수는 123, 0, -100
실수는 3.14, -3.0x10^8.
값의 종류에 따라 값이 저장될 공간의 크기와 저장 형식을 정의한 것이 자료형(data type)
자료형은 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 등이 있다.
변수 선언 시에는 저장하려는 값의 특성을 고려하여 가장 알맞은 자료형을 변수의 타입으로 선택.
자료형은 기본형과 참조형으로 나뉜다.
기본형 변수는 실제 값(data)을 저장하는 반면, 참조형 변수는 어떤 값이 저장되어 있는 주소(memory address)를 값으로 갖는다. 자바는 모두 기본형 변수이다.
기본형(primitive type) : 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형 (float, double)
이렇게 계산을 위한 실제 값을 저장하며 모두 8개다.
참조형(reference type) : 객체의 주소를 저장. 위 8개의 기본형을 제외한 나머지타입.
CH2-11 : 기본형의 종류와 범위
종류 // 크기 | 1byte | 2byte | 3byte | 4byte |
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int | long |
실수형 | float | double |
기본 자료형의 종류와 크기는 반드시 외워야 한다.
- 참고 -
- boolean 은 true 와 false 두 값만 표현할 수 있으면 되므로 가장 작은 크기인 1 바이트.
- char 은 자바에서 유니코드 를 사용하므로 2 바이트.
- byte 는 크기가 1 바이트라서 byte.
- int (4 byte) 를 기준으로 짧아서 short (2 byte) , 길어서 long (8 byte), (short <-> long)
- float 는 실수값을 부동소수점(floating-poing)방식으로 저장하기 때문에 float
- double 은 float 보다 두 배의 크기 (8 byte)를 갖기 때문에 double.
int 타입의 변수는 대략 10자리 수의 값을 저장할 수 있다는 것을 알아야 하고, 7 ~ 9 자리의 수를 계산할 때는 넉넉하게 long타입(약 19자리)으로 변수를 선언하는 것이 좋다.
CH 2-12 : printf 를 이용한 출력.
화면 출력에 사용해온 println() 은 사용하기 편하지만, 변수의 값을 그대로 출력하므로, 값을 변환하지 않곤 다른 형식으로 출력할 수 없다.
같은 값이라도 다른 형식으로 출력하고 싶을 때, 예를 들어 소수점 둘째자리만 출력 또는 정수를 16진수나 8진수로 출력할 때 printf() 를 사용하면 된다.
'지시자(specifier)' 를 통해 변수의 값을 여러가지 형식으로 변환하여 출력하는 기능을 가지고 있다.
값을 어떻게 출력할 것인지를 지시해주는 역할을 한다.
정수형 변수에 저장된 값을 10진 정수로 출력할 때는 지시자 %d 를 사용하며, 변수의 값을 지정된 형식으로 변환해서 지시자 대신 넣는다.
예로 int 타입의 변수 age의 값이 14일 때, printf() 는 지시자 %d 대신 14를 넣어서 출력한다.
System.out.printf("age:%d",age);
System.out.printf("age:%d",14);
System.out.printf("age:14"); // "age:14" 가 화면에 출력됨
만약 출력하려는 값이 2개라면, 지시자도 2개 사용. 출력될 값과 지시자의 순서는 일치해야한다.
3개 이상의 값도 가능하며 개수의 제한은 없다.
System.out.printf("age:%d year:%d", age, year);
System.out.printf("age:%d year:%d", 14, 2019);
"age:14 year:2019" 이 화면에 출력됨.
printf() 의 지시자 중에서 자주 사용되는 것만 뽑아보면 다음과 같다.
지시자 | 설명 |
%d | 10진(decimal) 정수의 형식으로 출력 |
%x | 16진(hexa-decimal) 정수의 형식으로 출력 |
%f | 부동 소수점(floating-point)의 형식으로 출력 |
%c | 문자(character)로 출력 |
%s | 문자열(string)로 출력 |
CH 2-14 : 화면으로부터 입력받기.
import java.util.Scanner; // Scanner 클래스를 사용하기 위해 추가
Scanner scanner = new Scanner(System.in) // Scanner 클래스의 객체를 생성.
String input = scanner.nextLine(); // 입력받은 내용을 input에 저장
int num = Integer.parseInt(input); // 입력받은 내용을 int타입의 값으로 변환
int num = scanner.nextInt(); // 정수를 입력받아서 변수 num에 저장
먼저 Scanner 클래스의 객체를 생성.
nextLine() 이라는 메소드를 호출하면 입력대기 상태에 있다가 압력을 마치고 '엔터키(enter)' 를 누르면 입력한 내용이 문자열로 반환됨.
만일 입력받은 문자열을 숫자로 변환하려면, Integer.paserInt() 라는 메서드를 이용해야 한다. 이 메소드는 문자열을 int 타입의 정수로 변환.
Scanner 클래스에는 nextInt() 나 nextFloat() 와 같이 변환없이 숫자로 바로 입력 받을 수 있는 메소드들이 있고, 이 메소드들을 사용하면 문자열을 숫자로 변환하는 행동은 안해도 된다.
CH 2-15 : 정수형의 오버플로우
4 bit 2진수의 최대값인 '1111'에 1을 더하면 어떤 결과를 얻을까?? 4 bit의 범위를 넘어서는 값이 되기 때문에 에러가 발생할까?
원래 2진수 '1111'에 1을 더하면 '10000'이 된다, 그러나 4 bit로는 4자리의 2진수만 저장할 수 있기 때문에 '0000'이 된다.
즉, 5자리의 2진수 '10000' 중에서 하위 4bit만 저장하게 되는 것이다.
이처럼 연산과정에서 해당 타입이 표현할 수 있는 값의 범위를 넘어서는 것을 오버플로우(overflow) 라고 한다.
오버플로우가 발생했다해서 에러가 발생하는것은 아님
다만 예상값을 얻지 못한다.
이를 방지하기 위해 충분한 크기의타입을 선택해 사용해야 한다.
오버플로우 : 표현가능한 범위를 넘는 것.
= 최대값 +1 >> 최소값
= 최소값 -1 >> 최대값.
CH 2-16 : 부호있는 정수의 오버플로우.
부호없는 정수(4bit) 의 경우 표현범위가 '0~15' 이므로 이 값이 계속 반복되고, 부호있는 정수(4bit) 의 경우 표현범위가
'-8 ~ 7' 이므로 이 값이 무한 반복된다.
(예제 2-11 참고)
short 타입 : 부호있는 정수. // char 타입 : 부호없는 정수.
short(부호O) : 32767 (최대값), -32768 (최소값)
char(부호X) : 65535 (최대값), 0 (최소값)
16비트로 표현할 수 있는 정수의 갯수 : 2^16개 (65536개)
단, short 와 char 의 표현가능한 정수의 범위는 다르다.
정리: 최소값에서 1을 빼면 최대값, 최대값에서 1을 더하면 최소값이 된다.
CH 2-17 : 타입간의 변환방법
1. 문자와 숫자간의 변환
1) 숫자를 문자로 변환 : 숫자에 '0' 을 더한다.
(char)(3 + '0') => '3'
2) 문자를 숫자로 변환 : 문자에서 '0'을 뺀다.
'3' - '0' => 3
2. 문자열로 변환
1) 숫자를 문자열로 변환 : 숫자에 빈 문자열(" ") 을 더한다.
3 + "" => "3"
2) 문자를 문자열로 변환 : 빈 문자열 ("") 을 더함.
'3' + "" => "3"
3. 문자열을 숫자로 변환
1) 문자열을 문자로 변환 : charAt(0) 을 사용.
"3".charAt(0) => '3'
2) 문자열을 숫자로 변환 : Integer.parseInt() 또는 Double.parseDouble() 을 사용한다.
Integer.parseInt("3") => 3
Double.parseDouble("3.14") => 3.14
class Ex2_12 {
public static void main(String args[]) {
String str = "3" ;
System.out.println(str.charAt(0) - '0');
System.out.println('3' - '0' + 1);
System.out.println(Integer.parseInt("3") + 1);
System.out.println("3" + 1);
System.out.println((char)(3 + '0')); // '0' 은 숫자로 48이다.
}
// 결과
// 3
// 4
// 4
// 31
// 3
230726 학습
'진행중인 학습 > 자바의 정석_학습' 카테고리의 다른 글
자바의 정석_기초편 CHAPTER 3 中 [9 ~ 14] (230731) (0) | 2023.07.31 |
---|---|
자바의 정석_기초편 CHAPTER 3 中 [1 ~ 8] (230728) (0) | 2023.07.28 |
자바의 정석_기초편 CHAPTER 2 中 [1 ~ 9] (230724) (0) | 2023.07.24 |
자바의 정석_기초편 CHAPTER 1 (230721) (0) | 2023.07.21 |
들어가기 앞서, 게시판 목차_자바의 정석 기초편 (0) | 2023.07.21 |