본문 바로가기

멋쟁이사자처럼_부트캠프/Java

[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 1일차 main 메서드, JVM, 컴파일 방식, 변수, 그리고 반복문

오랜만에 다시 보는 main 메서드의 구조분석

public class Hello{
    public static void main(String[] args){
        System.out.println("Hello");
    }
}

 

main 메서드: Java 프로그램의 진입점(Entry Point)으로, 프로그램 실행 시 가장 먼저 호출되는 메서드.

JVM이 Hello 클래스를 로딩하고 main 메서드를 호출함.

String[] args : 명령줄 인수를 배열 형태로 받는 매개변수, 그래서 입력한값이 args에 저장되고 코드에서 args 배열을 출력하면 그대로 나오게되는 구조이다.

 

System: Java의 표준 입력 및 출력, 유틸리티 기능 등을 제공하는 클래스. 

out : System 클래스의 정적(static) 멤버, 콘솔 화면에 연결된 표준 출력 스트림 Standard ouput stream(STD-OUT) 이다.

println() 은 ()안의 내용을 콘솔에 표시하는 메소드이다.

 

기본구조 정리

 

  1. 클래스 정의.
  2. main 메서드를 통해 프로그램 실행.

 

JVM : Java 프로그램을 실행하기 위한 가상 머신

특징 : 바이트코드는 특정 JVM에서 실행되므로 운영체제에 의존하지 않음. 실행 전에 바이트코드를 검사(Bytecode Verification)하여 코드의 안전성을 확인하고 악의적인 동작을 방지함. 메모리를 자동으로 관리함.

 

JVM 동작 원리

  1. 소스 코드 작성:
    • Java로 프로그램 작성(Hello.java).
  2. 컴파일:
    • javac 명령으로 소스 코드를 컴파일하여 바이트코드로 변환.
    • 결과물: Hello.class 파일 생성.
  3. JVM 실행:
    • java 명령으로 JVM이 바이트코드(Hello.class)를 로드하고 실행.
    • 실행 과정:
      1. Class Loader:
        • .class 파일을 읽고 JVM으로 로드.
      2. Bytecode Verifier:
        • 바이트코드의 유효성 검사.
      3. Execution Engine:
        • 바이트코드를 해석하거나 JIT(Just-In-Time) 컴파일러를 사용해 기계어로 변환하여 실행.

인터프리터방식 vs 컴파일방식

  • 두 방식의 차이 비교

 

하이브리드 방식 (Java의 사례)

Java는 인터프리터와 컴파일러 방식의 장점을 모두 활용한 하이브리드 방식을 사용합니다:

  1. 컴파일 단계:
    • Java 컴파일러(javac)가 소스 코드를 바이트코드로 변환.
  2. 실행 단계:
    • JVM(Java Virtual Machine)이 바이트코드를 인터프리터로 해석하거나, JIT(Just-In-Time) 컴파일러를 사용해 기계어로 변환하여 실행.

변수

  • 변수명을 선언할 때 의미 있는 이름을 사용하는 것이 좋다.
  • 예: counter, userName, totalSum 등.

다음 중 변수 명으로 사용할 수 있는 것은?

가능 / 불가능

  1. abc
  2. $abc
  3. _abc
  4. @abc
  5. abcdefghijklmnopqrstuvwxyz
  6. while
  7. public
  8. true

반복문

반복문은 이번에는 사용기준을 알아보았다.

 

두 문법을 선택하는 기준

1. 반복 횟수가 명확한 경우 → for문 사용

사용 예 :

  • 특정 범위만큼 반복해야 하는 경우.
  • 배열, 리스트, 맵 등 컬렉션 요소를 순회하는 경우.
// 1부터 10까지 숫자를 출력
for (int i = 1; i <= 10; i++) {
    System.out.println(i);
}

// 배열 순회
int[] arr = {1, 2, 3, 4, 5};
for (int num : arr) {
    System.out.println(num);
}

 

2. 반복 조건이 명확하지 않은 경우 → while문 사용

  • 특징: 반복 조건만 중요하고, 반복 횟수가 명확하지 않은 경우 적합합니다.
  • 사용 예:
    • 특정 조건이 만족 될 때까지 반복해야 하는 경우.
    • 사용자의 입력에 따라 반복을 종료하는 경우.
// 1부터 n까지 더하기 (사용자가 입력한 n까지)
int n = 10;
int i = 1, sum = 0;
while (i <= n) {
    sum += i;
    i++;
}
System.out.println("Sum: " + sum);

// 사용자 입력에 따라 종료
Scanner scanner = new Scanner(System.in);
String input;
while (true) {
    System.out.print("Enter 'quit' to exit: ");
    input = scanner.nextLine();
    if (input.equals("quit")) {
        break;
    }
}

3. 간단한 기준 정리

상황 추천 반복문

반복 횟수가 명확 for
반복 조건만 중요 while
컬렉션 요소 순회 for-each
종료 조건이 동적으로 결정 while
무한 루프 while(true)

4. 추가 팁

  • for문은 가독성이 좋음:
    • 반복 횟수가 명확한 경우 for문이 초기값, 조건, 증감 로직을 한 곳에서 관리하므로 더 깔끔하고 가독성이 좋습니다.
  • while문은 유연함:
    • 특정 종료 조건을 기다리거나, 반복이 비정형적인 경우 적합합니다.
  • 필요한 경우 do-while 고려:
    • 반복을 최소 한 번 실행해야 할 때 사용합니다:
    • java 코드 복사 int i = 0; do { System.out.println("Executed at least once"); i++; } while (i < 5);

결론

  • 반복 횟수가 명확하다면 for문, 조건만 중요하다면 while문.