오랜만에 다시 보는 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() 은 ()안의 내용을 콘솔에 표시하는 메소드이다.
기본구조 정리
- 클래스 정의.
- main 메서드를 통해 프로그램 실행.
JVM : Java 프로그램을 실행하기 위한 가상 머신
특징 : 바이트코드는 특정 JVM에서 실행되므로 운영체제에 의존하지 않음. 실행 전에 바이트코드를 검사(Bytecode Verification)하여 코드의 안전성을 확인하고 악의적인 동작을 방지함. 메모리를 자동으로 관리함.
JVM 동작 원리
- 소스 코드 작성:
- Java로 프로그램 작성(Hello.java).
- 컴파일:
- javac 명령으로 소스 코드를 컴파일하여 바이트코드로 변환.
- 결과물: Hello.class 파일 생성.
- JVM 실행:
- java 명령으로 JVM이 바이트코드(Hello.class)를 로드하고 실행.
- 실행 과정:
- Class Loader:
- .class 파일을 읽고 JVM으로 로드.
- Bytecode Verifier:
- 바이트코드의 유효성 검사.
- Execution Engine:
- 바이트코드를 해석하거나 JIT(Just-In-Time) 컴파일러를 사용해 기계어로 변환하여 실행.
- Class Loader:
인터프리터방식 vs 컴파일방식
- 두 방식의 차이 비교
하이브리드 방식 (Java의 사례)
Java는 인터프리터와 컴파일러 방식의 장점을 모두 활용한 하이브리드 방식을 사용합니다:
- 컴파일 단계:
- Java 컴파일러(javac)가 소스 코드를 바이트코드로 변환.
- 실행 단계:
- JVM(Java Virtual Machine)이 바이트코드를 인터프리터로 해석하거나, JIT(Just-In-Time) 컴파일러를 사용해 기계어로 변환하여 실행.
변수
- 변수명을 선언할 때 의미 있는 이름을 사용하는 것이 좋다.
- 예: counter, userName, totalSum 등.
다음 중 변수 명으로 사용할 수 있는 것은?
가능 / 불가능
- abc
- $abc
- _abc
- @abc
- abcdefghijklmnopqrstuvwxyz
- while
- public
- 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문.