본문 바로가기
  • 🕊️ A Piece of Peace
🖥️ PC/JAVA

1. 자바 프로그래밍 언어의 이해와 기초

by Moom2n 2024. 6. 24.

자바(Java)는 1995년에 Sun Microsystems의 제임스 고슬링(James Gosling)이 개발한 객체 지향 프로그래밍 언어입니다. 자바는 처음부터 객체 지향 언어로 설계되었으며, 다양한 운영체제에서 동일한 바이트코드를 실행할 수 있는 특성을 가지고 있습니다. 이 글에서는 자바의 핵심 목표, 역사, 동작 과정, 기본 타입 및 연산 이슈, 그리고 객체 지향 프로그래밍의 기초에 대해 알아보겠습니다.

자바의 핵심 목표

자바 프로그래밍 언어는 다음과 같은 5가지 핵심 목표를 가지고 있습니다:

  1. 객체 지향 방법론을 사용해야 한다.
  2. 같은 프로그램(바이트코드)이 여러 운영체제(마이크로프로세서)에 탑재되어야 한다.
  3. 컴퓨터 네트워크 접근 기능이 기본적으로 탑재되어 있어야 한다.
  4. 원격 코드를 안전하게 실행할 수 있어야 한다.
  5. 다른 객체 지향 언어들의 좋은 부분만 가지고 와서 사용하기 편해야 한다.

자바의 역사

자바는 Sun Microsystems에 의해 개발되었으나, 이후 오라클이 Sun Microsystems를 인수하면서 자바에 대한 법적 권한은 오라클이 소유하게 되었습니다. 오라클은 자바를 유료로 전환했으며, 현재는 Eclipse 재단에서 만든 Temurin JDK가 많이 사용되고 있습니다. 무료 JDK도 오라클의 TCK(Technology Compatibility Kit)을 통해 호환성을 검증받고 있습니다.

자바 소프트웨어 플랫폼

자바 소프트웨어 플랫폼은 자바 언어로 작성된 프로그램을 개발하고 실행할 수 있는 소프트웨어 모임의 총칭입니다. 자바 프로그램은 OS와 HW에 의존하지 않는 바이트코드로 컴파일되며, JVM(Java Virtual Machine) 상에서 실행됩니다. 이는 "Write Once, Run Anywhere (WORA)"의 철학을 반영한 것입니다.

자바 동작 과정

 

자바 프로그램의 동작 과정은 다음과 같습니다:

  1. .java 파일을 작성합니다.
  2. 컴파일러(javac)를 사용하여 바이트코드(.class)로 변환합니다.
  3. JVM(인터프리터)이 각 하드웨어 아키텍처에 맞는 기계어로 변환하여 실행합니다.

JRE와 JDK의 차이점

  • JRE (Java Runtime Environment): 자바로 작성된 프로그램을 실행할 수 있는 환경으로, 컴파일러 없이 실행 패키지만 포함되어 있습니다.
  • JDK (Java Development Kit): 자바 프로그램을 개발할 수 있는 통합 개발 환경으로, 컴파일러, 자바 라이브러리 등이 포함되어 있습니다.

2024.06.24 - [🖥️ PC/JAVA] - 4. JDK와 JRE의 차이

자바 기본 타입

자바의 기본 타입은 다음과 같습니다:

  1. 정수형: int, long, short, byte
    • int의 범위는 약 20억 정도이며, 금융 등 큰 숫자를 다룰 때는 long 또는 BigInteger를 사용합니다.
  2. 부동소수점형: float, double
    • 무한대와 NaN(Not a Number) 등을 지원합니다.
  3. 문자형: char
  4. 불리언형: boolean
    • true와 false만 가질 수 있습니다.

자바 연산 이슈

자바에서는 산술 연산 시 주의해야 할 몇 가지 이슈가 있습니다:

  • 음수 모듈러 연산 시 Math.floorMod 메소드를 사용하면 항상 양수 결과를 얻을 수 있습니다.
  • 큰 숫자 연산 시 Math.multiplyExact 메소드를 사용하여 오버플로우를 방지할 수 있습니다.
  • 숫자 타입 변환 시 작은 타입을 큰 타입으로 변환하는 것은 합법적이지만, 큰 타입을 작은 타입으로 변환할 때는 주의가 필요합니다.

문자열 처리

자바에서 문자열은 String 클래스를 사용하여 처리합니다. String 클래스는 불변(immutable)이며, 문자열 연결은 + 연산자를 사용하거나 StringBuilder 클래스를 이용할 수 있습니다. 문자열 비교 시에는 == 연산자 대신 equals 메소드를 사용해야 합니다.

문자열 API

자바의 문자열 API는 다음과 같은 메소드를 제공합니다:

  • startsWith(String str), `endsWith(String str) : 문자열이 지정한 접두사(str)로 시작하거나 끝나는지 확인합니다.
  • contains(CharSequence str): 문자열이 지정한 문자열을 포함하는지 검사합니다.
  • indexOf(String str), lastIndexOf(String str): 전체 문자열에서 지정한 문자열이 처음 또는 마지막으로 나타나는 위치를 반환합니다.
  • replace(CharSequence oldString, CharSequence newString): 지정한 문자열을 다른 문자열로 교체한 결과를 반환합니다.
  • toUpperCase(), toLowerCase(): 문자열을 대문자 또는 소문자로 변환합니다.
  • trim(): 문자열 앞뒤의 공백을 제거합니다.

문자열을 비교할 때는 주의해야 할 점들이 있습니다. 특히 == 연산자를 사용해 문자열을 비교하는 것은 피해야 합니다. 그 이유는 == 연산자는 메모리 상에서 같은 객체일 때만 true를 반환하기 때문입니다. 대신 equals() 메서드를 사용해야 합니다. 또한, 대소문자를 구별하지 않고 비교할 때는 equalsIgnoreCase() 메서드를 사용합니다.

객체 지향 프로그래밍 (OOP)

자바는 객체 지향 프로그래밍 언어입니다. 객체 지향 프로그래밍(OOP)은 프로그램을 객체 단위로 나누어, 객체들 간의 상호작용을 통해 전체 프로그램을 구성하는 방법론입니다.

객체 지향의 기본 개념

  • 클래스: 객체를 코드로 구현한 설계도입니다.
  • 객체(Object): 클래스로부터 생성된 인스턴스입니다.
  • 메서드(Method): 객체의 기능을 구현하는 함수입니다.
  • 멤버 변수(Field): 객체가 가지는 속성을 나타내는 변수입니다.

클래스와 객체의 예

public class Student {
    // 멤버 변수
    private String id;
    private String name;
    private String address;

    // 생성자
    public Student(String id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    // 메서드
    public void displayInfo() {
        System.out.println("ID: " + id);
        System.out.println("Name: " + name);
        System.out.println("Address: " + address);
    }
}

객체 생성 및 사용

public class Main {
    public static void main(String[] args) {
        // 객체 생성
        Student studentLee = new Student("12345", "Lee", "Seoul");

        // 메서드 호출
        studentLee.displayInfo();
    }
}

메모리 구조

  1. 인스턴스: 클래스에서 생성된 객체로, 힙 메모리에 저장됩니다.
  2. 힙 메모리: 객체의 멤버 변수가 저장되는 메모리 영역입니다.
  3. 스택 메모리: 메서드 호출 시 지역 변수와 참조 변수가 저장되는 메모리 영역입니다.

가비지 컬렉션

자바는 가비지 컬렉터(Garbage Collector, GC)를 통해 사용하지 않는 객체를 자동으로 메모리에서 해제합니다. 이는 C 언어의 malloc과 free 함수와 달리 메모리 관리를 자동으로 처리해주는 기능입니다.

주문 클래스 생성

이제 간단한 주문 클래스를 생성해보겠습니다. 이 클래스는 주문 번호, 고객 이름, 상품 이름, 수량을 멤버 변수로 가지며, 주문 정보를 출력하는 메서드를 포함합니다.

 

public class Order {
    // 멤버 변수
    private String orderId;
    private String customerName;
    private String productName;
    private int quantity;

    // 생성자
    public Order(String orderId, String customerName, String productName, int quantity) {
        this.orderId = orderId;
        this.customerName = customerName;
        this.productName = productName;
        this.quantity = quantity;
    }

    // 주문 정보 출력 메서드
    public void displayOrderInfo() {
        System.out.println("Order ID: " + orderId);
        System.out.println("Customer Name: " + customerName);
        System.out.println("Product Name: " + productName);
        System.out.println("Quantity: " + quantity);
    }
}

주문 클래스 사용

public class Main {
    public static void main(String[] args) {
        // 주문 객체 생성
        Order order1 = new Order("001", "John Doe", "Laptop", 2);

        // 주문 정보 출력
        order1.displayOrderInfo();
    }
}

결론

자바는 객체 지향 프로그래밍을 기반으로 한 강력한 언어로, 여러 운영체제에서 동일한 바이트코드를 실행할 수 있는 장점을 가지고 있습니다. 자바의 기본 타입, 연산 이슈, 문자열 처리, 객체 지향 프로그래밍 개념 등을 이해하면 자바 프로그램을 효율적으로 작성할 수 있습니다. 더 나아가 실제 프로젝트에서 자바의 다양한 기능을 활용하여 안정적이고 확장 가능한 프로그램을 개발할 수 있습니다.