728x90
변수란?
- 단 하나의 값을 저장할 수 있는 메모리 공간
변수를 선언하는 이유
- 값(data)을 저장할 공간을 마련하기 위해서
변수 선언 방법
- 변수타입 변수이름;
int age; // int 타입의 변수 age를 선언
변수의 이름 규칙
- 예약어를 사용할 수 없음
- 숫자로 시작하면 안됨
- 특수문자는 '_' 와 '$' 만 허용함
- 대소문자가 구분되어 길이에 제한이 없음
변수에 값 저장하기
int age = 25; // 변수 age에 25를 저장
변수의 초기화
- 변수를 사용하기 전에 처음으로 값을 저장하는 것
int x = 0; // 변수 x를 선언 후, 0으로 초기화
int y = 5; // 변수 y를 선언 후, 5로 초기화
int x = 0, y=5; //데이터 타입이 같을 경우 한 줄로 할 수 있음
변수의 종류
- 클래스 변수
- 인스턴스 변수
- 지역 변수
- 지역 변수는 자동 초기화가 안되므로 꼭 초기화를 해야함
변수 타입의 종류
char ch = "가"; // char는 문자 타입
double pi = 3.14; // double은 실수 타입
자료형(data type)이란?
- 기본형 변수
- 실제 값(data)을 저장
- 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 로 총 8가지임
- 저장할 값(data)의 종류에 따라 구분됨
- 논리형(boolean)을 제외한 나머지 7개의 기본형은 서로 연산과 변환이 가능함
- 참조형 변수
- null 또는 어떤 값이 저장되어 있는 주소(memory address)를 값으로 갖음
- 기본형 변수 8가지를 제외한 나머지 타입
- 객체의 주소를 저장하므로 값(data)이 아닌 객체의 종류에 의해 구분함
- JVM이 32bit 라면 참조형 변수 크기는 4byte, JVM이 64bit 라면 참조형 변수 크기는 8byte
- 참조변수는 'null' 또는 객체의 주소를 값으로 가짐
//참조변수 선언방법
클래스이름 변수이름;
//Date 클래스 타입의 참조변수 today를 선언한것
Date today = new Date(); // Date 클래스 객체를 생성해서, 그 주소를 today에 저장
값(data)의 타입
- 문자
- char
- char는 문자를 내부적으로 정수(유니코드)로 저장하기 때문에 정수형과 별반 다르지 않으며, 정수형 또는 실수형과 연산도 가능
- 유니코드는 2byte 문자체계
- char
- 숫자
- 정수 ㅡ 각 타입마다 저장할 수 있는 값의 범위가 다름. 주로 int 와 long 을 사용함
- byte
- 효율적인 실행보다 메모리를 절약할 때 쓰임
- 이미지 파일이나 실행 파일같은 이진 데이터를 다루는데 사용됨
- short
- 효율적인 실행보다 메모리를 절약할 때 쓰임
- c언어와의 호환을 위해 추가됨. 잘 안쓰임
- int
- 4개의 정수형 중 기본 자료형, 가장 흔하게 쓰임.
- CPU가 가장 효율적으로 처리할 수 있는 타입
- 아주 큰 정수를 다룰 때 사용됨
- long
- byte
- 실수
- float
- double
- 실수형 중에서 기본 자료형
- 정수 ㅡ 각 타입마다 저장할 수 있는 값의 범위가 다름. 주로 int 와 long 을 사용함
- 논리
- boolean
- true
- false
- boolean
기본형의 종류와 크기 (암기)
1byte | 2byte | 4byte | 8byte | |
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int | long |
실수형 | float | double |
각 타입의 변수가 저장할 수 있는 값의 범위 (정수형만 기억)
자료형 | 저장 가능한 값의 범위 | 크기 | ||
bit | byte | |||
boolean | false, true | 8 | 1 | |
char | '\u0000' ~ '\uffff' ( 0~2^16-1, 0~65535 ) |
16 | 2 | |
byte | -128 ~ 127 ( -2^7 ~ 2^7 - 1 ) |
8 | 1 | |
short | -32768 ~ 32767 ( -2^15 ~ 2^15 - 1 ) |
16 | 2 | |
int | -2147483648 ~ 2147483647 ( -2^31 ~ 2^31 - 1) (약 ± 20억 ) |
32 | 4 | |
long | -2^63 ~ 2^63 - 1 | 64 | 8 | |
float | 1.4E-45 ~ 3.4E38 ( 1.4*10^-45 ~ 3.4*10^38 ) |
32 | 4 | |
double | 4.9E-324 ~ 1.8E308 ( 4.9*10-324 ~ 1.8*10^308 ) |
64 | 8 |
※ 정수형의 값의 범위는 -2^(n-1) ~ 2^(n-1) - 1 (단, n은 bit 수)
1bit = 2진수 1자리
1byte = 8bit
1bit | 1bit | 1bit | 1bit | 1bit | 1bit | 1bit | 1bit |
◎ n비트로 표현할 수 있는 총합의 개수는 같지만 부호의 유무에 따라 값을 표현할 수 있는 범위가 달라짐
n 비트로 표현할 수 있는 각의 개수 : 2^n 개
n 비트로 표현할수 있는 부호없는 정수(양수)의 범위 : 0 ~ 2^n - 1 → 총합 : 2^n 개
n 비트로 표한 할 수 있는 부호있는 정수(양수,음수)의 범위 : -2^(n-1) ~ 2^(n-1) - 1 → 총합 : 2^n 개
byte의 값 저장 방식
byte 총 크기 8bit
S (부호비트) 1bit |
7bit |
S 는 부호비트임. '0' 이면 양수, '1' 이면 음수
실수형 정밀도
- 실수형은 정수형과 저장형식이 달라서 같은 크기라도 훨씬 큰 값을 표현할 수 있음
- 그러나 오차가 발생할 수 있음
- 정밀도가 높을수록 오차 범위가 줄어든다. 정밀한 계산은 double 타입을 쓸 것.
- float 정밀도 : 7자리 수 (10진법)
- double 정밀도 : 15자리 수 (10진법)
float 범위
- -1.4 * 10^(-45) ~ 1.4 * 10^(-45) 범위는 표현할 수 없음
- S(부호 비트), E(지수 비트), M(가수 비트). 3개 부분으로 나눠서 저장함 ( double 도 동일)
S (부호비트) | E (지수비트) | M (가수비트) |
변수(variable)
- 하나의 값을 저장하기 위한 공간
- 값 변경 가능
int score = 100;
score = 200; // score의 값 변경 가능
상수 (constant)
- 한 번만 값을 저장하는 변수
- 값 변경 불가능
- 상수는 반드시 선언과 동시에 초기화를 해야함
- 상수를 선언할 때는 변수 타입 앞에 'final' 을 붙여주면 된다
- 상수의 이름은 모두 대문자로 하는것이 암묵적인 관례
- 여러 단어로 이루어져 있는 경우 '_' 로 구분
final int max = 100;
max = 200; // 에러. max 의 값 변경 불가능.
//상수 선언과 초기화
final int MAX_SPEED; // 에러. 상수는 선언과 동시에 초기화 해야함
final int MAX_VALUE = 100; // ok. 선언과 동시에 초기화 했음
리터럴(literal)
- 그 자체로 값을 의미함
char ch = "A";
String str = "abc"
int scroe = 100;
scroe = 200;
// 'A', 'abc', 100, 200 모두 리터럴임
리터럴의 접두사와 접미사
종류 | 리터럴 | 접미사 | 비고 |
논리형 | false, true | 없음 | |
정수형 | 123, 0b0101, 077, 0xFF, 100L | L | L 이 붙으면 long 타입 L이 안 붙어있으면 int 타입 |
실수형 | 3.14, 3.0e8, 1.4f, 0x1.0p-1 | f,d | f는 float, d는 double d는 생략 가능 |
문자형 | 'a', '1', '\n' | 없음 | '' 로 감싸져있으면 문자형 char 변수이름; |
문자열 | "ABC", "123", "A", "true" | 없음 | ""로 감싸져 있으면 문자열 string 변수이름; |
숫자 접두사
- 숫자 앞에 '0' 이 붙으면 8진수
- 숫자 앞에 '0x'가 붙으면 16진수
- 숫자 앞에 '0b'가 붙으면 2진수
예시
//boolean
boolean power = true;
//문자형
char ch = 'A';
//문자열
string str = "ABC";
//정수형
byte b = 127; //int 타입
10. // 10.0 이랑 같음 뒤에 0을 생략함 f 가 없으므로 double 타입
.10 // 0.10 이랑 같음 앞에 0을 생략함 f 가 없으므로 double 타입
10f // 10.0f 랑 같음
// 변수타입 범위 < 리터럴 인 경우 에러가 남
long l = 3.14f; // 에러. 저장 범위가 long < float 이라서 에러가 남
float f = 3.14; // 에러. float < double
//byte, short 변수에 int리터럴 저장 가능 (단, 변수 타입의 범위 이내여야함)
byte b = 100; // ok. byte 범위 (-128 ~ 127) 에 속함
byte b = 128; // 에러. byte 범위를 벗어남
char ch='AB' // 에러. char은 한 가지 문자만 받을 수 있음
char ch ='' // 에러. char 에선 빈 문자열을 쓰면 에러가 남
string str ="" // ok. 빈 문자열
숫자 → 문자열 변환
- 문자열 + any type → 문자열 + 문자열 → 문자열
- any type + 문자열 → 문자열 + 문자열 → 문자열
"" + 7 // "7"
"" + 7 + 7 // "77" 문자열 + any type → 문자열
7+7+"" // "14" any type + 문자열 → 문자열
printf
- 지시자를 통해 변수의 값을 여러가지 형식으로 변환하여 출력할 수 있음
- println() 은 다른 형식으로 출력할 수 없기 때문에 printf 를 씀
- printf() 는 println() 과 달리 출력후 줄바꿈을 하지 않음
- 줄바꿈을 하려면 마지막에 지시자 '\n' 을 따로 넣어줘야함
- 출력 형식 지정 가능
- 10, 8, 16 진수로 출력 가능
- 실수의 자리 수 조절 가능
지사자
- 지시자는 값을 어떻게 출력할 것인지를 지정해주는 역할을 함
- 8진수와 16진수에 접두사를 붙이려면 "%#o" , "%#x" 를 사용할 것
지시자 | 설명 |
%b | boolean 형식으로 출력 |
%d | 10진 정수 형식으로 출력 |
%o | 8진 정수 형식으로 출력 |
%x, %X | 16진 정수 형식으로 출력 |
%f | 부동 수소점 형식으로 출력 |
%e, %E | 지수 표현식으로 출력 |
%c | 문자(char)로 출력 |
%s | 문자열(string)로 출력 |
참고) '\n' , '%n' 둘 다 줄바꿈 개행 문자임. '\n' 보단 '%n' 을 쓸 것을 권장
10진수 → 2진수로 바꾸는 법
- 10진수를 2진수로 출력해주는 지시자는 없기 때문에, 정수를 2진 문자열로 변환해주는
"Integer.toBinaryString(int i)" 메소드를 사용해야함. 이 메소드는 정수를 2진수로 변환해서 문자열로 반환하기 때문에, printf 로 출력하고 지시자 %s 를 사용해야한다.
// 10 진수 3을 2진수로 바꾸기
int binNum = 3;
System.out.printf("%s", Integer.toBinaryString(binNum)); // 11
실수형 값 출력
- 실수형 값 출력에 사용되는 지시자는 %f , %e , %g 가 있음. 그 중 %f 가 주로 쓰임.
- %f 가 주로 쓰임. %e 는 지수형태로 출력할 때 쓰임. %g 는 값을 간략하게 표현할 때 쓰임.
- %g 는 %f 또는 %e 중 간략한 형식을 자동으로 선택하여 출력함
- 숫자에 0 이 많이 들어가면 %e 로 사용하면 됨
- %f 는 기본적으로 소수점 아래 6자리까지만 출력되고, 소수점 아래 7자리에서 반올림함
// 실수형 출력하기
float f1 = 0.10f; // 0.10 == 1.0e-1
float f2 = 1e1f; // 10.0 == 1.0e1 == 1.0e+1
float f3 = 3.14e3f;
double d = 1.23456789;
System.out.printf("f1 = %f, %e, %g%n",f1,f1,f1); // f1 = 0.100000, 1.000000e-01, 0.100000
System.out.printf("f2 = %f, %e, %g%n",f2,f2,f2); // f2 = 10.000000, 1.000000e+01, 10.0000
System.out.printf("f3 = %f, %e, %g%n",f3,f3,f3); // f3 = 3140.000000, 3.140000e+03, 3140.00
System.out.printf("d= %f%n",d); // d= 1.234568 ← 마지막 자리 반올림됨
//전체 14자리 중 소수점 10자리
System.out.printf("d=%14.10f%n",d); // d= 1.2345678900 ← 소수 앞자리는 빈칸으로 채웠음
예제
//ex.1
//출력하려는 값의 개수와 지시자의 개수를 맞춰야함
// \n 줄바꿈 개행문자를 넣어준다
int age = 14, year = 2017;
System.out.printf("age:%d year:%d%n", age, year); //age:14 year:2017
//ex.2 2,8,16,10 진수법으로 숫자 나타내기
System.out.printf("%d%n",15); // 15 (10진수)
System.out.printf("%o%n",15); // 17 (8진수)
System.out.printf("%x%n",15); // f (16진수)
System.out.printf("%s%n", Integer.toBinaryString(15) ); // 1111 (2진수)
//ex.3 8,16 진수에 접두사 붙이기
System.out.printf("%#o%n",15); // 017 (8진수)
System.out.printf("%#x%n",15); // 0xf (16진수)
System.out.printf("%#X%n",15); // 0XF (16진수) 지시자 X를 대문자로 쓰면 결과값도 대문자로 나옴
//ex.4 실수 출력
// 정밀도 때문에 출력에 약간의 오차가 있지만 값 저장은 제대로 되어있음
float f = 123.4567890f;
System.out.printf("%f%n", f); // 123.456787
System.out.printf("%e%n", f); // 1.234568e+02
System.out.printf("%g%n", 123.4567890); // 123.457
System.out.printf("%g%n", 0.00000001); // 1.00000e-08
printf 실수 정렬하기
예시
//ex.1 정수 정렬하기
System.out.printf("[%5d]%n", 10); // [ 10] → 5자리 수 오른족 정렬
System.out.printf("[%-5d]%n", 10); // [ 10] → 5자리 수 왼쪽 정렬
System.out.printf("[%05d]%n", 10); // [00010] → 5자리 수 오른쪽 정렬후 공백은 0으로 채움
System.out.printf("[%5d]%n", 12345678); // [12345678] → 지정한 자리수와 상관없이 저장된 값 모두 출력
//ex.2 실수 정렬하기
double d = 1.23456789;
System.out.printf("%14.6f%n", d); // 1.234568 → 총 14자리, 소수점 아래자리 6자리, 오른쪽 정렬
System.out.printf("%014.6f%n", d); // 0000001.234568 → 총 14자리, 소수점 아래 6자리, 공백은 0으로 채움
System.out.printf("%.6f%n", d); // 1.234568 → 소수점 아래자리 6자리
System.out.printf("%.10f%n", d); // 1.234568900 → 소수점 아래자리 10자리, 소수점 아래 빈자리는 0으로 채움
System.out.printf("%014.10f%n", d); //001.2345678900 → 양쪽 공백을 0으로 채움
//ex.3 문자열 정렬하기
System.out.printf("[%s]%n", "www.codechobo.com"); // [www.codechobo.com]
System.out.printf("[%20s]%n", "www.codechobo.com"); // [ www.codechobo.com]
System.out.printf("[%-20s]%n", "www.codechobo.com"); // [www.codechobo.com ]
System.out.printf("[%.10s]%n", "www.codechobo.com"); // [www.codech] → 왼쪽에서 10글자만 출력
입력변수
Scanner란?
- 화면으로부터 데이터를 입력받는 기능을 제공하는 클래스
- scanner 를 사용하기 위한 조건
- import 문 추가
- import java.util.*; // 모든 클래스 추가
- import java.util.scanner; // scanner 클래스 추가
- scanner 객체의 생성
- Scanner scanner = new Scanner (System.in);
- scanner 객체 사용
-
//화면에서 입력받은 정수를 num에 저장 // 값을 하나씩 하나씩 받을 경우 주로 씀 int num = scanner.nextInt(); //화면에서 입력받은 실수를 num에 저장 // 값을 하나씩 하나씩 받을 경우 주로 씀 float num = scanner.nextFloat(); //입력받은 내용의 문자열을 정수로 변환하기 // 값을 여러개 또는 여러가지 값 형태가 섞여있을 때 라인단위로 입력 받고 값을 처리함 String input = scanner.nextLine(); //입력받은 내용을 input에 저장 int num = Integer.parseInt(input); // 입력받은 내용을 int 타입의 값으로 변환 //입력받은 내용의 문자열을 실수로 변환하기 String input = scanner.nextLine(); //입력받은 내용을 input에 저장 float num = Integer.parseFloat(input); // 입력받은 내용을 int 타입의 값으로 변환
- 'nextLine()' 메서드를 호출하면, 입력대기 상태에 있다가 입력을 마치고 '엔터키'를 누르면 입력한 내용이 문자열로 반환됨
- 'Integer.parseInt()' 메서드는 문자열을 int 타입의 정수로 변환 시켜줌
- Float.parseFloat()' 메서드는 문자열을 float 타입의 실수로 변환 시켜줌
-
- import 문 추가
예시
// ex.1 입력받은 정수값 출력하기
import java.util.*;
public class VarEx2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int num2 = scanner.nextInt();
System.out.println(num);
System.out.println(num2);
}
}
//ex.2 입력받은 문자열로 정수로 변환해서 출력하기
import java.util.*;
public class VarEx2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
int num = Integer.parseInt(input); // 입력받은 문자열을 숫자로 변환
System.out.println(num);
}
}
//ex.3 문자열을 실수형으로 형변환
double ik = Double.parseDouble("50");
System.out.println(ik); // 50.0
//ex.4 문자열을 정수형으로 형변환
int ik = Integer.parseInt("45");
System.out.println(ik); //45
// ex.5 문자열을 문자로 형변환
char km = "3".charAt(0);
System.out.println(km); // '3'
// ex.6 문자에서 정수로 형변환
// 문자에서 '0' 을 뺀다.
System.out.println('3'-'0'); // 3
특수문자 표현하기
특수문자 | 문자 리터럴 |
tab | \t |
backspace | \b |
form feed | \f |
new line | \n |
carriage return | \r |
역슬래쉬(\) | \\ |
작은따옴표 | \' |
큰따옴표 | \" |
유니코드(16진수) 문자 | \u유니코드 (ex) char a = '\u0041' |
728x90
'[자바] > 자바의 정석 - 3판' 카테고리의 다른 글
Chapter04. 조건문과 반복문 (0) | 2021.08.27 |
---|---|
Chapter03. 연산자 (0) | 2021.08.26 |
Chapter 02-2 진법 (0) | 2021.08.25 |
Chapter01. JAVA 프로그램 (0) | 2021.08.16 |
0. Java API , JAVA 공부 방법 (0) | 2021.08.16 |