본문 바로가기
자바 풀스택 공부

Day 3.

by seung_nari 2022. 1. 4.

1. 이진수의 음수 표현

10진 음의 정수를 2진수로 변환하려면, 먼저 10진 음의 정수의 절대값을 2진수로 변환한다.

그 다음에 2진수의 '2의 보수'를 구하면 된다.

예를 들어 '-6'의 2진 표현을 구하는 과정은 다음과 같다.

 

//	-6 ----> 6 ----> 0110 ----> 1010
//	  절대값    2진수     2의보수

2. 보수

2의 보수법(2's complement)

 

어떤 수의 'n의 보수'는 더했을 때 n이 되는 수를 말한다.

7의 '10의 보수'는 3이고, 3의 '10의 보수'는 7이다.

3과 7은 '10의 보수의 관계'에 있다고 한다.

'2의 보수 관계' 역시, 더해서 2가 되는 두 수의 관계를 말하며 10진수 2는 2진수로 '10'이다.

2진수로 '10'은 자리올림이 발생하고 0이 되는 수를 뜻한다.

그래서 '2의 보수 관계'에 있는 두 2진수를 더하면 '(자리올림이 발생하고) 0이 된다.'

 

//		0 1 0 1		< 10진수로 5
//	+	1 0 1 1		< 10진수로 -5
//    -----------------
//	1	0 0 0 0		< 자리올림이 발생했으나 크기가 4비트라서 버려짐

 

위의 설명에서 알 수 있듯이 2진수 '0101'와 '1011'은 서로 '2의 보수 관계'에 있으며, 이 두 2진수를 더하면 0이 된다.

이 덧셈이 10진수로도 0이 되려면, 2진수 '0101'가 10진수로 5니까, 2진수 '1011'은 10진수로 -5이어야한다.

 

2의 보수 구하기

 

서로 '2의 보수'의 관계에 있는 두 수를 더하면 '0(자리올림 발생)'이 된다.

예를 들어 2진수 '0101'의 '2의 보수'를 구하려면, '0101'에 어떤 수를 더하면 0이 되는지 알아내야 한다.

 

//	0 1 0 1 + ? ? ? ? = 1 0 0 0 0
//	          2의 보수

 

아래와 같이 뺄셈으로 '2의 보수'를 간단히 구할 수 있지만 자리수가 많아지면 뺄셈도 쉽지 않다.

 

//	1 0 0 0 0 - 0 1 0 1 = 1 0 1 1
//	                      2의 보수

 

다행히 뺄셈보다 '2의 보수'를 더 간단히 구하는 방법이 있다.

'1의 보수'를 구한 다음 1을 더한다. 그러면 2의 보수를 구할 수 있다.

 

//	? ? ? ? +	1의 보수		= 1 1 1 1
//	? ? ? ? +	( 1의 보수 + 1 )	= 1 1 1 1
//	? ? ? ? +	2의 보수		= 1 1 1 1

3. 자바의 printf

println 과 달리 정형화된 코드를 작성할 수 있습니다.

printf 가 println 이랑 다른 이유는 지시자를 사용하는 것입니다.

지시자 설명
%b Boolean 형식으로 출력
%d 10(decimal) 정수의 형식으로 출력
%o 8(octal) 정수의 형식으로 출력
%x, %X 16(hexa-decimal) 정수의 형식으로 출력
%f 부동 소수점(floating-point)의 형식으로 출력
%e, %E 지수(exponent) 표현식의 형식으로 출력
%c 문자(character)로 출력
%s 문자열(string)로 출력

 

예제

public class PrintfEx1 {
	public static void main(String[] args) {
		byte b = 1;
		short s = 2;
		char c = '가';
		
		int finger = 10;
		long big = 100_000_000_000L;
		long hex = 0xFFFF_FFFF_FFFF_FFFFL;
		
		int octNum = 010;
		int hexNum = 0x10;
		int binNum = 0b10;
		
		System.out.printf("b=%d%n", b);
		System.out.printf("s=%d%n", s);
		System.out.printf("c=%c, %d %n", c, (int)c);
		System.out.printf("finger=[%5d]%n", finger); // %5d 다섯칸 확보하고 출력
		System.out.printf("finger=[%-5d]%n", finger);
		System.out.printf("finger=[%05d]%n", finger);
		System.out.printf("big=%d%n", big);
		System.out.printf("hex=%#x%n", hex); // 16진수 출력 %#로 바꾸면 대문자
		System.out.printf("octNum=%o, %d%n", octNum, octNum);
		System.out.printf("octNum=%x, %d%n", hexNum, hexNum);
		System.out.printf("octNum=%s, %d%n", Integer.toBinaryString(binNum), binNum); // 문자열 출력
		
		String str = "12345678901234567890";
		
		System.out.printf("[%s]\n", str);
		System.out.printf("[%30s]\n", str);
		System.out.printf("[%-30s]\n", str);
		System.out.printf("[%.5s]\n", str);
	}
}

4. Scanner

자바에서 화면으로 부터 입력받는 방법은 여러 가지가 있으며, 점점 간단하고 편리한 방향으로 발전해 왔다. 최신 방법은 JDK1.6부터 추가된 Console클래스를 이용하는 것인데, 이 클래스는 이클립스와 같은 IDE에서 잘 작동하지 않으므로, 이와 유사한 Scanner 클래스를 이용하여 화면으로부터 입력받는 방법입니다.

 

먼저 Scanner 클래스를 사용하려면, 아래의 한 문장을 추가해줘야 한다.

import java.util.*;

 

그 다음엔 Scanner 클래스의 객체를 생성한다.

Scanner scanner = new Scanner(System.in);

 

그리고 nextLine() 이라는 메서드를 호출하면, 입력대기 상태에 있다가 입력을 마치고 '엔터키(Enter)'를 누르면 입력한 내용이 문자열로 반환된다.

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

 

이때 nextLine() 외에도 nextInt()와 같은 메서드를 사용할 수 있지만,

프로젝트와 같은 긴 코드를 작성할때에 오류가 날 수 있으므로 꼭 nextLine()을 사용하도록 한다!!

 

Scanner 예제

import java.util.Scanner;

public class ScannerEx {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in); // scanner 객체(참조형 변수) 생성
		
		System.out.print("두자리 정수를 하나 입력해주세요 >>");
		String input = scanner.nextLine();
		int num = Integer.parseInt(input);
		
		System.out.println("입력내용 : "+ input);
		System.out.printf("num = %d\n", num);
	}
}

 

'자바 풀스택 공부' 카테고리의 다른 글

Day 5.  (0) 2022.01.06
Day 4.  (0) 2022.01.04
Day 2-2.  (0) 2022.01.03
프로그래밍 언어에서 1 + 0.1이 1.1이 아닌 이유  (0) 2021.12.31
Day 2-1.  (0) 2021.12.31

댓글