반응형
 

클래스와 객체

프로그래밍 언어에서 클래스(Class)와 객체(Object)는 객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념입니다. 이를 이해하면 복잡한 문제를 더 구조적이고 효율적으로 해결할 수 있습니다. 이 글에서는 클래스와 객체의 개념을 설명하고, 자바(Java)에서 이를 다루는 방법을 예시와 함께 소개합니다.


클래스(Class)란?

클래스는 객체를 생성하기 위한 청사진(Blueprint)이나 설계도입니다. 클래스는 데이터(필드)와 이 데이터를 조작하는 메서드로 구성됩니다. 예를 들어, 현실 세계에서 "자동차"는 하나의 클래스에 해당할 수 있습니다. 이 클래스는 다음과 같은 속성과 동작을 가질 수 있습니다:

  • 속성(필드): 색상, 제조사, 속도
  • 동작(메서드): 가속하기, 브레이크 밟기, 방향 전환

자바에서 클래스는 class 키워드를 사용하여 정의됩니다.

public class Car {
    // 필드
    String color;
    String manufacturer;
    int speed;

    // 메서드
    void accelerate() {
        speed += 10;
        System.out.println("속도가 증가했습니다. 현재 속도: " + speed);
    }

    void brake() {
        speed -= 10;
        if (speed < 0) {
        	speed = 0;
    	}
        System.out.println("속도가 감소했습니다. 현재 속도: " + speed);
    }
}

객체(Object)란?

객체는 클래스로부터 생성된 실제 사용 가능한 인스턴스(instance)입니다. 자동차라는 클래스를 정의한 후, "빨간 자동차"와 "파란 자동차"는 각각 클래스의 인스턴스, 즉 객체가 됩니다. 객체는 클래스가 정의한 속성과 메서드를 사용하여 동작합니다.

자바에서 객체는 new 키워드를 사용하여 생성됩니다.

public class Main {
	public static void main(String[] args) {
        // Car 클래스의 객체 생성
        Car myCar = new Car();

        // 객체의 필드 초기화
        myCar.color = "빨간색";
        myCar.manufacturer = "현대";
        myCar.speed = 0;

        // 객체의 메서드 호출
        myCar.accelerate();
        myCar.brake();
    }
}

출력 결과는 다음과 같습니다:

 
속도가 증가했습니다. 현재 속도: 10
속도가 감소했습니다. 현재 속도: 0

클래스와 객체의 관계

클래스와 객체의 관계는 "설계도와 제품"에 비유할 수 있습니다.

  • 클래스는 설계도이며, 객체는 설계도를 기반으로 만들어진 실제 제품입니다.
  • 클래스는 객체의 구조와 동작을 정의하고, 객체는 이를 활용하여 실제 작업을 수행합니다.

자바에서 클래스와 객체 활용하기

자바에서 클래스와 객체를 사용하는 일반적인 과정은 다음과 같습니다:

  1. 클래스 정의: 객체의 구조와 동작을 정의합니다.
  2. 객체 생성: 클래스의 인스턴스를 생성합니다.
  3. 필드 및 메서드 사용: 생성된 객체를 통해 데이터를 저장하거나 조작합니다.

다음은 또 다른 간단한 예입니다:

public class Person {
    // 필드
    String name;
    int age;

    // 메서드
    void introduce() {
	    System.out.println("안녕하세요, 제 이름은 " + name + "이고, 나이는 " + age + "살입니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        // Person 클래스의 객체 생성
        Person person = new Person();

        // 객체의 필드 초기화
        person.name = "홍길동";
        person.age = 25;

        // 객체의 메서드 호출
        person.introduce();
    }
}

출력 결과는 다음과 같습니다:

 
안녕하세요, 제 이름은 홍길동이고, 나이는 25살입니다.

마치며

클래스와 객체는 자바를 포함한 객체 지향 프로그래밍 언어에서 매우 중요한 요소입니다. 클래스를 사용하면 코드 재사용성을 높이고, 객체를 사용하면 데이터와 동작을 논리적으로 묶을 수 있습니다. 자바의 클래스와 객체를 잘 활용하면 복잡한 문제도 체계적으로 해결할 수 있습니다.

반응형

'개발 부트캠프 > 백엔드' 카테고리의 다른 글

[Java] 상속, 오버로딩, 오버라이딩  (1) 2025.01.03
[Java] static  (0) 2025.01.03
[Java] 패키지 & 접근 제어자  (0) 2025.01.03
[Java] 생성자  (0) 2025.01.03
[Java] GC(Garbage Collection)  (2) 2024.12.06
반응형

GC(Garbage Collection)란 무엇인가?

애플리케이션 개발을 하다 보면 "메모리 관리"라는 단어를 종종 듣게 됩니다. 특히, Java와 같은 언어에서는 개발자가 직접 메모리를 관리하지 않아도, 프로그램 실행 중에 메모리를 자동으로 관리하는 GC(Garbage Collection) 기능이 제공됩니다. 그렇다면 GC는 정확히 무엇이고, 왜 중요한 것일까요? 이번 포스팅에서는 GC의 개념과 작동 원리, 그리고 실제로 모니터링하거나 최적화할 때 알아두면 좋은 정보들을 정리해 보았습니다.


GC란?

**GC(Garbage Collection)**은 더 이상 필요하지 않은 객체를 자동으로 제거하여 메모리를 해제하는 기능입니다. 쉽게 말해, 애플리케이션이 사용하지 않는 메모리를 탐지하고 이를 정리해주는 자동 청소기라고 할 수 있습니다.

GC는 수동으로 메모리를 관리해야 했던 과거 언어(C, C++ 등)와 달리, 메모리 누수(memory leak)와 같은 문제를 효과적으로 해결할 수 있도록 설계되었습니다. Java, Python, .NET 등 많은 언어가 GC를 지원합니다.


GC의 역할

GC는 다음과 같은 작업을 수행합니다:

  1. 불필요한 객체 제거
    • 프로그램에서 더 이상 참조되지 않는 객체를 찾아 메모리에서 제거합니다.
    • 예: "고객 A의 데이터를 사용하던 중 사용이 끝났다면, 해당 데이터를 삭제".
  2. 메모리 누수 방지
    • 프로세스에서 사용하지 않는 메모리를 해제하여 시스템 메모리 자원을 절약합니다.
  3. 메모리 재활용
    • 제거된 객체의 메모리 공간을 새 객체 생성 시 재사용할 수 있도록 반환합니다.

GC의 작동 원리

GC는 기본적으로 객체를 참조하는 경로를 분석하여 작동합니다. 더 이상 접근할 수 없는 객체를 "불필요한 객체"로 판단하고 이를 정리합니다. GC의 작동 과정은 크게 3단계로 나뉩니다:

  1. 객체 식별
    • 현재 사용 중인 객체와 그렇지 않은 객체를 식별합니다.
    • 참조가 없는 객체는 "고아 객체"로 간주됩니다.
  2. 객체 제거
    • 고아 객체를 메모리에서 제거하고, 관련 자원을 반환합니다.
  3. 메모리 압축 (선택적)
    • 메모리 단편화를 줄이기 위해 남은 데이터를 연속된 공간으로 이동시키는 과정입니다.

Java의 GC 구조

Java는 JVM(Java Virtual Machine)을 통해 GC를 실행하며, JVM은 메모리를 다음과 같은 구조로 나눕니다:

1. Young Generation

  • 새로 생성된 객체가 저장되는 영역.
  • 대부분의 객체는 이 영역에서 생성되고, 수명이 짧습니다.
  • Young Generation은 다시 Eden 영역Survivor 영역으로 나뉩니다.

2. Old Generation

  • Young Generation에서 오래 살아남은 객체가 이동되는 영역.
  • 오래된 객체, 즉 장시간 참조되는 객체가 저장됩니다.

3. Metaspace

  • 클래스 메타데이터가 저장되는 공간(Java 8 이후 도입).

Java GC 알고리즘 종류

Java에서는 다양한 GC 알고리즘이 제공되며, 애플리케이션의 요구사항에 따라 선택할 수 있습니다.

1. Serial GC

  • 단일 스레드로 작동하는 간단한 GC 방식.
  • 소규모 애플리케이션에 적합.

2. Parallel GC

  • 멀티스레드를 활용하여 GC 작업을 병렬로 처리.
  • 처리량(Throughput)이 중요한 애플리케이션에 적합.

3. CMS GC (Concurrent Mark-Sweep)

  • 애플리케이션 실행 중에도 GC 작업을 병렬로 수행.
  • 지연 시간(Latency)을 줄이는 데 적합.

4. G1 GC (Garbage-First)

  • 대용량 메모리를 효율적으로 관리하기 위해 설계.
  • Java 9 이후 기본 GC로 설정됨.

GC의 장단점

장점

  1. 자동 메모리 관리
    • 개발자가 메모리 해제를 직접 관리하지 않아도 됩니다.
  2. 안정성
    • 메모리 누수와 같은 오류를 줄이고, 안정적으로 메모리를 관리합니다.
  3. 생산성 향상
    • 개발자는 비즈니스 로직에 더 집중할 수 있습니다.

단점

  1. 퍼포먼스 문제
    • GC 실행 중에는 프로그램이 멈추는 "Stop-the-World" 현상이 발생할 수 있습니다.
    • 대규모 애플리케이션에서는 GC가 성능 병목이 될 가능성이 있습니다.
  2. 예측 불가능성
    • GC 실행 시점을 정확히 예측하기 어렵습니다.

GC 최적화 팁

1. GC 유형 선택

애플리케이션의 요구사항에 맞는 GC 알고리즘을 선택합니다.

2. JVM 옵션 활용

  • 예시:
-Xmx4G -Xms4G -XX:MaxGCPauseMillis=200

 

  • 최대 힙 메모리와 최소 힙 메모리를 설정해 성능을 조정합니다.

3. GC 로그 분석

  • GC 로그(-XX:+PrintGCDetails)를 활성화하여 성능 병목 현상을 분석합니다.

4. 모니터링 도구 활용

  • Prometheus와 Grafana로 GC 메트릭을 시각화하여 성능 문제를 조기에 발견합니다.

마무리

GC는 개발자에게 메모리 관리의 부담을 줄여주는 강력한 도구입니다. 하지만 자동화된 만큼 그 작동 원리를 이해하고, 성능을 모니터링하여 최적화하는 것이 중요합니다. 특히 대규모 애플리케이션에서는 적절한 GC 알고리즘 선택과 튜닝이 핵심입니다.

반응형

'개발 부트캠프 > 백엔드' 카테고리의 다른 글

[Java] 상속, 오버로딩, 오버라이딩  (1) 2025.01.03
[Java] static  (0) 2025.01.03
[Java] 패키지 & 접근 제어자  (0) 2025.01.03
[Java] 생성자  (0) 2025.01.03
[Java] Class & Object (클래스 & 객체)  (0) 2025.01.03

+ Recent posts