< 프로그래밍 완전 생초보의 코딩일기 >
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)
'JAVA > JAVA Basic' 카테고리의 다른 글
[Java] 조건문과 반복문 심화 (0) | 2020.11.22 |
---|---|
[Java] 연산자 정리하기 (0) | 2020.11.21 |
강제형변환(Casting)과 데이터 손실 (0) | 2020.11.19 |
' * ' 로 도형 만들기 (0) | 2020.09.10 |
10진수를 2진수, 8진수, 16진수로 변환 프로그램 (With Java) 1 (0) | 2020.09.04 |