쿠릉쿠릉 쾅쾅 2021. 8. 18. 13:30
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 문자체계
  • 숫자
    • 정수  ㅡ 각 타입마다 저장할 수 있는 값의 범위가 다름. 주로 int 와 long 을 사용함
      • byte
        • 효율적인 실행보다 메모리를 절약할 때 쓰임
        • 이미지 파일이나 실행 파일같은 이진 데이터를 다루는데 사용됨
      • short
        • 효율적인 실행보다 메모리를 절약할 때 쓰임
        • c언어와의 호환을 위해 추가됨. 잘 안쓰임
      • int
        •  4개의 정수형 중 기본 자료형, 가장 흔하게 쓰임.
        • CPU가 가장 효율적으로 처리할 수 있는 타입
        • 아주 큰 정수를 다룰 때 사용됨
      • long
    • 실수
      • float
      • double
        • 실수형 중에서 기본 자료형
  • 논리
    • boolean 
      • true
      • false
  •  

 

기본형의 종류와 크기 (암기)

  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 타입의 실수로 변환 시켜줌

 

예시

// 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