Java

Java - JVM / 프로그래밍의 3대 요소 (변수 Variable, 자료형 Data Type, 할당 Assign) / 자료형에 대한 공부 / 수의 표현(2진수, 8진수, 16진수)

wy-family 2024. 11. 20. 09:51

개발자에 의해서 Java Program 코드가 작성되었다.

.java

 

그것을 compile 하면, .class 파일로 bytecode로 변환이 된다. 그걸 중간어 코드라고 부름.

그리고 그걸,

JVM (Java Virtual Machine) 이 한 번 더 compile을 해서 .exe 파일로 컴파일해서 메모리에 로딩해서 실행한다.

그러니까,

 

Window, Mac, Linux 라는 OS가 있으면, 각각의 OS 에 맞는 JVM 이 설치가 되어 있으면

개발자가 작성한 .java 코드 파일은 어떤 OS에 가더라도 실행이 가능하다.

왜? 각각의 OS에 맞는 JVM이 있어서 걔네들이 2차 컴파일을 해서 각각의 OS에 맞게 .exe 파일로 만들어줄 거니까.

그래서 OS 독립적이라는 것.

이를 포함한 Java의 대표적인 특징들은 다음과 같습니다:

  1. 운영체제 독립성 (OS 독립적)
    • Java 코드는 특정 운영체제에 종속되지 않습니다. 한 번 작성된 Java 프로그램은 JVM이 설치된 모든 환경에서 실행될 수 있습니다. 이 덕분에 Java는 "Write Once, Run Anywhere"라는 슬로건을 가질 수 있었습니다.
  2. JVM의 역할
    • JVM은 Java 프로그램을 운영체제와 하드웨어에 맞게 해석하고 실행하는 역할을 합니다. Java 소스 코드를 컴파일하면 바이트 코드라는 중간 형태로 변환되며, 이 바이트 코드를 JVM이 해석하여 실행합니다. 이 과정에서 운영체제에 독립적으로 프로그램이 실행될 수 있습니다.
  3. 자동 메모리 관리
    • Java는 Garbage Collection을 통해 자동으로 메모리를 관리합니다. 객체 사용이 끝나면 자동으로 메모리를 해제하여 개발자가 메모리 관리를 직접 할 필요가 적습니다.
  4. 객체 지향 프로그래밍(OOP)
    • Java는 객체 지향 언어로, 클래스와 객체 개념을 중심으로 프로그래밍을 할 수 있도록 설계되었습니다. 이를 통해 코드의 재사용성과 확장성을 높일 수 있습니다.
  5. 풍부한 표준 라이브러리
    • Java는 다양한 라이브러리를 제공하여 네트워크, 파일 입출력, 데이터베이스 연결 등 여러 작업을 쉽게 처리할 수 있도록 돕습니다.
  6. 강력한 보안
    • Java는 애플릿과 같은 웹 기반 프로그램에서 보안을 강화하고, Java의 클래스 로더와 보안 관리자(Security Manager)를 통해 잠재적인 위협을 차단하는 기능을 제공합니다.
  7. 멀티 스레딩 지원
    • Java는 기본적으로 멀티스레딩을 지원하여 효율적으로 병렬 처리를 수행할 수 있습니다.

이러한 특징 덕분에 Java는 다양한 환경에서 범용적으로 사용될 수 있고, 특히 OS 독립성을 제공하는 JVM이 Java의 강력한 특징으로 작용하고 있습니다.


Java의 "자동 메모리 관리"와 "멀티 스레딩 지원"은 Java의 큰 장점 중 하나로, 프로그래밍을 효율적이고 편리하게 만들어주는 중요한 기능이야. 하나씩 살펴보자.

1. 자동 메모리 관리 (Automatic Memory Management)

자동 메모리 관리는 "Garbage Collection(가비지 컬렉션)"이라고 불리는 Java의 기능 덕분에 가능해. 가비지 컬렉션은 프로그램이 더 이상 사용하지 않는 객체나 데이터를 자동으로 메모리에서 제거해서, 개발자가 직접 메모리를 관리할 필요가 없어져.

왜 자동 메모리 관리가 중요한가?

보통 다른 언어, 예를 들어 C나 C++에서는 개발자가 메모리를 직접 할당하고 해제해야 해. 하지만, 개발자가 실수로 메모리를 제대로 해제하지 않으면 "메모리 누수"라고 해서 시스템 성능이 점점 떨어질 수 있어. 반면 Java는 가비지 컬렉터가 주기적으로 메모리를 청소해 주기 때문에 개발자는 코드 작성에만 집중할 수 있고, 메모리 관리 실수로 인한 오류를 줄일 수 있어.

가비지 컬렉션이 어떻게 작동하나?

가비지 컬렉션은 JVM(Java Virtual Machine)에서 실행되는 과정인데, JVM은 객체가 더 이상 프로그램에서 참조되지 않을 때 그 객체를 "가비지"로 인식해. 가비지 컬렉터는 이러한 가비지를 주기적으로 찾아내어 메모리에서 삭제해 버리면서 메모리를 재활용해. 이 과정 덕분에 시스템 메모리가 효율적으로 관리되고, 프로그램이 장시간 실행되더라도 성능이 유지될 수 있어.

2. 멀티 스레딩 지원 (Multi-threading Support)

멀티 스레딩은 하나의 프로그램이 동시에 여러 작업을 수행할 수 있도록 해주는 기능이야. 이를 통해 Java 프로그램은 훨씬 더 빠르고 효율적으로 작동할 수 있어.

스레드란 무엇인가?

스레드는 프로세스 내에서 실행되는 작은 작업 단위야. 프로세스는 프로그램이 메모리에서 실행될 때의 단위인데, 이 안에서 여러 스레드가 동시다발적으로 작업을 할 수 있어. 예를 들어, 웹 브라우저는 화면을 렌더링하는 스레드, 파일을 다운로드하는 스레드 등 여러 스레드를 동시에 실행하면서 다양한 작업을 처리해.

Java에서 멀티 스레딩이 지원되는 방법

Java는 Thread 클래스와 Runnable 인터페이스를 제공해서 간단하게 스레드를 만들고 실행할 수 있어. 이를 통해 복잡한 연산을 동시에 수행할 수 있어, 예를 들어 사용자의 입력을 기다리는 동안 데이터 다운로드나 계산 작업을 백그라운드에서 진행할 수 있어. 이렇게 하면 프로그램이 멈추지 않고 계속 사용자에게 반응할 수 있지.

멀티 스레딩의 장점과 주의사항

멀티 스레딩을 활용하면 시스템 자원을 더 효율적으로 사용할 수 있지만, 동시에 여러 스레드가 같은 데이터를 수정하려고 할 때 "경쟁 조건"이나 "데드락" 같은 문제가 발생할 수 있어. 이런 문제를 방지하기 위해 Java는 동기화(synchronization)와 같은 기능을 제공해. 동기화는 특정 코드 블록에 여러 스레드가 동시에 접근하지 못하게 하여 데이터의 일관성을 유지하는 방법이야.

요약하자면, Java의 자동 메모리 관리는 메모리 관리를 자동화하여 개발자의 부담을 덜어주고, 멀티 스레딩 지원은 프로그램이 더 효율적으로 실행될 수 있도록 여러 작업을 동시에 수행하게 해줘. 이 두 기능 덕분에 Java는 안정적이고 성능이 좋은 프로그램을 쉽게 개발할 수 있는 언어로 자리 잡았어.



프로그래밍의 3대 요소 (변수 Variable, 자료형 Data Type, 할당 Assign)

 

변수는 기억 공간을 만드는 것

그 기억 공간에 어떤 종류의 데이터를 넣을 것인지를 결정해야 하는데 그게 자료형

그래서 변수와 자료형이 만나면, 그걸 변수 선언 이라고 함.

(예를 들어, int a;, a 라는 이름의 기억 공간이 생겼고 그 메모리에는 int 라는 자료형만 넣을 수 있다.)

그래서 데이터를 저장하는 걸 할당이라고 함.  a = 10; 이라고 하면 10을 할당.

 

추가로 조금 더 설명하자면, 변수 선언은 프로그램에서 필요한 데이터를 저장할 메모리 공간을 예약하는 과정이야. 이때, 자료형은 이 공간에 어떤 종류의 데이터가 들어갈지를 지정해 주는 것이지. Java에서는 int, double, char 같은 다양한 자료형이 있고, 이 자료형에 따라 필요한 메모리 크기가 다르기 때문에 자료형을 명시해 주는 것이 중요해.

또한, 변수 선언 후 데이터를 할당(저장)하면, 그 값은 메모리에 기록되어 프로그램이 필요할 때마다 해당 값을 가져와 사용할 수 있어. 변수에 값을 할당할 때마다 메모리에 있는 값이 변경되기 때문에 a = 10; 후에 a = 20;으로 바꿀 수도 있지.

"symbol"과 "initialization"도 변수와 관련해서 중요한 개념이야.

1. Symbol (심볼)

Java에서 "심볼"은 프로그램에서 사용되는 변수, 메소드, 클래스, 인터페이스, 패키지 등을 지칭하는 이름이야. 예를 들어, int a;에서 a라는 이름은 변수 심볼(symbol)이라고 할 수 있어. 심볼은 코드에서 변수나 메소드의 이름을 통해 어떤 데이터나 로직을 참조하고자 할 때 사용돼. 컴파일러는 심볼을 사용해 이 변수가 무엇을 의미하는지, 어디에 선언되었는지 확인해 주지.

예시:

java
Copy code
int number = 10;

여기서 number라는 이름이 변수의 심볼이야. 심볼을 통해 컴파일러가 number가 어떤 변수인지, 자료형은 무엇인지 이해할 수 있어.

2. Initialization (초기화)

초기화는 변수를 선언한 후에 처음 값을 할당하는 과정을 말해. 변수를 사용할 때, 반드시 초기화를 해야만 정상적으로 값을 사용할 수 있어. 초기화를 하지 않고 변수를 사용하려고 하면 컴파일 에러가 발생할 수 있어, 특히 Java 같은 언어에서는 초기화가 필수야.

변수 선언과 초기화의 차이

  • 선언: 변수 이름과 자료형을 지정해서 메모리 공간을 예약하는 것. (예: int age;)
  • 초기화: 변수를 처음 사용할 때 값을 지정해 주는 것. (예: age = 25;)

초기화의 두 가지 방법:

  1. 선언과 동시에 초기화: 변수 선언과 초기화를 한 줄에서 동시에 할 수 있어.
    java
    Copy code
    int age = 25;
  2. 나중에 초기화: 변수를 선언한 뒤 나중에 값을 할당할 수도 있어.
    java
    Copy code
    int age; // 선언 age = 25; // 초기화

초기화를 통해 변수에 특정 값이 들어가도록 지정해 주는 것이므로, 프로그램이 실행될 때 어떤 값이 있는지 명확해지고, 오류를 예방할 수 있어.


Java에서 **자료형(Data Type)**은 변수에 저장할 수 있는 데이터의 크기와 종류를 결정해. 자료형은 크게 **기본 자료형(Primitive Types)**과 **참조 자료형(Reference Types)**으로 나뉘어. 여기에 각 자료형의 크기와 용도를 정리해 줄게.


1. 기본 자료형 (Primitive Types)

Java의 기본 자료형은 총 8개야. 숫자, 문자, 논리 값 등을 저장할 때 사용되고, 메모리 크기와 데이터 범위가 정해져 있어.

1) 정수형 (Integers)

정수를 저장할 때 사용돼. 크기와 저장 가능한 값의 범위는 다음과 같아:

자료형크기 (byte)값의 범위

byte 1 -128 ~ 127
short 2 -32,768 ~ 32,767
int 4 -2,147,483,648 ~ 2,147,483,647
long 8 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
  • byte: 아주 작은 데이터를 저장할 때 (예: 파일 크기, 네트워크 데이터).
  • int: 가장 일반적으로 사용하는 정수 자료형.
  • long: 큰 정수를 다룰 때 사용 (long 값을 사용할 땐 숫자 끝에 L을 붙임: long num = 100L;).

2) 실수형 (Floating-point numbers)

소수점이 있는 숫자를 저장할 때 사용돼.

자료형크기 (byte)값의 범위 (근사값)정밀도 (소수점 자릿수)

float 4 ±3.4e−38 ~ ±3.4e38 약 7자리
double 8 ±1.7e−308 ~ ±1.7e308 약 15자리
  • float: 메모리를 아끼면서 소수점을 표현해야 할 때 (float 값을 사용할 땐 끝에 F를 붙임: float num = 3.14F;).
  • double: 소수점 계산이 더 정밀해야 할 때 사용. Java에서 기본 실수 자료형.

3) 문자형 (Character)

문자를 저장할 때 사용돼.

  • char: 2 byte, 유니코드 문자(글자나 기호)를 저장. 값의 범위는 '\u0000' ~ '\uffff' (0 ~ 65,535).
    java
    Copy code
    char c = 'A';

4) 논리형 (Boolean)

참/거짓을 저장할 때 사용.

  • boolean: 1 bit, true 또는 false만 저장.
    java
    Copy code
    boolean isActive = true;

2. 참조 자료형 (Reference Types)

참조 자료형은 객체의 주소를 저장해. 객체(클래스, 배열 등)와 관련된 데이터를 다룰 때 사용돼.

주요 참조 자료형:

  • String: 문자열 데이터를 저장.
    java
    Copy code
    String name = "Java";
  • 배열: 동일한 자료형의 데이터를 여러 개 저장.
    java
    Copy code
    int[] numbers = {1, 2, 3, 4};
  • 클래스와 인터페이스: 사용자 정의 객체를 참조.

3. 자료형 크기와 선택 기준

  • 정수형: 데이터 크기에 따라 byte, short, int, long 중 선택.
    • 일반적으로 int를 사용하고, 아주 큰 값을 다룰 때만 long을 사용.
  • 실수형: 계산 정밀도에 따라 float 또는 double 중 선택.
    • Java에서는 기본적으로 double을 사용.
  • 문자형: 하나의 문자를 저장할 때 char 사용.
  • 논리형: 조건문이나 논리값 비교에서 boolean 사용.

이렇게 자료형을 잘 선택하면 메모리를 효율적으로 사용할 수 있고, 프로그램도 더 안정적으로 작성할 수 있어!


long, float, double 뒤에는 l, f, d 를 붙여줘야 한다고 하는데, 대문자든 소문자든 상관이 없는거야? 어떻게 되는거야?

좋은 질문이야! Java에서 long, float, double 자료형 뒤에 붙이는 L, F, D는 숫자 리터럴(literal)을 특정 자료형으로 명확히 지정하기 위한 것이야. 여기서 대소문자의 차이를 설명해 줄게.


1. L, F, D의 대소문자

  • Java는 대문자소문자 모두 허용해. 즉, l, f, d나 L, F, D 모두 사용할 수 있어.
  • 하지만 대문자를 사용하는 것이 권장돼. 이유는 소문자 l과 숫자 1이 비슷하게 보일 수 있기 때문이야.

예시:

long num1 = 1000000L;  // 권장
long num2 = 1000000l;  // 허용되지만 권장하지 않음 (숫자 1과 헷갈릴 수 있음)

2. 자료형별 리터럴 사용

리터럴 뒤에 L, F, D를 붙이는 규칙은 다음과 같아:

long

  • 기본적으로 숫자 리터럴은 int로 간주돼. 숫자가 int의 범위를 벗어나거나 명시적으로 long 타입을 지정하려면 L 또는 l을 붙여야 해.
long largeNumber = 10000000000L; // long 리터럴 (대문자 권장)

float

  • 기본적으로 소수점이 있는 숫자는 double로 간주돼. 명시적으로 float 타입으로 지정하려면 F 또는 f를 붙여야 해.
float pi = 3.14F;  // float 리터럴

double

  • double은 기본 자료형이므로 사실 D나 d를 붙이지 않아도 돼. 하지만 명시적으로 붙일 수는 있어.
double precise = 3.14;   // D 생략 가능
double another = 3.14D;  // 명시적 double 리터럴

3. 대문자를 권장하는 이유

특히 **L**은 대문자로 사용하는 것이 중요해. 소문자 l은 숫자 1과 헷갈리기 쉬워 코드 가독성을 떨어뜨릴 수 있어:

long value = 10L;  // 대문자 L 사용 (권장)
long value2 = 10l; // 소문자 l 사용 (헷갈릴 수 있음)

4. 요약

  • 대문자와 소문자는 모두 허용되지만, 대문자를 사용하는 것이 권장돼.
  • L: long 리터럴 (대문자 사용 필수적으로 권장)
  • F: float 리터럴
  • D: double 리터럴 (선택 사항)

실제로는 L과 F가 더 많이 사용되고, D는 자주 생략돼. 가독성을 위해 항상 대문자를 사용하는 습관을 들이는 것이 좋아!


참고1 : 1 byte 는 8bit, 그러니까 int 는 4 byte = 32 bit. 즉, 2의 32승까지의 숫자만 입력가능하다는 것.

 

참고2 : char 의 경우에는 문자 표현을 ' ' 로 해야 하고, String 의 경우에는 " " 로 해야 함.


Java에서 **Thread(스레드)**는 프로그램에서 동시에 여러 작업을 실행할 수 있게 하는 작은 작업 단위야. 스레드는 운영 체제와 프로그램이 작업을 더 효율적으로 처리하도록 도와주는 중요한 개념이야. 이제 스레드의 의미와 활용을 구체적으로 설명해 줄게.


1. 스레드(Thread)의 기본 개념

  • 스레드란?
    • 하나의 프로세스(실행 중인 프로그램) 안에서 실행되는 가장 작은 실행 단위.
    • 프로세스는 운영 체제가 관리하는 작업 단위이고, 스레드는 그 프로세스 안에서 실제로 작업을 실행하는 주체야.
    • 예를 들어, 웹 브라우저를 생각해 보면:
      • 하나의 프로세스: 웹 브라우저 전체.
      • 여러 스레드: 화면을 렌더링하는 스레드, 네트워크 요청을 처리하는 스레드, 사용자 입력을 처리하는 스레드 등이 있어.
  • 스레드와 멀티태스킹
    • Java에서는 **멀티스레딩(Multi-threading)**을 지원해서 하나의 프로그램 안에서 여러 스레드가 동시에 실행되도록 할 수 있어.
    • 이로 인해 프로그램이 더 빠르고 효율적으로 동작할 수 있어. 예를 들어, 비디오를 재생하면서 자막을 동기화하거나, 파일을 다운로드하는 동안 화면을 업데이트할 수 있지.

자료형의 종류는 크게 3가지로 나누어서 생각하면 이해하기 편함.

 

1. java 에서 기본으로 제공하는 자료형 (예: int, char)

--> 그래서 컴파일러가 기본적으로 찾을 수가 있음.

 

2. java 에서 제공하긴 하는데 기본으로 제공하는 건 아니고 클래스로 만들어서 제공하는 자료형 (예: String)

--> class를 만들때 맨 앞 글자는 대문자로 하는 규칙이 있는데 String이 그래서 S가 대문자였던 것

--> java가 기본으로 제공하는게 아니니까 컴파일러가 찾지를 못 함. 그래서  java.lang.String 이라고 알려줘야 함.

--> String 클래스 안에 여러 메서드가 있으니 여러 조작을 해볼 수가 있음.

 

3. java 에서 제공하지 않는 자료형이라서 사용자(나) 정의 자료형, 즉 본인이 직접 정의를 하는 것. 그게 바로 class.

class 는 그러니까 객체지향 이라는 표현으로 생각하기 보다는, 사용자 지정 자료형으로 생각해도 좋음.


Java의 String 클래스가 java.lang 패키지에 포함되어 있고, 자동으로 임포트(import)되므로 별도로 선언하지 않아도 사용할 수 있다는 점을 더 구체적으로 설명해 줄게.


1. java.lang 패키지란?

Java에서 java.lang 패키지는 가장 기본적인 클래스들과 인터페이스를 모아놓은 표준 라이브러리 패키지야. 이 패키지는 Java 프로그램의 핵심적인 기능을 제공하고, 모든 Java 프로그램에서 기본적으로 사용되도록 설계되었어.

java.lang 패키지의 특징:

  • 자동 임포트:
    • Java에서 java.lang 패키지에 속한 클래스는 자동으로 사용 가능하며, 다른 패키지처럼 import 문을 명시할 필요가 없어.
    • 즉, String, Math, Integer 같은 클래스들을 직접 사용할 수 있어.
// import java.lang.String; // 명시적으로 쓸 필요가 없음
String text = "Hello";
  • 주요 클래스들:
    • String, Object, Math, Integer, Double, Boolean 등 자주 쓰이는 클래스들이 포함돼 있어.

2. String 클래스와 java.lang

String 클래스는 java.lang 패키지 안에 포함되어 있어서, Java 프로그램에서 별도의 import 없이 바로 사용할 수 있어. java.lang은 모든 Java 프로그램에서 기본적으로 포함되기 때문에 특별히 신경 쓸 필요가 없어.

예시:

public class Main {
    public static void main(String[] args) {
        String text = "Hello, World!"; // String 사용
        System.out.println(text.toUpperCase()); // String 메서드 호출
    }
}

여기서 String은 별도로 패키지를 지정하지 않았지만 문제없이 작동해. 이는 java.lang 패키지에 포함된 클래스이기 때문이야.


3. 자동 임포트가 없는 경우

java.lang 외의 다른 패키지에 속한 클래스들은 자동으로 임포트되지 않아. 이런 경우에는 import 문을 사용해 패키지를 명시적으로 지정해야 해.

예시:

  • java.util.ArrayList는 자동 임포트되지 않음:
import java.util.ArrayList; // 명시적으로 임포트해야 함

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java");
        System.out.println(list);
    }
}

4. 자동 임포트의 이점

Java에서 java.lang 패키지의 클래스들은 너무 자주 사용되기 때문에 자동으로 포함되도록 설계되었어. 예를 들어:

  • String 클래스: 거의 모든 프로그램에서 문자열 처리를 위해 사용됨.
  • Math 클래스: 수학 계산이 자주 필요하기 때문.
  • Object 클래스: 모든 클래스의 최상위 클래스이므로 반드시 포함.

자동 임포트는 개발자가 불필요하게 코드를 작성하는 수고를 줄여주고, 프로그램 작성 속도를 높여 줘.


5. java.lang.String을 명시적으로 써야 하는 경우

가끔 String이라는 이름을 가진 사용자 정의 클래스다른 패키지의 클래스와 충돌이 발생할 수 있어. 이럴 때 **java.lang.String**을 명시적으로 사용하면 충돌을 방지할 수 있어.

예시:

package custom;

class String {
    public void print() {
        System.out.println("This is a custom String class.");
    }
}

// 메인 클래스
public class Main {
    public static void main(String[] args) {
        custom.String customString = new custom.String();
        customString.print(); // 사용자 정의 String 사용

        java.lang.String originalString = "Hello, World!";
        System.out.println(originalString.toUpperCase()); // java.lang.String 사용
    }
}

요약

  • java.lang 패키지는 Java에서 자주 사용하는 클래스들을 포함하며, **자동으로 임포트(import)**되므로 추가적인 선언 없이 사용할 수 있어.
  • String 클래스는 이 패키지의 일부로, 별도의 임포트 없이 문자열 생성과 조작이 가능해.
  • 자동 임포트는 코드 가독성과 작성 속도를 높이는 데 큰 도움이 되며, 특히 String, Object, Math 등 자주 쓰이는 클래스에서 유용해.

**lang**이라는 단어는 일반적으로 language(언어)의 약어로 사용돼요. Java의 java.lang 패키지에서 **lang**는 "language"를 의미하며, Java 언어의 기본적인 구성 요소를 포함하는 패키지를 나타내요.

java.lang에서의 의미:

  • **lang**는 Java 언어와 관련된 필수적인 기능을 제공하는 패키지라는 뜻으로 사용돼.
  • Java 프로그램에서 없어서는 안 될 기본 클래스들(예: String, Math, Object)이 포함되어 있어.

일반적인 사용:

lang은 컴퓨터 프로그래밍 문맥 외에도 종종 language를 간단히 나타내기 위해 사용돼:

  • lang: 언어의 약어 (예: java.lang → Java 언어 관련).
  • 예시:
    • HTML에서 <html lang="en">는 문서의 언어를 "영어"로 설정함.
    • 특정 프로그래밍 언어의 약어로 사용됨 (예: prog-lang → programming language).

Java의 lang 패키지는 이름에서 알 수 있듯이 Java 언어의 가장 기초적인 기반을 제공하는 중요한 역할을 하는 거지. 😊


Java에서 2진수, 8진수, 16진수는 숫자를 다른 진법으로 표현할 때 사용돼. Java는 각각의 진수를 명확히 구분하기 위해 특별한 접두사를 사용해. 아래에서 각각의 표현 방법을 자세히 설명해줄게!


1. 2진수 (Binary)

  • 접두사: 0b 또는 0B를 사용해 2진수를 표시.
  • 사용 예시:
int binaryNumber = 0b1010; // 2진수: 10 (십진수로 10)
System.out.println(binaryNumber); // 출력: 10
  • 특징:
    • 0b 뒤에 0과 1로만 구성된 숫자를 작성.
    • 자주 사용하는 경우: 비트 연산, 플래그 설정.

2. 8진수 (Octal)

  • 접두사: 0을 사용해 8진수를 표시.
  • 사용 예시:
int octalNumber = 012; // 8진수: 12 (십진수로 10)
System.out.println(octalNumber); // 출력: 10
  • 특징:
    • 0 뒤에 0~7 사이의 숫자를 작성.
    • 주로 과거에 사용되던 방식으로, 현대에는 잘 쓰이지 않음.

3. 16진수 (Hexadecimal)

  • 접두사: 0x 또는 0X를 사용해 16진수를 표시.
  • 사용 예시:
int hexNumber = 0xA; // 16진수: A (십진수로 10)
int hexNumber2 = 0x1F; // 16진수: 1F (십진수로 31)
System.out.println(hexNumber);  // 출력: 10
System.out.println(hexNumber2); // 출력: 31
  • 특징:
    • A는 10, B는 11, ..., F는 15를 의미.
    • 자주 사용하는 경우: 색상 코드, 메모리 주소 표현.

4. 통합 예제

다양한 진법으로 표현된 값을 출력하는 프로그램:

public class Main {
    public static void main(String[] args) {
        int binary = 0b1010;   // 2진수
        int octal = 012;      // 8진수
        int decimal = 10;     // 10진수
        int hexadecimal = 0xA; // 16진수

        System.out.println("2진수: " + binary);      // 출력: 10
        System.out.println("8진수: " + octal);       // 출력: 10
        System.out.println("10진수: " + decimal);    // 출력: 10
        System.out.println("16진수: " + hexadecimal); // 출력: 10
    }
}

5. 숫자 구분을 위한 밑줄 사용

Java 7부터는 큰 숫자를 읽기 쉽게 하기 위해 **밑줄(_)**을 사용할 수 있어.

  • 사용 예시:
int binary = 0b1010_1010;  // 2진수
int octal = 01_234;        // 8진수
int decimal = 1_000_000;   // 10진수
int hexadecimal = 0xFF_AA; // 16진수

System.out.println(binary);       // 출력: 170
System.out.println(octal);        // 출력: 668
System.out.println(decimal);      // 출력: 1000000
System.out.println(hexadecimal);  // 출력: 65450

요약

  • 2진수: 0b로 시작 (예: 0b1010)
  • 8진수: 0으로 시작 (예: 012)
  • 16진수: 0x로 시작 (예: 0xA)

 

10진수의 수를 2진수, 8진수, 16진수의 형태로 출력하는 코드는 어떻게 되는거야?

Java에서는 Integer 클래스의 내장 메서드를 사용하면 10진수를 2진수, 8진수, 16진수로 변환할 수 있어. toBinaryString, toOctalString, toHexString 메서드를 활용하면 간단히 구현할 수 있지.

아래는 예제 코드와 함께 자세히 설명할게.


코드 예제: 10진수를 2진수, 8진수, 16진수로 변환

public class Main {
    public static void main(String[] args) {
        int decimal = 42; // 10진수 숫자

        // 2진수 변환
        String binary = Integer.toBinaryString(decimal);
        System.out.println("2진수: " + binary);

        // 8진수 변환
        String octal = Integer.toOctalString(decimal);
        System.out.println("8진수: " + octal);

        // 16진수 변환
        String hexadecimal = Integer.toHexString(decimal);
        System.out.println("16진수: " + hexadecimal);
    }
}

 


실행 결과

만약 decimal = 42라고 설정했다면:

2진수: 101010
8진수: 52
16진수: 2a

주요 메서드 설명

  1. Integer.toBinaryString(int number)
    • 입력된 정수를 2진수 문자열로 변환.
    • 예: Integer.toBinaryString(42) → "101010"
  2. Integer.toOctalString(int number)
    • 입력된 정수를 8진수 문자열로 변환.
    • 예: Integer.toOctalString(42) → "52"
  3. Integer.toHexString(int number)
    • 입력된 정수를 16진수 문자열로 변환.
    • 소문자 a~f로 출력.
    • 예: Integer.toHexString(42) → "2a"

16진수 대문자로 출력하기

Java의 16진수 변환 결과는 기본적으로 소문자로 출력돼. 대문자로 출력하려면 toUpperCase() 메서드를 추가로 사용하면 돼.

String hexadecimalUpper = Integer.toHexString(decimal).toUpperCase();
System.out.println("16진수 (대문자): " + hexadecimalUpper);

출력:

16진수 (대문자): 2A

사용자 입력을 받아 변환하는 코드 예제

아래는 사용자로부터 10진수를 입력받아 2진수, 8진수, 16진수로 출력하는 코드야.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 사용자 입력
        System.out.print("10진수 숫자를 입력하세요: ");
        int decimal = scanner.nextInt();

        // 변환 및 출력
        System.out.println("2진수: " + Integer.toBinaryString(decimal));
        System.out.println("8진수: " + Integer.toOctalString(decimal));
        System.out.println("16진수: " + Integer.toHexString(decimal).toUpperCase());
    }
}

실행 예시

입력:

10진수 숫자를 입력하세요: 255
 

출력:

2진수: 11111111
8진수: 377
16진수: FF

요약

  • 10진수를 2진수: Integer.toBinaryString()
  • 10진수를 8진수: Integer.toOctalString()
  • 10진수를 16진수: Integer.toHexString()
  • toUpperCase()를 사용해 16진수 출력 결과를 대문자로 변환 가능.