public static void main(String[] args) {}
자바 가상 머신(JVM)이 프로그램을 시작할 때 main 메서드를 호출하기 위해서는 public으로 선언되어야하기 때문이다.
자바의 변수는 3가지
메소드는 2가지
중요한 포인트는 인스턴스 생성 후에 쓰는거냐 아니냐이다.
인스턴스 메소드에는 인스턴스 변수를 쓸 수 있는데
클래스 메소드에는 인스턴스 변수를 쓸 수 없다. 왜냐? 인스턴스가 생성이 안되있는데 인스턴스 변수를 쓴다는 것은 논리가 맞지 않기 때문이다.
인스턴스 메소드에는 클래스 변수를 쓸 수 있는가? 쓸 수 있다.
static을 쓰는 이유는 인스턴스가 생성되지 않아도 쓸 수 있게함이다. 메모리와 연관지어 생각해보자.
자바가 변수나 함수를 메모리에 할당하는 방법은 2가지가 있다.
1. static 영역에 선언하는 것
2. heap 영역에 선언하는 것
연산이 실행된다 -> 인스턴스가 만들어진다 -> heap 영역에 할당된다.
즉, static 메소드가 아닌 경우에는 인스턴스가 만들어진 후에야 메소드를 쓸 수 있는 것이다. 자바 프로그램을 실행시켜야하는데 인스턴스를 생성하는것은 비효율적이며, 또한 heap 메모리 영역에 있는 인스턴스들은 GC가 삭제시킬 수 있기 때문이다.
결론적으로 객체를 생성하지 않고 메서드를 호출하기 위해서이다.
void는 리턴되는 값이 없다는 의미이며 프로그램이 시작되면서 어떤 값을 반환 받을 필요가 없기 때문이다.
Java 가상 머신(JVM)은 main 메서드를 찾아서 실행하면서 프로그램의 동작이 시작시킨다. 즉,main은 프로그램의 진입점이라고 알려주는 것이다.
자바 프로그램 실행 시 추가적인 정보를 전달하기 위함이다.
import java.io.*;
public class FileCopyProgram {
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("Usage: java FileCopyProgram <sourceFile> <destinationFile>");
return;
}
String sourceFile = args[0];
String destinationFile = args[1];
try (BufferedReader reader = new BufferedReader(new FileReader(sourceFile));
BufferedWriter writer = new BufferedWriter(new FileWriter(destinationFile))) {
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
}
System.out.println("File copied successfully!");
} catch (IOException e) {
System.err.println("Error copying file: " + e.getMessage());
}
}
}
커맨드 명령어
java FileCopyProgram source.txt destination.txt
이런식으로 자바프로그램 실행 시 추가정보를 할 수 있게 해주는 것이다.