[JAVA]main메소드 오버라이드/오버로딩

Inung_92·2023년 3월 1일
2

JAVA

목록 보기
11/15
post-thumbnail

main 메소드의 오버라이드

독립실행형 프로그램을 실행시키기 위해서는 main 메소드를 보유하고, 해당 메소드를 보유한 클래스를 통해 프로그램이 실행된다.
그렇다면 만약 상속관계에서 슈퍼클래스가 main 메소드를 보유하고 있다면 서브 클래스가 슈퍼클래스의 main메소드를 오버라이드 하는 것이 가능할까?

결론부터 이야기하자면 불가능하다.

⚡️ 이유

메소드의 오버라이드는 클래스 간의 상속 또는 인터페이스와 클래스의 구현 관계에서 적용할 수 있는 메소드 적용 기법이다.

그렇다면 오버라이드가 적용되는 시점은 언제일까?
메소드의 오버라이드가 적용되는 시점은 인스턴스가 메모리 영역에 올라가는 시점이다. 즉, 실행(런타임) 환경에서 오버라이드가 적용되는 것이다.

이렇게만 이야기하면 헷갈릴 수 있다. 아래 코드를 통해 main 메소드의 선언부 형태를 들여다보자.

public static void main(String[] args){
	실행문 생략...
}

여기서 중요한 키워드는 static이다. static은 프로그램이 실행되면 클래스들의 코드 원본이 올라가는 JVM의 메모리 영역이다. 즉 main 메소드는 인스턴스를 생성하지 않아도 프로그램을 실행할 때 필요한 메소드이자 클래스 메소드인 것이다.
클래스 메소드는 기본적으로 해당 클래스를 통해 생성된 객체들이 공유하여 사용할 수 있는 메소드이다. 이 말은 인스턴스가 보유하는 것이 아니라 static 영역에 선언되어 인스턴스들이 공통적으로 접근하여 사용할 수 있다는 것이다.

아래 코드를 그림으로 표현해보자.

public class Test{
	//인스턴스 메소드
	public void method(){
    	//실행문 생략
    }
    
	//static(클래스) 메소드
	public static void main(String[] args){
    	실행문 생략..
    }
}

Test라는 클래스는 method()라는 인스턴스 메소드 1개와, static(클래스메소드)이 선언된 main() 메소드를 보유하고 있다. 프로그램을 실행하면 해당 클래스의 인스턴스가 어떻게 생성되는지 알아보자.

Test 클래스의 인스턴스는 생성되면서 인스턴스 메소드인 method()만을 heap영역에 데리고 올라간다. 남아있는 static 메소드는 해당 클래스의 각 인스턴들이 공유하여 참조할 수 있도록 static 영역에 위치하고 있는 것이다.

이러한 이유 때문에 main 메소드의 오버라이드는 불가능 한 것이다. 오버라이드 규칙 상 static 키워드가 붙은 메소드는 오버라이드 할 수 없기 때문이다.

⚡️ 결론

오버라이드가 가능한 메소드는 객체의 타입에 따라 런타임 시에 결정되지만 static 메소드는 컴파일 시 결정되므로 static 키워드가 붙은 main 메소드는 오버라이다 불가능하다.


main 메소드의 오버로딩

이번에는 main 메소드의 오버로딩에 대해서 알아보자.
메소드 오버로딩은 동일 클래스 내에서 메소드 시그니처의 차이를 주어 동일한 메소드명으로 다양한 기능의 메소드를 정의하는 기법이다.

결론부터 이야기하면 main 메소드의 오버로딩은 가능하다.

동일 클래스내에 있다는 말은 static영역에서 같은 클래스 코드내에 유지가 되며 클래스가 스스로를 참조할 수 있기에 가능하다. 위에서도 설명했듯이 static 메소드는 컴파일 시 선언되어지므로 같은 클래스내에서 동일한 메소드명으로 다르게 동작하는 메소드를 선언하는 오버로딩의 대상이 될 수 있는 것이다.

⚡️ 오버로딩 예시

public class Test{
	//String 형을 매개변수로 받는 main 메소드
	public static void main(String[] args){
    	실행문 생략
    }
    
    //int 형을 매개변수로 받는 main 메소드
    public static void main(int[] args){
    	실행문 생략
    }
}

위 코드처럼 매개변수에 차이를 주어 오버로딩을 할 수 있는 것이다. 오버로딩을 해야하는 정확한 시기나 용도에 대해서는 아직 자세히 다루지 못했지만 main 메소드의 오버로딩을 통해 상황에 따른 main 메소드 호출로 동작을 유연하게 가지고 갈 수 있을 듯 하다.


마무리

이렇게해서 이번 게시글에서는 우리가 자주 사용하면서도 굳이 신경쓰려 하지않는 main 메소드의 오버라이딩과 오버로딩에 대해서 알아보았다.

main 메소드뿐만 아니라 오버라이드와 오버로딩의 기본적 개념에 대해서도 반복적으로 숙지할 수 있고, 이해할 수 있는 시간이 되었던 것 같다.

그럼 이만.👊🏽

profile
서핑하는 개발자🏄🏽

0개의 댓글