πŸ’» Programming/Java

[Java] λ©”μΈλ©”μ„œλ“œ(public static void main(String[] args)) λœ―μ–΄λ³΄κΈ°

dev-ong 2024. 6. 26. 10:16

πŸ“Œμš”μ•½

main λ©”μ„œλ“œλŠ” μžλ°” ν”„λ‘œκ·Έλž¨μ˜ μ§„μž…μ (entry point), 즉 μ‹œμž‘μ μ΄λ‹€.

JVM은 μžλ°” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰μ‹œ main λ©”μ„œλ“œλ₯Ό μ°Ύμ•„μ„œ μ‹œμž‘ν•˜λ―€λ‘œ main λ©”μ„œλ“œλŠ” ν•„μˆ˜μ μΈ λ©”μ„œλ“œμ΄λ‹€.

  • public: μ ‘κ·Όμ œμ–΄μžλ‘œ, JVM이 main λ©”μ„œλ“œλ₯Ό μ ‘κ·Όν•  수, 찾을 수 μžˆλ‹€.
  • static: μΈμŠ€ν„΄μŠ€ 생성 없이 ν΄λž˜μŠ€κ°€ λ‘œλ“œλ˜λ©΄ λ°”λ‘œ μ‹€ν–‰λ˜μ–΄μ•Όν•˜κ³  ν”„λ‘œκ·Έλž¨ μ‹€ν–‰μ‹œ main λ©”μ„œλ“œλŠ” λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜μ–΄ μžˆμ–΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— κ°€λΉ„μ§€ μ»¬λ ‰ν„°μ˜ 정리 λŒ€μƒμ΄ μ•„λ‹ˆμ—¬μ•Ό ν•œλ‹€. 
  • void: main λ©”μ„œλ“œκ°€ μ’…λ£Œλ˜μ—ˆλ‹€λŠ” κ²ƒμ€ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ—ˆλ‹€λŠ” κ²ƒμ„ μ˜λ―Έν•˜λ―€λ‘œ λ°˜ν™˜ν•  λ¦¬ν„΄κ°’도 μ—†λ‹€.
  • String[] args: ν”„λ‘œκ·Έλž¨ μ‹€ν–‰μ‹œ main λ©”μ„œλ“œμ— λ„˜κΈ°λŠ” νŒŒλΌλ―Έν„°μ΄λ‹€.

main λ©”μ„œλ“œλž€?

λ¨Όμ € 이 main λ©”μ„œλ“œκ°€ 무엇인지 μ•Œμ•„λ³΄μž.

main λ©”μ„œλ“œλŠ” Java ν”„λ‘œκ·Έλž¨μ˜ μ§„μž…μ (entry point)둜, ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λ•Œ κ°€μž₯ λ¨Όμ € ν˜ΈμΆœλœλ‹€.

그리고 λͺ¨λ“  μžλ°” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ main λ©”μ„œλ“œλ₯Ό ν•„μˆ˜λ‘œ ν¬ν•¨ν•΄μ•Όν•œλ‹€.

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

 

πŸ’‘ μ§„μž…μ (entry point)

μ§„μž…μ μ΄λž€ ν”„λ‘œκ·Έλž¨μ΄ μ‹œμž‘λ˜λŠ” μ‹œμž‘μ μœΌλ‘œ, main λ©”μ„œλ“œκ°€ 이에 ν•΄λ‹Ήν•œλ‹€.

컴퓨터가 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  λ•Œ κ°€μž₯ λ¨Όμ € main λ©”μ„œλ“œλ₯Ό μ°Ύμ•„μ„œ κ·Έ μ•ˆμ— μžˆλŠ” μ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€.

즉, ν”„λ‘œκ·Έλž¨μ„ μ‹œμž‘ν•  λ•Œ 컴퓨터가 μ–΄λ””μ„œλΆ€ν„° μ‹€ν–‰ν•΄μ•Όν• μ§€λ₯Ό μ•Œλ €μ£ΌλŠ” 역할을 ν•˜λŠ” 것이닀.

λͺ¨λ“  μžλ°” ν”„λ‘œκ·Έλž¨μ€ main λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•΄μ•Όν•˜λŠ” μ΄μœ κ°€ 이에 μžˆλ‹€. main λ©”μ„œλ“œκ°€ μ—†μœΌλ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ–΄λ””μ„œ μ‹œμž‘ν•΄μ•Όν• μ§€λ₯Ό λͺ°λΌμ„œ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

 

*κ΄€λ‘€μ μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘μ μ„ main으둜 ν•œλ‹€κ³  ν•œλ‹€!

 

main λ©”μ„œλ“œκ°€ μžλ°” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ €λ©΄ ν•„μˆ˜μ μœΌλ‘œ μžˆμ–΄μ•Όν•˜κ³ , κ°€μž₯ λ¨Όμ € μ‹€ν–‰λœλ‹€λŠ” 것을 μ•Œμ•„λ³΄μ•˜μœΌλ‹ˆ 이제 ν•˜λ‚˜μ”© λœ―μ–΄λ³΄μž!

public

public은 μ ‘κ·Ό μ œμ–΄μž(access modifier)쀑 ν•˜λ‚˜λ‘œ, μ–΄λ””μ„œλ“  ν•΄λ‹Ή 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” μ ‘κ·Ό μ œμ–΄μžμ΄λ‹€.

main λ©”μ„œλ“œλŠ” μ§„μž…μ (entry point)이기 λ•Œλ¬Έμ— JVMμ—μ„œ 이 main λ©”μ„œλ“œλ₯Ό μ–΄λŠκ³³μ—μ„œλ“  μ ‘κ·Όν•˜κΈ° μœ„ν•΄ public μ΄μ—¬μ•Όν•œλ‹€.

 

JVM이 μžλ°” ν”„λ‘œκ·Έλž¨μ„ μ‹œμž‘ν•˜κ³  main λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜λ €λŠ” μ‹œμ μ€ 아직 μ•„λ¬΄λŸ° ν΄λž˜μŠ€λ„ λ‘œλ“œλ˜μ–΄μžˆμ§€ μ•Šμ€ μƒνƒœμ΄λ‹€.

κ°€μž₯ λ¨Όμ € main λ©”μ„œλ“œκ°€ μ–΄λ–€ ν΄λž˜μŠ€μ— μžˆλŠ”μ§€λ₯Ό μ°Ύκ³ , κ·Έ ν΄λž˜μŠ€μ—μ„œ λΆˆλŸ¬μ˜€λŠ” 과정이 ν•„μš”ν•˜λ‹€.

κ·Έλž˜μ„œ 이 main λ©”μ„œλ“œμ— μ ‘κ·Ό μ œμ•½μ΄ 생긴닀면 JVM은 main λ©”μ„œλ“œλ₯Ό μ°Ύμ§€ λͺ»ν•΄μ„œ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚¬ 수 μ—†λŠ” 것이닀.

μ΄λ ‡κ²Œ 되면 μžλ°” ν”„λ‘œκ·Έλž¨ 싀행이 μ•ˆλ˜λ―€λ‘œ, main λ©”μ„œλ“œμ—λŠ” μ•„λ¬΄λŸ° μ œμ•½μ΄ 없도둝 public을 써주어야 ν•œλ‹€.

 

μ ‘κ·Όμ œμ–΄μžλ‘œ public 이 μ•„λ‹ˆλΌ private둜 μ‹€ν–‰ν•˜λ©΄ μ•„λž˜μ™€ 같은 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.  

였λ₯˜: javafx.application.Application ν΄λž˜μŠ€μ—μ„œ κΈ°λ³Έ λ©”μ†Œλ“œκ°€ Main3이(κ°€) μ•„λ‹™λ‹ˆλ‹€. λ‹€μŒ ν˜•μ‹μœΌλ‘œ κΈ°λ³Έ λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•˜μ‹­μ‹œμ˜€.
   public static void main(String[] args)

 

static

static 은 μΈμŠ€ν„΄μŠ€ 생성없이 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆκ²Œν•˜λŠ” ν‚€μ›Œλ“œλ‘œ, 정적 ν•¨μˆ˜μž„μ„ μ˜λ―Έν•œλ‹€.

static으둜 μ„ μ–Έν•œ 속성과 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€μ™€ 관계없이 항상 μΌμ •ν•œ 값을 κ°€μ§€λ―€λ‘œ ꡳ이 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ μ‚¬μš©ν•  수 μžˆκ²Œλ” λ§Œλ“€μ–΄μ§„ 것이닀.

 

JVM이 main λ©”μ„œλ“œλ₯Ό λ°œκ²¬ν•˜λ©΄ main λ©”μ„œλ“œκ°€ λ“€μ–΄μžˆλŠ” 클래슀λ₯Ό λ‘œλ“œν•œλ‹€.

κ·Έ ν›„ λ³„λ„λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 과정을 κ±°μΉ˜μ§€ μ•Šκ³  ν΄λž˜μŠ€κ°€ λ‘œλ“œλ˜λ©΄ λ°”λ‘œ main λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— static ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ£Όμ–΄μ•Ό ν•œλ‹€.

 

그리고 static으둜 μ„ μ–Έν•œ 속성과 λ©”μ„œλ“œλŠ” ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” μˆœκ°„ λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλ˜κ³ , κ°€λΉ„μ§€ μ»¬λ ‰ν„°μ˜ λ©”λͺ¨λ¦¬ μ •λ¦¬λŒ€μƒμ΄ μ•„λ‹ˆλ‹€.

즉, static으둜 μ„ μ–Έν•œ 속성과 λ©”μ„œλ“œλŠ” λ©”λͺ¨λ¦¬μ— 항상 ν• λ‹Ήλ˜μ–΄ μžˆλ‹€λŠ” 것이닀. 

main λ©”μ„œλ“œλŠ” κ°€λΉ„μ§€ 컬렉터에 μ˜ν•΄ μ •λ¦¬λ˜μ–΄μ„œλŠ” μ•ˆλ˜λŠ” κΈ°λ³Έ ν•¨μˆ˜μ΄λ―€λ‘œ static을 λΆ™μ—¬μ•Όν•œλ‹€.

 

void

void λŠ” λ©”μ„œλ“œμ˜ 리턴 값이 μ—†μŒμ„ μ˜λ―Έν•œλ‹€. μžλ°”λŠ” λ©”μ„œλ“œμ˜ 싀행이 μ’…λ£Œλ˜λ©΄ 리턴 νƒ€μž…μ„ λͺ…μ‹œν•΄μ•Όν•˜λŠ” 언어이기 λ•Œλ¬Έμ— main λ©”μ„œλ“œμ—λ„ λͺ…μ‹œλ˜μ–΄μžˆμ–΄μ•Ό ν•œλ‹€.

main λ©”μ„œλ“œκ°€ μ’…λ£Œλ˜μ—ˆλ‹€λŠ” 것은 ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ—ˆλ‹€λŠ” 것을 μ˜λ―Έν•˜λ―€λ‘œ λ°˜ν™˜ν•  리턴값도 μ—†λ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— voidλ₯Ό λΆ™μ—¬μ€€λ‹€.

 

String[] args

String[] argsλŠ” μ»€λ§¨λ“œ 라인의 argumentλ“€λ‘œ, μ»€λ§¨λ“œ 라인을 톡해 main λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” String νƒ€μž…μ˜ 데이터λ₯Ό 전달할 수 μžˆλ‹€.

*String[]λŠ” String νƒ€μž…μ˜ μ—¬λŸ¬ 값을 μ €μž₯ν•  수 μžˆλŠ” μ €μž₯ꡬ쑰이닀.

JVM이 main λ©”μ„œλ“œμ˜ λ³€μˆ˜λͺ…은 κ°•μ œν•˜μ§€ μ•ŠκΈ°μ— λ³€μˆ˜λͺ…은 μž„μ˜λ‘œ 변경해도 잘 λ™μž‘ν•œλ‹€.

ν•˜μ§€λ§Œ String[]  args ꡬ문 자체λ₯Ό λΉΌλ©΄ μ•ˆλœλ‹€. 일반 λ©”μ„œλ“œλŠ” main λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ ν˜ΈμΆœν•˜κΈ° λ•Œλ¬Έμ— μž…λ ₯값을 main λ©”μ„œλ“œμ—μ„œ μ •ν•  수 μžˆμ§€λ§Œ, main λ©”μ„œλ“œλŠ” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰μ‹œ 처음으둜 μˆ˜ν–‰λ˜κΈ° λ•Œλ¬Έμ— μ™ΈλΆ€λ‘œλΆ€ν„° 값을 받을 수 μžˆμ–΄μ•Όν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

즉, main λ©”μ„œλ“œλŠ” ν”„λ‘œκ·Έλž¨ λ‚΄λΆ€μ—μ„œ 값을 ν˜ΈμΆœν•  수 μ—†κΈ° λ•Œλ¬Έμ— λ¬Έμžμ—΄ 인자λ₯Ό 받을 수 μžˆλ„λ‘ ν•΄μ•Όν•œλ‹€λŠ” 것이닀.

 

ν•˜μ§€λ§Œ IntelliJλ‚˜ Eclipse 같은 IDE둜 Java ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•˜κ³  μ‹€ν–‰ν•˜λŠ” μš”μ¦˜μ—λŠ” main λ©”μ„œλ“œμ— λ¬Έμžμ—΄μ„ 전달할 일이 거의 μ—†λ‹€. μœ„μ— κΈ°μž¬ν–ˆλ“―μ΄ μ»€λ§¨λ“œλΌμΈμ˜ μΈμžκ°’μœΌλ‘œ, Javaκ°€ DOS ν™˜κ²½μ—μ„œ μ‹€ν–‰λ˜λ˜ λ•Œμ— μ‚¬μš©ν•˜λ˜ 것이닀. 

λͺ…λ Ή ν”„λ‘¬ν”„νŠΈ(cmd)λ“±μ˜ 터미널을 ν†΅ν•΄μ„œ μžλ°”λ₯Ό μ‹€ν–‰ν•  λ•Œ μΈμžκ°’μ΄λΌκ³  μƒκ°ν•˜λ©΄ λœλ‹€. 

 

예λ₯Όλ“€μ–΄ μ•„λž˜μ™€ 같은 μžλ°” νŒŒμΌμ„ μ»΄νŒŒμΌν•˜κ³  μ‹€ν–‰μ‹œ μΈμžκ°’μ„ λ„£μ–΄μ„œ 확인해보겠닀.

package project01;

import java.util.Arrays;

public class Solution01 {
	public static void main(String[] args) {
		System.out.println(Arrays.toString(args));
	}
}

 

μœˆλ„μš°μ˜ 경우 λͺ…λ Ή ν”„λ‘¬ν”„νŠΈ(cmd)μ—μ„œ 싀행해보면 μ•„λž˜μ™€ 같이 μΈμžκ°’μ„ 잘 λ°›μ•„μ„œ 좜λ ₯ν•΄μ€€λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

ν•΄λ‹Ή μžλ°” 파일이 μžˆλŠ” λ””λ ‰ν† λ¦¬μ—μ„œ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•΄μ„œ μˆ˜ν–‰ν•œλ‹€.

  • java Solution01.java : java 파일 컴파일
  • java project01.Solution01 test string HelloWorld : μ»΄νŒŒμΌν•œ μžλ°” νŒŒμΌμ„ μ‹€ν–‰
    • projext01.Solution01: νŒ¨ν‚€μ§€λͺ….클래슀λͺ…
    • test string HelloWorld κ°€ main λ©”μ„œλ“œμ˜ μΈμžκ°’μœΌλ‘œ λ“€μ–΄κ°€λŠ” String[] args에 ν•΄λ‹Ήν•˜λŠ” 뢀뢄이닀.

*쀑간에 cd .. λ₯Ό ν•˜λŠ” μ΄μœ λŠ” μƒμœ„ ν΄λ”λ‘œ μ΄λ™ν•˜κΈ° μœ„ν•΄μ„œ!

λ¬Όλ‘  IDE μ—μ„œλ„ 섀정을 ν•˜λ©΄ main λ©”μ„œλ“œμ— String λ°°μ—΄ 인자λ₯Ό 전달할 수 μžˆλ‹€κ³  ν•œλ‹€.

 

μ°Έκ³  ν¬μŠ€νŒ…

 

Java λ©”μΈλ©”μ†Œλ“œ public static void main(String[] args) μ΄ν•΄ν•˜κΈ°

public static void main(String[] args) μžλ°”μ˜ λͺ¨λ“  ν”„λ‘œκ·Έλž¨μ€ public static void main (String[] args)ν•¨μˆ˜λ‘œ μ‹œμž‘ν•œλ‹€. μ΄λ ‡κ²Œ μ‹œμž‘ν•˜λŠ” 것은 μžλ°”μ˜ κ·œμΉ™μ΄λ‹€. λ‹€μˆ˜μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ mainν•¨μˆ˜κ°€ μ—”νŠΈλ¦¬ 포

devparker.tistory.com

 

[Java] main λ©”μ†Œλ“œ λ½€κ°œκΈ°

μžλ°” 책을 νŽΌμ³€λ‹€. Hello World μ˜ˆμ œκ°€ λ‚˜μ˜€λ©΄μ„œ main λ©”μ†Œλ“œλŠ” μ΄λ ‡κ²Œ μƒκ²¨λ¨Ήμ€κ±°λ‹ˆ 일단 λ„˜μ–΄κ°€λž€λ‹€. λ‚΄κ°€ 펼친 책은 μžλ°”λ₯Ό 처음 λ°°μš°λŠ” μ‚¬λžŒμ„ μœ„ν•΄ μ“°μ—¬μ‘Œμ§€λ§Œ, λ‚˜λŠ” 처음 λ°°μš°λŠ” μ‚¬λžŒμ΄ μ•„λ‹ˆλ―€

velog.io

 

[Java] public static void main(String[] args)λŠ” 무슨 λœ»μΈκ°€μš”?

μš”μ•½ mainν•¨μˆ˜λŠ” μžλ°” ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘μ μ΄λ‹€. μžλ°”κ°€μƒλ¨Έμ‹ (JVM)은 mainμ΄λΌλŠ” 이름을 κ°€μ§„ λ©”μ„œλ“œλ₯Ό μ°Ύμ•„ ν”„λ‘œκ·Έλž¨μ„ μ‹œμž‘ν•œλ‹€. - public : JVM이 mainν•¨μˆ˜λ₯Ό 찾을 수 μžˆλ„λ‘ ν•œλ‹€. - static : JVM이 main함

atomicliquors.tistory.com

 

[κΈ°μˆ λ©΄μ ‘] java λ©΄μ ‘ 질문 리슀트 λ‹΅λ³€ 포함

μ»΄νŒŒμΌκ³Όμ •1-1. compiler vs interpreter μ»΄νŒŒμΌμ΄λž€ κ³ κΈ‰μ–Έμ–΄λ‘œ μž‘μ„±λœ .javaνŒŒμΌμ„ 기계어인 byte code 즉, .class파일둜 λ³€ν™˜ν•˜λŠ” 과정을 λ§ν•©λ‹ˆλ‹€. 컴파일 κ³Όμ • 첫번째둜 ν”„λ‘œκ·Έλž˜λ¨Έκ°€ javaμ–Έμ–΄λ‘œ μ†ŒμŠ€μ½”

velog.io