[JAVA] PSVM - public static void main(string[] args)

왜 자바의 메인 메서드는 PSVM을 무조건 선언해야 할까?

Posted by ash tensor on January 04, 2024 · 3 mins read 카테고리
카테고리 링크
📁 JAVA

PSVM

자바를 즐겨 사용하는 사람도 자바의 코드가 간결함과는 거리가 멀다는 데는 동의할 것이다. 당장 파이썬에서 하는 것처럼 print(“hello world”)를 실행하려고 해도, 아니면 자바를 이어받은 코틀린에서조차

fun main() {
println("Hello")
}

이렇게 간결한데 자바에서는

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

이런 식으로 작성해야 될 정도고, 저 부분을 수정하면

이렇게 아예 IDE에서부터 프로그램을 실행할 수 없다고 말해버린다. 이렇듯 자바는 public static final 처럼 문법적으로 꼭 필요한 서식과 문법적 구조가 너무 늘어진다. 그렇다보니 PS에서는 자바를 그다지 사용하지 않는 것 같다. 당연히 느려서 그런 것도 있겠지만, 똑같이 엄청 느린 파이썬을 많이 사용하는 걸 보면 꼭 그런것 만은 아닌 것 같다.

그런데 왜 자바에서는 PSVM string args를 써야하는 걸까?

public

public은 접근 제어자이다. 자바는 프로그램의 시작을 Main 메소드에서 시작한다. 그러므로 어디에서든 접근해야 하기 때문에 public으로 선언하는 것은 당연하다.

static

자바에서 static 키워드는 많은 용도로 사용되는데, 정적 변수(Static Variable)과 정적 메서드(Static Method)가 대표적이다. 그리고 PSVM을 무조건 사용해야 되는 이유도 바로 여기에 있다. 정적 변수는 클래스가 메모리에 로드 될 때 생성되며 정적 영역에 적재된다. 정적 변수는 클래스 이름을 통해 접근할 수 있으며 (ex: Integer.MAX_VALUE) 객체를 생성하지 않아도 된다. 정적 메서드도 똑같은데, 정적 메서드 역시 클래스 이름을 통해 직접 호출할 수 있고, 인스턴스의 변수나 인스턴스의 메서드를 직접 사용하거나 호출할 수 없다. 오로지 정적 변수나 정적 메서드만 호출할 수 있다. 이 정적 메서드의 가장 대표적인 메서드가 바로 메인 메서드다.

이 때문에 자바의 메인 메서드에는 public static void main(string[] args) 를 적어야 하는데, 자바의 메인 메서드는 객체를 생성하지 않고 실행되어야 하기 때문에 static, 즉 정적 메서드여야 하는 것이다.

우리가 자바를 사용할 때, Main 클래스를 인스턴스해서, 예를 들어서

Main classMain = new Main(args[]);
classMain.main();

이런 식으로 터미널에 작성해서 실행하지는 않으니까.

그리고 인스턴스의 변수나 인스턴스의 메서드를 직접 사용하거나 호출할 수 없는데 내 기억에 가장 깊게 남아있는 예시가 있다. 23년 정보처리기사 3회 자바 문제인데

// 에러가 나는 라인을 고르시오
class Person(
    private String name;
    public Person(String val) {
        name = val;
    }
    public static String get() {
        return name;
    }
    public void print() {
        System.out.println(name);
    }
)

public class Engineer {
    public static void main(string[] args) {
        Person obj = new Person("Kim");
        obj.print();
    }
}

이런 문제였다. 여기서는 7번 라인, return name 부분에서 에러가 나는데, 이는 get()이라는 메서드가 static 메서드이기 때문에, 2번 라인에서 선언된 private String name 이라는 인스턴스 변수를 참조할 수 없기 때문에 에러가 나는 것이다.

어디서 에러가 날 지 찾으라는 문제가 나올 거라고는 생각을 하지 못해서 시험장에서 꽤 당황했었던 기억이 난다.


Thanks. mind sharing?

← Previous Post Next Post