JAVA/JAVA Basic

10진수를 2진수, 8진수, 16진수로 변환 프로그램 (With Java) 1

IT록흐 2020. 9. 4. 21:15
반응형

 

< 프로그래밍 완전 생초보의 코딩일기 >

 

 

10진수를 입력 받아 2진수, 8진수, 16진수로 변환하는 프로그램 (1)

 

 

 

Main.class

import java.util.Scanner;

//10진수를 받으면 2진수, 8진수, 16진수로 반환하는 프로그램

public class Main {

	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		System.out.print("10진수를 입력해주세요. : ");
		int decimal = scan.nextInt();
		
		Transform transform = new Transform(decimal);
		transform.show();
	}

}

 

Transform.class

public class Transform {

	private int decimal;
	private String binary;
	private String octal;
	private String hexadecimal;
	
	//생성자
	public Transform(int decimal) {
		this.decimal = decimal;
	}
	
	//10진수를 2진수로 만들기
	public void createBinary() {
		this.binary = doTransform(2);
	}
	//10진수 8진수로 만들기
	public void createOctal() {
		this.octal = doTransform(8);
		
	}
	//10진수 16진수로 만들기
	public void createHexadecimal() {
		this.hexadecimal = doTransform(16);
	}
	
	//진수 변형 메소드
	public String doTransform(int digit) {
		
		int temp = this.decimal;
		int reverseArray[] = new int[50];
		int formalArray[];// 2진수, 8진수 배열 동적 할당
		int count = 0;
		
		//나머지 배열에 저장하기
		if(temp < digit) {
			formalArray = new int[1]; // 배열 동적 할당
			formalArray[0] = temp;
		}
		
		else {
		
			while(temp >= digit) {
				reverseArray[count] = temp % digit;
				temp = temp/digit;
				count++;
				
				if(count==50) {
					errorMessage();
					break;
				}
			}
			
			reverseArray[count] = temp;
			formalArray = new int[count+1];//배열 동적 할당
			// 뒤집혀 저장된 배열을 다시 원래대로 저장하기
			for(int i=0;i <= count;i++) {
				formalArray[i]= reverseArray[count-i];
			}
			
		}
		
		return changetoStringArray(formalArray, digit, count); //변환되어 저장된 배열을 문자열로 변환하는 메소드 
		
		
	}
	
	//변환된 배열 문자열로 바꾸기
	public String changetoStringArray(int[] formalArray, int digit, int count) {
		
		char forhexadecimal[]; //16진수 배열 동적 할당
		String returnString=""; // += 연산자를 사용하기 위해 초기화를 시켜줘야 한다.
		
		// 16진수인 경우 10-15의 수는 문자(A-F)로 바꾸어 문자열 배열에 저장
				if(digit == 16) {
					forhexadecimal = new char[count+1];// 문자열 배열 동적할당
					for(int i = 0;i <= count;i++) {
						switch(formalArray[i]) {
							case 10 : forhexadecimal[i] = 'A';break;
							case 11 : forhexadecimal[i] = 'B';break;
							case 12 : forhexadecimal[i] = 'C';break;
							case 13 : forhexadecimal[i] = 'D';break;
							case 14 : forhexadecimal[i] = 'E';break;
							case 15 : forhexadecimal[i] = 'F';break;
							default : forhexadecimal[i] = (char)(formalArray[i]+'0');break;
							// int를 char로 형변환 하면 int가 가리키는 문자로 변환된다. 그러므로 문자 '0'을 더하면 정수에 +48을 하는데 이는 1~9까지의 수문자를 가리킨다.
						}
						
						returnString += forhexadecimal[i];
					}

					return returnString;//16진수 배열을 문자열로 형변환 후 리턴
				}
				
				for(int i =0;i<=count;i++) {
					returnString += formalArray[i];
				}
				
				return returnString; // 2진수, 8진수 배열을 문자열로 형변환 후 리턴
		
	}
	
	//출력하기
	public void show() {
		createBinary();
		createOctal();
		createHexadecimal();
		
		System.out.println();
		System.out.println(this.decimal + "의 2진수는 " + this.binary + "입니다.");
		System.out.println(this.decimal + "의 8진수는 " + this.octal + "입니다.");
		System.out.println(this.decimal + "의 16진수는 " + this.hexadecimal + "입니다.");
	}
	
	// 에러메세지 출력
		public void errorMessage() {
			System.out.println("너무 큰 수입니다!!");
		}
	
}

 

출력 결과

 

 


 

코딩 하며 알게 된 사실

 

 

toString() 메소드

 

toString() 메소드는 Object클래스의 메소드이다.

 

배열.toString은 배열을 문자열로 변환하는 메소드가 아니라 배열의 주소를 반환하는 메소드이다. toString()메소드는 주로 객체와 쓰이며 사용할 때는 반드시 Overriding을 하고 써야한다. 

 

String으로 타입캐스팅?

 

boolean, char, byte, short, int, long, float, double은 원시적 자료형이다.

String, Array는 비원시적 자료형으로 String은 Char의 배열이다. 

 

그러므로 우리가 흔히 알고 있는 (String) "423" 형변환(Type Casting)은 불가능하다.

 

그래서 나는

 

String x = "";  //String 변수 x를 초기화 하고

x += 3;  // +=연산자를 이용하여 int값 3을 추가하면 문자가 되어 기존데이터 뒤에 덧붙여진다.

 

 

int와 char의 형변환

정수를 (char) 형변환하면 정수가 가리키는 아스키코드 문자가 출력된다.

 

 

정수 < 10

 

 

 

정수가 10보다 작으면 +48을 하면 정수가 그대로 문자로 변환되어서 저장된다.

(char)(3+48) == '3'

 

int i = 4;

char ch = char(i+48);

 

 

 

정수 > 10

 

정수가 10을 넘어가면 아스키코드로 표현 불가하다.

10이 넘는 정수는 타입캐스팅하면 안 된다.

 

 

 

느낀 점

 

자료를 다른 형태로 변환하여 저장하는 과정이 많이 힘들었다.

 

TypeCasting, Wrapper Class의 역할, 자료형 간의 차이점과 관계 공부가 필요해보인다.

 

toString() 메소드의 구체적인 활용

+=가 왜 문자로 자동 변환되어 String에 저장되는지 나는 알지 못한다.

 

아직 그 이유를 찾기에도 부족한 실력이다.

 

 

 

 

 

 

 

반응형