JAVA/JAVA Basic

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

IT록흐 2020. 9. 9. 15:20
반응형

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

 

 

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

 

 

지난 번 포스팅은 Array 자료구조를 이용했다. 이번 포스팅은 ArrayList 자료구조를 이용하여 코드를 구성했다. 10진수를 N진수로 변환하는 방법은 10을 N으로 N 미만의 몫이 나올 때까지 나누는 것이다. 이외에도 가장 자주 사용되는 방법은 2진수를 활용하는 것이다. 8진수와 16진수의 경우, 2진수를 통해 쉽게 변환이 가능하다.

 

가령, 111011 이진수가 있다 하면

 

 

8진수는 3개씩 한 마디 나누고 16진수는 4개씩 한 마디로 나눈다.

각 마디가 한 자리의 8진수, 16진수를 나타낸다.

 

8진수의 한 마디는 2² 2¹ 2

16진수의 한 마디는 2³ 2² 2¹ 2

 

 

 

 

 

이 원리를 코드로 표현해보았다.

 

 

 

Main.class

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		System.out.print("십진수 값을 입력해주세요. :");
		int digit = scan.nextInt();
		
		Transform trans = new Transform(digit);
		trans.testShow();
		
	}

}

 

Transform.class

import java.util.ArrayList; 

public class Transform {
	private int decimal;
	private String binary;
	private String Octal="";
	private String hexadecimal="";
	

	//생성자
	public Transform(int digit) {
		this.decimal = digit;
	}
	
	//2진수 만들기
	public ArrayList<Integer> makeBinary() {
		this.binary="";
		ArrayList<Integer> binaryList = new ArrayList<Integer>();
		int temp1 = this.decimal;
	
		
		//10진수를 %,/ 연산자 이용 2진수 역순 리스트 형성
		for(int i = 0;;i++) {
			
			binaryList.add(temp1 % 2); 
			if(temp1<2)break; 
			temp1 = temp1/2; 
			
		}
		
		//2진수 문자열 정순으로 바꾸어 변수에 저장
		for(int i =1; i<=binaryList.size();i++) {
			this.binary += binaryList.get(binaryList.size()-i);
		}
		
		
		return binaryList; //2진수 역순 리스트 출력
		
	}
	
	
	//2진수 -> 8진수, 16진수로 변형
	public void makeTransform(ArrayList<Integer> binaryList, int digit) {
		int sum=0;
		int count = 0;
		ArrayList transform = new ArrayList<>();
		
		while(binaryList.size()>0){
			sum += Math.pow(2,count)*binaryList.get(0); 
			binaryList.remove(0);
			count++;
			
			if(count==digit) {
				transform.add(0,sum); // 0자리에 add해서 정순으로 정렬
				sum=0;
				count=0;
			}	
		}
		transform.add(0,sum); // while을 탈출 뒤 sum값 입력 마무리
		makeString(transform,digit); //8진수, 16진수 String으로 저장하기
	}
	
	
	//8진수, 16진수 String으로 저장
	public void makeString(ArrayList<Integer> transform, int digit) {
			
			for(int i =0;i<transform.size();i++) {
					if(digit==3) { //8진수
						this.Octal += transform.get(i);
					}
					else { //16진수
						switch(transform.get(i)) {
							case 10 : this.hexadecimal += 'A';break;
							case 11 : this.hexadecimal += 'B';break;
							case 12 : this.hexadecimal += 'C';break;
							case 13 : this.hexadecimal += 'D';break;
							case 14 : this.hexadecimal += 'E';break;
							case 15 : this.hexadecimal += 'F';break;
							default : this.hexadecimal += transform.get(i);break;
							}
					}
			}
		
	}
	
	
	//테스트 Show
	public void testShow() {
		makeTransform(makeBinary(),3);
		makeTransform(makeBinary(),4);
		
		System.out.println(decimal + "의 2진수 값은 " + this.binary);
		System.out.println(decimal + "의 8진수 값은 " + this.Octal);
		System.out.println(decimal + "의 16진수 값은 " + this.hexadecimal);
		
	
	}
	
	
	
}

 

 

출력 

 

 

 

10진수를 입력받으면 makeBinary()메소드로 2진수로 변형 한 후, makeTransform() 메소드로 8진수와 16진수로 변형했다. 16진수는 A,B,C,D,E,F 가 수로 들어간다. 그래서 makeString() 메소드를 이용, ArryaList<Integet> 에 저장된 값을 String 배열에 저장했다.

 

 

알 게 된 점

 

ArrayList는 리스트이다. 그러므로 Array와는 많이 다르다.

 

1. 가변적 vs 고정적

 

ArrayList는 크기가 가변적이다. 

ArrayList는 선언 시 크기를 명시하지 않아도 입력된 데이터의 수에 따라 가변적으로 바뀐다. Array는 크기가 고정되어 있으므로 선언 시, 배열의 크기를 명시해야한다. 선언 시 명시를 안 해도 나중이라도 동적으로 정확한 수치를 명시를 해야한다. 

 

2. 인덱스

 

Array는 인덱스와 데이터가 1 대 1 대응한다. 1번째 데이터가 삭제되면 1번째 데이터가 사라질 뿐 나머지 데이터는 그대로이다. 하지만 ArrayList는 다르다. 1번째 데이터가 삭제되면 2번째 데이터가 1번째 데이터가 된다. 한 칸씩 앞으로 밀리는 것이다. 만약 1번째 자리에 삽입을 하면 데이터가 한 칸씩 뒤로 밀린다. (배열과 리스트의 구조적 차이가 잘 드러난다.)

 

그러므로 데이터 수정시 큰 차이를 보인다.

 

배열의 경우

 

arr[0] = b;  // =연산자를 이용하면 인덱스 0자리의 값이 b로 바뀐다.

 

리스트인 경우

 

arrlist.remove(3);  //먼저 인덱스 3 자리의 데이터를 제거 한다. 데이터들은 한 칸씩 앞으로 밀린다.

arrlist.add(3,b); // 그 후 인덱스 3에 데이터를 add 메소드를 사용하여 넣어준다. 데이터들은 다시 뒤로 밀린다.

 

 

3. 배열명, 리스트명

 

배열명과 리스트명은 자료구조의 첫 주소를 나타낸다.

 

tempList = this.binaryList

 

=연산자는 리스트나 배열의 값들을 복사하는 것이 아니라 주소를 전달하는 것이다. tempList를 통해 binaryList의 데이터 접근이 가능해짐을 시사한다.

 

4. 제네릭(generic)

 

클래스의 타입을 외부에서 정해주는 것이다. 한 가지 클래스를 두고 여러가지 타입의 객체 생성이 가능해진다.

 

ArrayList<Integer> arrlist1 ,  ArrayList<String> arrlist2 ......

 

제네릭은 원시데이터타입(primitive data type)이 아닌 참조형 데이터 타입을 사용한다.(wrapper class)

 

 

 

 

 

반응형