Java

Java의 특징

Write once, run anywhere
한 번 쓰면, 어디서든 실행된다
  • 플랫폼 독립적 언어
    • 플랫폼(OS)에 관계 없이, 한 번 작성하면 어디서든 실행 가능
    • 프로그램 실행의 주체가 운영 체제가 아닌 JVM(Java Virtual Machine, 자바 가상 머신)이기 때문
  • 객체 지향 프로그래밍(Object-Oriented Programming, OOP) 언어
    • 캡슐화, 상속, 다형성 등을 지원
    • 코드의 재사용성이 높고, 유지 보수가 쉬움
  • 자동 메모리 관리 / GC(Garbage Collection)
    • GC가 메모리를 자동으로 관리하여 개발자가 직접 메모리를 해제할 필요가 없음

 

Java의 처리 과정

C/C++처럼 소스 코드를 기계어로 직접 컴파일하지 않고, Bytecode를 생성한 뒤 기계어로 바꾸어 실행함

  1. Java program
    • Java 언어를 사용한 프로그램을 작성하여 .java 확장자를 가진 소스 코드 파일을 생성
  2. javac (Java compiler)
    • 생성한 .java 파일을 javac를 사용하여 컴파일
    • .java 파일을 .class 파일(Bytecode)로 변환
  3. Bytecode → JVM
    • JRE의 Java classloader를 통해 Bytecode 파일을 JVM 메모리로 로드
  4. JVM
    • 우선 JVM 실행 엔진에서 Bytecode 파일이 유효한지 검증
    • Bytecode 파일이 유효하다면 JIT(Just-In-Time) 컴파일러로 기계어 변환 및 실행
    • 인터프리터를 사용할 경우, 기계어로 컴파일하지 않고 한 줄씩 실행 (느림)
  5. GC (Garbage Collection)
    • 더 이상 사용되지 않는 객체를 자동으로 제거하여 메모리 관리

 

Java의 주요 구성 요소

  • JVM (Java Virtual Machine)
    • Java Bytecode를 실행하는 가상 머신
    • 운영체제와 독립적으로 작동하여 플랫폼 독립성을 보장함
  • JDK (Java Development Kit)
    • JRE, Javac, Java API, 디버거 등이 포함된 개발 도구
  • JRE (Java Runtime Environment)
    • JVM + 라이브러리
    • Java 프로그램을 실행하는데 필요한 환경

 

Java의 구성 단위

※ Eclipse 환경 기반 설명

계층적 구조로, 상위 단위는 하위 단위를 포함함

  1. Workspace
    • 최상위 작업 공간으로, 여러 Project를 포함함
    • 여러 Project를 그룹화하는 단위
  2. Project
    • 하나의 독립적인 Java 프로그램 또는 라이브러리를 의미
    • 여러 Package, Class 등을 포함함 (최소 1개의 Class를 포함해야 함)
    • 소스 코드 폴더 (src/)에 저장됨
  3. Package
    • Namespace 역할을 하며, Class 간의 이름 충돌 방지 (Class 이름이 같아도 Package 다르면 다르게 인식)
    • 관련 Class 및 Interface를 그룹화하는 단위
  4. Class
    • Object(객체)를 생성하는 기본 단위
    • 모든 Java 프로그램은 하나 이상의 Class를 포함해야 함
    • 하나의 .java 파일 안에 Public Class는 반드시 하나만 있어야 하며 파일명과 동일해야 함
  5. Method & Field
    • Method는 함수, Field는 변수
    • main() Method가 없으면, 해당 Class 직접 실행 불가 (다른 Class에서 호출은 가능)
    • Method 안에 Method 생성 불가
    • 매개변수(Parameter, Argument)를 추가 가능
      • Parameter는 정의된 변수, Argument는 입력되는 값
package com.example;  // Package

public class Car {  // Class
    String brand;  // Field

    public Car(String brand) {  // Constructor (생성자)
        this.brand = brand;
    }

    public void drive() {  // Method
        System.out.println(brand + " car is driving.");
    }
}

std::set / <set>

<set>은 C++의 표준 라이브러리인 STL(Standard Template Library)의 컨테이너 중 하나다. 

주요 특징은 다음과 같다. 

  • 중복을 허용하지 않는 고유한 요소들로 구성됨
  • 요소들이 오름차순으로 자동 정렬
  • 이진 탐색 트리 중 하나인 Red-Black Tree(자가 균형 이진 탐색 트리)를 기반으로 함
  • 삽입/검색/삭제 시 탐색 속도 O(log n)을 보장함
  • 요소들이 논리적으로 연결되어 있지만 물리적으로 연결되지 않음 (연속된 메모리 블록 X)

 

1. Set 선언

+) std::greater<> 활용하여 내림차순으로 정렬 순서 변경 가능

#include <iostream>
#include <set>

int main() {
    std::set<int> s = {5, 2, 8, 1, 3};
    
    // 내림차순 정렬
    // std::set<int, std::greater<int>> s = {5, 2, 8, 1, 3}; → {8, 5, 3, 2, 1}

    for (int x : s) {
        std::cout << x << " "; // 1 2 3 5 8
    }
}

 

2. 주요 함수 및 연산

  • 삽입 / insert() : 특정 요소 추가, 중복 요소 추가 불가능
  • 삭제 / erase() : 특정 요소 삭제, 해당 요소 없으면 변화 없음
  • 탐색 / find() : 특정 요소를 가리키는 iterator를 반환, 없으면 end()에 해당하는 iterator 반환
  • 범위 삭제 / erase(a, b) : 요소 [a, b) 범위에 해당하는 모든 요소 삭제
  • 크기 확인 / size() : 총 요소의 개수 반환
#include <iostream>
#include <set>

int main() {
    std::set<int> s = {5, 2, 8, 1, 3}; // → {1, 2, 3, 5, 8}

    s.insert(4);  // 4 삽입 → {1, 2, 3, 4, 5, 8}
    s.insert(2);  // 이미 존재 → 삽입되지 않음
    
    s.erase(3);  // 값 3 삭제 → {1, 2, 4, 5, 8}
    
    if (s.find(5) != s.end()) {		// 값 5 탐색
    	std::cout << "5 exists in the set.";
    } else {
    	std::cout << "5 does not exists in the set.";
    }
    
    auto it1 = s.find(2); // 값 2의 iterator
    auto it2 = s.find(5); // 값 5의 iterator
    s.erase(it1, it2); // 값 [2, 5) 범위 삭제 (2, 4 삭제)
    
    std::cout << s.size();  // 현재 원소 개수 출력 → 3

    for (int x : s) {
        std::cout << x << " "; // 1 5 8
    }
}

 

3. 파생 라이브러리

  • <multiset> : <set>은 중복 요소를 허용하지 않지만, <multiset>은 중복을 허용함
  • <unordered_set> : <set>과 달리 정렬하지 않음, Hash table을 사용하여 탐색 속도 O(1)을 보장함
#include <iostream>
#include <set>
#include <unordered_set>

int main() {
    std::multiset<int> ms = {2, 1, 2, 3, 4, 3};		// 중복 허용
    std::unordered_set<int> us = {3, 1, 2, 4};		// 정렬 X
    
    for (int x : ms) {
        std::cout << x << " ";  // 1 2 2 3 3 4
    }
    
    for (int y : us) {
        std::cout << y << " ";  // 3 1 2 4
    }
}

 

4. 활용 예제

추가로 <random> 라이브러리를 사용한 로또 번호 무작위 추첨

#include <iostream>
#include <random>
#include <set>

void cal() {
	std::set<int> numbers;
	std::random_device rd;
	std::mt19937 gen(rd());
	std::uniform_int_distribution<int> dis(1, 45);

	while (numbers.size() < 6) {
		numbers.insert(dis(gen));
	}

	for (int num : numbers) {
		std::cout << num << " ";
	}
	std::cout << std::endl << std::endl;
}

int main() {
	int count;

	std::cout << "[로또 번호 자동 추첨기]" << std::endl << std::endl;
	std::cout << "추첨할 총 횟수를 입력하세요 : ";
	std::cin >> count;
	std::cout << std::endl;

	for (int i = 0; i < count; i++) {
		cal();
	}

	return 0;
}

 

+ Recent posts