본문 바로가기
Java

자바 코어 (1) – Java 언어 기초

by gentle-tiger 2025. 6. 4.
프로젝트를 진행하면서 조금은 소홀했던 자바 기초에 대해서 다시 한번 복습하고자 합니다. 
자바 코어 → 자바 스레드 → 자바 OOP → 자바의 예외 → 자바의 컬렉션 → 최대 절전 모드 순으로 정리할 예정입니다. 

 

Java 언어 기초 목차

  1. 자바에서 객체란?
  2. 자바에서 바이트코드란?
  3. 포인터란 무엇이며 Java는 포인터를 지원할까요?
  4. 모든 클래스의 기본 클래스는 무엇일까요?
  5. Java는 정적 또는 동적으로 유형이 지정되는언어인가요?
  6. Java의 인수는 참조 또는 값으로 전달될까요?
  7. 유니코드란?

 

자바에서 객체란? 

자바에서 객체란 클래스의 인스턴스로, 현실에 존재하는 사물 또는 개념 등을 추상화한 것입니다. 객체는 상태(field)과 동작(method) 가지는데, 이를 통해 현실에서 존재하는 것들을 소프트웨어적으로 추상화할 수 있습니다. 예를 들어, 자동차를 나타내는 Car 클래스가 있다면, 색상이나 속도는 속성이 되고, 주행이나 정지는 행위가 됩니다. 

class Car {
    String brand;
    void drive() {
        System.out.println("Driving...");
    }
}
Car myCar = new Car(); // 객체 생성

 

자바는 이러한 객체를 통해 필요한 상황에서 해당 클래스를 인스턴스화 하여 객체로 사용합니다. 동일한 객체를 인스턴스로 생성하여 사용할 수 있고, 한 클래스 내에서 속성(field)이나 행위(method)를 추가할 수 있어 재사용성과 확장성이 높습니다. 객체는 new 키워드로 생성하며, 메모리에 로그된 객체는 JVM의 힙 영역에 존재하고, 해당 객체에 대한 참조는 변수는 스택 메모리에 저장됩니다.  

 

 

자바에서 바이트코드란?

자바에서 작성한 .java 파일은 컴파일러(javac)에 의해 .class 확장자를 가진 바이트코드로 변환됩니다. 바이트코드는 JVM에서 실행 가능한 중간 코드이며, CPU나 운영체제에 종속되지 않아, 다양한 환경에서 동일하게 실행될 수 있다는 장점이 있습니다. 바이트코드는 JVM이 인터프리터를 통해 해석하거나, JIT(Just-In-Time) 컴파일러가 런타임에 기계어로 변환하여 실행합니다. JVM을 통해 실행되는 과정에서 메모리 관리, 보안, 클래스 로딩 등의 기능이 함께 제공되어, 이식성, 보안성, 안정성을 중시하는 환경에 매우 적합합니다.

 

 

포인터랑 무엇이며 Java는 포인터를 지원할까요? 

포인터는 메모리 주소를 직접 가리키는 변수입니다. C/C++ 등에서도 메모리를 효율적으로 조작하기 위해 자주 사용됩니다. 포인터를 사용하면 변수의 주소를 참조하거나 간접적으로 값을 변경하는 것이 가능합니다. 하지만 메모리 누수나 잘못 접근을 통한 값 변경 등의 위험이 있습니다. 자바는 이러 위험을 제거하기 위해 포인터를 지원하지 않으며, 메모리 관리를 JVM에 위임했습니다. 대신 객체에 대한 참조(reference)를 통해 간접적인 접근을 제공합니다. 이 참조는 내부적으로 메모리 주소를 포함하고 있지만, 개발자가 해당 주소를 직접 조작할 수 없도록 되어 있습니다. 이를 통해 메모리 접근을 보다 안전하게 처리할 수 있으며, 개발자는 로직 구현에 집중할 수 있습니다.

 

 

모든 클래스의 기본 클래스는 무엇일까요? 

자바의 클래스 계층 구조에서 java.lang.Object는 모든 클래스의 최상위 슈퍼클래스입니다. 어떤 클래스가 다른 클래스를 명시적으로 상속하지 않는 경우, 자동으로 Object를 상속받습니다. 이 구조를 통해 자바는 다형성(polymorphism)을 유연하게 지원할 수 있습니다. Object 클래스는 자바의 기본 동작을 정의한 여러 메서드를 포함합니다. 대표적으로 toString(), equals(), hashCode() 등이 있으며, 필요에 따라 해당 클래스에서 재정의(overriding)하여 사용할 수 있습니다.

 

 

Java는 정적 또는 동적으로 유형이 지정되는 언어인가요? 

자바는 정적 타입의 언어입니다. 정적 타입이란 변수나 메서드의 타입이 컴파일 시에 명확히 결정된다는 것을 의미합니다. 예를 들어 int x = 10;이라고 선언하면 x는 정수 타입으로 고정되며, 다른 타입의 값을 할당할 수 없습니다. 이를 통해 타 안정성을 보장하며 프로그램 오류를 컴파일 시점에 조기 발견할 수 있습니다. 자바 10부터는 지역 변수에 대해 var 키워드를 통한 타입 추론을 도입되었지만, 여전히 타입은 컴파일 시점에 추론됩니다. 즉, 런타임에 타입이 변경되거나 동적으로 바뀌지 않습니다. 이러한 정적 타입 시스템은 일정 수준의 제약을 부과하여 시스템의 안정성을 높이는 데 큰 도움이 됩니다.

 

 

 

Java의 인수는 참조 또는 값으로 전달될까요? 

자바는 모든 메서드 인수를 값으로 전달합니다. 하지만 객체를 인수로 전달할 경우, 해당 객체의 참조값이 복사되어 전달되므로 메서드 내에서 객체의 상태는 변경될 수 있습니다. 그러나 참조 자체를 다른 객체로 변경하면 호출자에게는 반영되지 않습니다.

void updateName(Person p) {
    p.setName("Updated"); // 내부 필드는 변경됨
    p = new Person("New"); // 참조 변경은 호출자에 반영되지 않음
}

 

예를 들어, new Person("New")는 새로운 객체가 힙에 생성됩니다. 메서드 내부에서 해당 참조 변수(p)를 이 새 객체로 변경해도, 이는 메서드 내 지역 변수의 참조만 바뀌는 것입니다. 호출자 쪽의 참조는 여전히 기존 객체를 가리키고 있으므로, 참조 자체가 변경되어 기존 객체를 덮어쓰는 일은 발생하지 않습니다.

 

 

유니코드란 무엇일까요? 

유니코드(Unicode)는 전 세계 모든 문자를 표현할 수 있는 범용 문자 인코딩 시스템입니다. 자바는 내부적으로 모든 문자열과 문자를 유니코드(UTF-16)로 처리하여 다양한 언어와 특수 문자 지원을 가능하게 합니다. 자바의 char 타입은 16비트로 구성되어 있으며, 한 개의 유니코드 문자를 표현할 수 있습니다. 유니코드 표기법은 \uXXXX 형식으로 사용되며, 이는 코드 포인트를 16진수로 표현한 것입니다. 예를 들어 \uAC00는 한글 ‘가’를 나타냅니다. 이처럼 자바는 유니코드를 사용하여 다국어 환경에서 안정적으로 동작할 수 있습니다. 자바의 String 클래스는 UTF-16 기반으로 작동하므로, 대부분의 국제 문자를 기본적으로 지원합니다.

char ch = '\uAC00';
System.out.println(ch); // 출력: 가