[CS] 자바의정석 독서 #2 - 포매팅

2025. 9. 18. 20:12·언어공부/Java | Kotlin

마저합시다


어제는 char 형식이 내부적으로 유니코드로 저장되므로 정수형이나 다른 타입 (불리언을 제외한)과의 연산이 가능하다고 했으나, char가 아닌 String 타입에서는 연산을 진행할 때 다른 피연산자를 String으로 변환하고 두 String을 결합한다. 곱셈 / 나눗셈 / 뺄셈은 안된다.


파이썬에서 썼던 큰따옴표 3개를 사용하는 텍스트 블럭 방식의 경우 JDK15에서부터 지원한다. 주된 특징으로는 닫는 큰따옴표 묶음을 기준으로 들여쓰기의 기준이 정해진다는 것과, 역슬래시는 \n 를 제거한다는 것


지시자 이용하기 - 정수형

println을 사용하지않고 C처럼 지시자를 이용한 출력을 하고 싶으면 자바의 printf 함수를 이용하면 된다. C와 동일하다. 다만 printf를 바로 쓰면 안되고 System.out.printf(); 형식으로 사용해야한다.

 

지시자는

%b - 불리언 / %d - 10진수 정수 / %o - 8진 정수 / %x, %X - 16진 정수 / %f - 부동소수점 / %c - 문자 / %s - 문자열 이 있다.

 

C와는 다르게 char 타입을 지시자 %d 로 출력할 수는 없고, int 타입으로 캐스팅해야한다. 값은 유니코드가 출력된다.

 

System.out.printf("[%5d]")		//[   10]
System.out.printf("[%-5d]")		//[10   ]
System.out.printf("[%05d]")		//[00010]

지시자 앞에 숫자가 들어가면 숫자만큼의 길이를 출력한다. 음수일 경우에는 왼쪽 정렬, 05, 06, 이런 형태면 빈자리에는 0을 채워서 출력한다. 이는 String도 마찬가지로 작동한다. String은 %.ns을 지시자를 통해서 n번째 자리까지만 왼쪽에서 n개의 글자만 호출할 수 있다.

인텔리제이에서 굳이 스프링 프로젝트를 돌릴 필요가 없더라.. 맨날 vscode에서 자바 돌렸는데 이제 인텔리제이를 많이 써야겠다

 

그리고 뭐 지시자 %x, %o 앞에 #을 붙이면 출력할 때 접두사로 0x가 붙는다 정도?

 

참고로 이진수만을 출력하는 지시자는 따로 없고

System.out.printf("%s", Integer.toBinaryString(num));

Integer 클래스의 메서드를 이용하면 된다. 반환형식이 String이어서 %s 지시자를 써야한다.


지시자 이용하기 - 실수형

지시자에서는 %f, %e, %g가 있는데 %e는 지수형태로 (1.0000e-01 이런 형태라던가), %g는 간략한 형태로 표기를 하고, 대부분은 %f를 사용한다. 또 %f는 포매팅 규칙에 따라 소수점 아래 6자리까지만 호출하고 그 밑은 반올림한다. 다만 이는 디폴트 설정이라,

 

System.out.printf("%10.8f", 1.23456778900)

이런 방식으로 정상적으로 표출할 수 있는 자리수를 늘릴 수 있다. (물론 자료형 자체의 오버플로우가 일어나지 않는 선에서) 

그래서 %10.8f 는 전체 10자리 중에서 8번째 자리까지만 출력한다는 뜻으로 사용할 수 있다. 

 

이렇게..

기본 %f는 소수점 아래 7자리에서 반올림,

%m.n 방식으로 출력하면 전체 (정수부분 + 실수부분)를 m으로 설정하고, 그 중에 n개의 자리수를 소수점 아래로 설정한다는 뜻이다. 그래서 소수점 아래에서 빈 부분은 0으로 채워지고, 정수부분에서 빈 자리는 그냥 공백으로 채워진다.

정수부분에서 값이 커져도 총 자리수가 m을 넘어서서 출력되지 정수부분이 짤리지는 않는다.


값 입력받기

 

import java.util.*;

//클래스 / 메서드 선언

Scanner scanner = new Scanner (System.in);

String input = scanner.nextLine();
int num = Integer.parseInt(input);

이런 식으로 입력받을 수 있다. int 말고도 float 나 여러 숫자를 받을 수 있다. Float.paserFloat() 같은거로..


정수, 실수의 2진표현

포매팅이 좀 어렵기도하고, C프 들을 때 한 번 더 들어야하는 부분이라 좀 세세하게 읽었다.

이 다음으로는 10진수 - 16진수 - 8진수 - 2진수 변환이 나오는데, 10진수에서 출발할 때는 흔히 아는 나눗셈 방식으로 해도되고, 10진수로 돌아올 때는 n번째 자리수를 2^n의 계수로 잡아 곱한 다음에 각 자리수에서의 계산결과로 나온 값을 더하면 된다.

 

이진수 1010의 경우에는 1 * 2^3 + 0 * 2^2 + 1*2^1 + 0*2^0 = 10

반대로 23을 이진수로 변환하려면 23 = 2*4 + 0*2*3 + 1*2*2 + 1*2^1 + 1*2^0 이므로 10111이다.

 

실수는 

10진수 -> 2진수의 경우에는 소수부에 계속해서 2를 곱하고, 정수부분은 따로 뺀 뒤에 소수 부분이 0이 되면 빼놨던 정수부분들을 나열하면 이진소수가 된다.

 

2진소수는 소수점 아래 n번째 자리수를 2*(-n)의 계수로 잡은 다음에 일괄적으로 더하면 10진 소수로 변환된다.

 

정수부분.소수부분으로 이루어진 실수는 정수부와 실수부를 뺀 뒤에 따로 계산한 다음 더하면 된다.


음수의 2진표현

8비트 상에서 5를 이진수로 표현하면 00000101인데 이를 2의 보수법을 통해서 음수로 바꾸면 11111011이다.

 

첫번째 비트가 부호를 결정하니까 그냥 100000101로 하면 되지 않을까 싶지만.. 그러면 10000000, 00000000로 0이 두 개 생긴다는 문제도 있고, 2진수가 10000001에서 10000101로 이진수가 증가했지만 십진수는 -1에서 -5로 감소했다는 단점이 생긴다. 또 10000001 + 00000001 은 0이 안되기 때문에 덧셈 / 뺄셈 연산을 따로 해야하는 것도 있고

 

2의 보수법은 이와달리 0도 값이 하나고, 11111111 + 00000001 = 1 0000000 인데, 8비트이므로 첫 번째 비트는 버려지므로 계산결과도 2의 보수끼리 더해도 결과가 0이 나온다. (사실 2의 보수라는 뜻이 더하면 2가되는 수이므로 2가 나와야하지만 맨 앞의 1은 자리올림이 발생해서 버려진다) 음수로 바꾸는데 좀 어렵다는 단점만 빼면 좋은 표현방법이다.

 

이렇게 2의 보수를 모든 자리수에서 0을 1로, 1을 0으로 바꾸고 마지막에 +1을 하는 방법을 통해 구할 수 있다. +1을 제외하면 1의 보수를 구하는 과정이다.


우선 여기 이후로는 다른 내용이 나와서..

통일성을 맞추기 위해 여기까지만

'언어공부 > Java | Kotlin' 카테고리의 다른 글

[CS] 자바의 정석 독서 #3 - float, double, 부동소수점, 그리고 오차  (0) 2025.09.20
인프런 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 후기  (0) 2025.09.20
[CS] 자바의 정석 독서 #1 - 2장 - 변수  (0) 2025.09.18
[2025 백엔드] 헤드퍼스트자바 독서 #10 - 16장. 객체 저장  (5) 2025.08.17
[2025 백엔드] 헤드퍼스트자바 독서 #9 - 13장. 위험한 행동  (4) 2025.08.13
'언어공부/Java | Kotlin' 카테고리의 다른 글
  • [CS] 자바의 정석 독서 #3 - float, double, 부동소수점, 그리고 오차
  • 인프런 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 후기
  • [CS] 자바의 정석 독서 #1 - 2장 - 변수
  • [2025 백엔드] 헤드퍼스트자바 독서 #10 - 16장. 객체 저장
Radiata
Radiata
개발을 합니다.
  • Radiata
    DDD
    Radiata
  • 전체
    오늘
    어제
    • 분류 전체보기 (211)
      • 신년사 (3)
        • 2025년 (2)
        • 2026년 (1)
      • CS (59)
        • JVM (12)
        • 백엔드 (20)
        • 언어구현 (1)
        • 객체지향 (1)
        • 논리회로 (5)
        • 컴퓨터구조 (9)
        • 데이터베이스 (1)
        • 컴퓨터 네트워크 (10)
      • 언어공부 (64)
        • Java | Kotlin (48)
        • JavaScript | TypeScript (9)
        • C | C++ (6)
      • 개인 프로젝트 (11)
        • [2025] Happy2SendingMails (3)
        • [2026] 골든리포트! (8)
        • [2026] 순수자바로 개발하기 (0)
        • 기타 이것저것 (0)
      • 팀 프로젝트 (29)
        • [2025][GDG]홍대 맛집 아카이빙 프로젝트 (29)
      • 알고리즘 (13)
        • 백준풀이기록 (11)
      • 놀이터 (0)
      • 에러 수정일지 (2)
      • 고찰 (24)
        • CEOS 23기 회고록 (2)
  • 블로그 메뉴

    • CS
    • 언어공부
    • 개인 프로젝트
    • 팀 프로젝트
    • 알고리즘
    • 고찰
    • 신년사
    • 컬러잇 개발블로그
  • 링크

    • 컬러잇 개발블로그
  • 공지사항

  • 인기 글

  • 태그

    144
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Radiata
[CS] 자바의정석 독서 #2 - 포매팅
상단으로

티스토리툴바