Java - 기본기

2. 변수 다루기 - 기본형 심화, printf 를 이용한 출력, 입력 받기

TerianP 2021. 9. 2.
728x90

1. 두 변수 값 서로 바꾸기

 

변수의 값을 지정할 때 가장 중요한 부분은 한 변수에 하나의 값만 넣을 수 있다는 점이다. 이때 두 변수가 존재하고 각각 다른 값이 넣어져있을 때 서로 바꾸기 위해서는 어떻게 하면 좋을까?

아래처럼 새로운 변수인 tmp 를 하나 새로 만들고 tmp 에부터 천천히 x 와 y 값을 천천히 넣어준다.

  • 참고로 이 문제는 정보처리기사 필기 / 실기에서 종종 출시되는 문제 중 하나이다.
int x = 4, int y = 5
int tmp;

tmp = x; // 1. x의 값을 tmp에 저장
x = y; // 2. y의 값을 x에 저장
y = tmp; // 3. y값에 tmp 즉 x 값을 저장

System.out.println("x값은 : "+x);
System.out.println("y값은 : "+y);

//출력
x값은 : 5
y값은 : 4

이때 다시 한 번! 중요한 점은 하나의 변수에는 하나의 값만 넣어진다는 점.

 

2. 기본형 표현 범위 = 2진수로 표현하기

  • byte : 1byte = 8 bit ⇒ 이때 1bit 는 2진수 한 자리(0, 1 중 하나)로 표현됨, 또한 맨 앞 1bit 는 양수인지(0 으로 표현) 음수인지(1 로 표현) 알려줌0 | 000110
  • 즉 byte b 라는 변수에 3 이라는 값을 저장하면 , 10진수 3이 2진수로 변환되어 011 로 바뀌어 저장되며, 3은 양수이기 때문에 맨 앞 1bit 는 0 이 되어 다음처럼 표현된다
  • n비트로 표현 할 수 있는 값의 갯수 : 2^n개
  • n비트로 표현 할 수 있는 부호 없는 정수(양수)의 범위 : 0 ~ 2^n-1 ⇒ 8비트로 표현 할 수 있는 범위 : 0 ~ 2^8 - 1 = 0 ~ 255
  • n비트로 표현 할 수 있는 부호 있는 정수의 범위 : -2^(n-1) ~ 2^(n-1)
기본형 byte 표현 범위
byte 1 byte = 8 bit -2^7 ~ 2^7-1
short 2 byte = 16 bit -2^15 ~ 2^15-1
int 4 byte = 32 bit  0 ~ 2^16-1 => 약 20억
long 8 byte = 64 bit -2^63 ~ 2^63-1 => 약 800경
char 2 byte = 16 bit  0 ~ 2^16-1
float 4 byte = 32 bit -3.4*10^38 ~ 3.4*10^38
double 8 byte = 64 bit 4.9E-324 ~ 1.8E308

여기서 문제! 분명 float 와 int 는 똑같은 4byte 인데 왜 float 의 범위가 더 클까?

이는 float의 표현방법에 있다. float은 값을 저장 시 부호+지수+가수 형식이로 저장되기 때문에 int 보다 더 큰 범위를 저장 할 수 있다고 한다. 다만 이러한 방법 값을 저장할 때 오차가 발생하는 단점이 존재하기도 한단다.

이때 float << double 이 더 정밀도가 높다. 정밀도도 높고, 범위도 크기 때문에 double 가 실수 표현 시 기본형이 된 듯

 

3-1. 형식화된 출력 - printf()

printnl() 의 단점 : 출력 형식 지정 불가, 즉 printnl 을 사용 할 겨우 '실수의 자리수 조절 불가' 및 10진수로만 출력된다는 단점이 있다.

그러나 printf(() 의 경우 출력 형식을 따로 지정 가능하다.

// printnl 의 경우 => 출력 형식 지정 불가
System.out.printnl(10.0/3) // 3.33333333***** => 로 출력됨
System.out.printnl(0x1A) // 26 => 10 진수로 출력됨


//printf 의 경우 출력 => 출력 형식 지정 가능
System.out.printf("%
System.out.printf("%d", 0x1A) // 26
System.out.printf("%x", 0x1A) // 1A

 

3-2. printf() 지시자 목록과 사용 방법

  • 지시자 목록
사용 종류 지시자 종류 출력 형식
정수 %b boolean 형식으로 출력
%d 10진수 형식으로 출력
%o 8진수 형식으로 출력
%x, %X 16진수 형식으로 출력
Integer.toBinaryString() 2진수 형식으로 출력
실수 %f 부동 소수점 형식으로 출력
%e, %E 지수 표현식의 형식으로 출력
문자 %c 문자 형식으로 출력
%s 문자열 형식으로 출력
  • 활용 방법
double a = 10.0/3;

System.out.printf("%.3f", a); // 0.3333 => 소숫점 3자리까지만 출력됨
System.out.printf("%.3e", a); // 3.3333e+00 => 지수 형식으로 출력
System.out.printf("%.4g \n", a); // 3.333 => %f 보다 간단하게 나오게할때?

System.out.printf("%d", 15); // 15 => 10진수 출력
System.out.printf("%o", 15); // 17 => 8진수 출력
System.out.printf("%x", 15); // f => 16진수 출력
System.out.printf("%s", Integer.toBinaryString(15)); // 1111 => 2진수로 출력

System.out.printf("%#x", 15); // # 을 붙이면 접두사가 붙어서 출력됨


System.out.printf("[%5d]%n", 10); // [   10] => 오른쪽으로 정렬되어 출력
System.out.printf("[%-5d]%n", 10); // [10   ] => 왼쪽으로 정렬되어 출력

double dd = 1.23456789;
System.out.printf("%.5f", dd); // 1.23457 => 1.23456 이 아닌 1.23457 인 이유는 6이 반올림되어 출력되기 때문

String s = "terianp.tistory.com";
System.out.printf("%s%n", s); // terianp.tistory.com
System.out.printf("[%-30s]%n", s); // [terianp.tistory.com           ] => 왼쪽으로 정렬
System.out.printf("[%30s]%n", s); // [           terianp.tistory.com] => 오른쪽으로 정렬
System.out.printf("[%.7s]%n",s); // [terianp] => 일부만 출력
  • 보통 실수를 출력하는 경우는 변수 타입은 double(float 보다 double 가 정밀도가 더 높기 때문에), 지시자 %f 를 많이 사용하고, 실수를 사용 시 0이 많은 경우 %e 지시자를 사용한다.
  • %g 같은 경우 %f 보다 간단하게 표현하고자 할 때 사용한다.
  • %n \n 모두 개행 문자로 출력 시 1줄 줄바꿈하여 표현되도록 한다.
  • %와 지시자 사이에 아래 형식을 넣으면 출력 형식을 살짝 바꿀 수 있다.
    • %전체자리.소수점아래자리f ⇒ %5.3f 면 전체 5자리 중 소숫점은 3자리만 출력한다.
    • %숫자s : 숫자만큼 오른쪽 정렬 ⇒ %5s : 전체 5만큼 출력하고 0이 들어갈 자리는 빈칸으로 둠 즉, 오른쪽으로 정렬됨
    • %-숫자s : 숫자만큼 왼쪽 정렬 ⇒ %-5s : 전체 5만큼 출력하고 0이 들어갈 자리는 빈칸으로 둠 즉, 왼쪽으로 정렬됨
    • %.숫자s : 숫자만큼 문자열 부분 출력 ⇒ %.3s : 3만큼만 문자열이 출력됨

댓글