[자바] public static void main() / 도대체 왜 쓰는건데?

쪼개발자·2024년 1월 17일

생성되는대로 사용하고 있던 public static void
같이 일하던 동료가 면접에서 저거 하나 하나 설명하라는 질문을 받았다는 걸 듣고,
'아 뭐 저렇게 쉬운거.. 아쒸.. 나.. 좀 설명을 못할것 같은데?' 라는 생각이 들었다.

그러므로 이참에 정리

[public] static void main(...

접근 제어자(Modifier)

public

  • 말 그대로 모든 class에서 접근 가능한 메소드를 생성할때 사용

private

  • 외부 접근이 불가능함. 같은 클래스 내에서만 사용가능

protected

  • 상속 받은 클래스 또는 같은 패키지 내에서만 사용가능

default / no modifier

  • 같은 패키지 내에서만 사용가능

그렇다면 왜 굳이 사용할까??

이건 자바의 '특성'과도 관련이 있다.
OOP의 장점인 캡슐화를 위해서!!!!

public class test {

	private String id;
	private Integer sum;

	//getter
	public String getId() {
		return id;
	}
	public String getSum() {
		return sum;
	}

	//setter
	public void set(String id) {
		this.id = id;
	}
	public void setSum(Integer a, Integer b) {
		this.sum = a + b;
	}
}

이런 코드를 많이 보셨을거다.
id와 pw의 변수는 private으로 선언하여 '직접' 접근할 수 없게 해 두었고, 그 값을 가져오기 위해서는 getter를 사용해야 한다. 이렇게 구현하는 걸 '캡슐화' 라고 한다.

이렇게 해 두면 사용자가 직접 값을 변경할 수 없다.

Test test = new Test();
test.sum = 10; // error

이렇게 직접 바꿀수 없다는 뜻이 된다.
요런게 캡슐화

public [static] void

그렇다면 두번째, static은 뭘까?
1) static은 변수와 메소드로 사용 가능하다.

static string developer_kim = "Good";

public static class Hello() {
	System.out.println("hello!");
}

2) static으로 생성한 변수, 메소드는 메모리에 한 번 할당되어서 프로그램이 종료될때 해제된다. (가비지 컬렉터의 관리를 받는 Heap이 아니라 Static영역에 저장되므로)
이 말은 즉슨, 잘 사용하지도 않는 변수/메소드를 static으로 선언하는 경우 성능에 영향을 끼칠 수 있다는 의미가 된다. 왜냐면 그만큼 메모리를 잡아먹으니까!
근데 또 다른 한편으로는 자주 사용하는 인스턴스의 경우엔 static으로 만들어 놓고 사용한다면 성능에 좋다는 말이 된다. 즉, 잘 사용하면 득, 못 사용하면 실!

3) static은 메소드를 인스턴스 없이 실행할 수 있게 해 준다.

Test test = new Test();

이렇게 만들어서 접근하지 않아도 된다는 뜻이다. 근데 이 말은 반대로 객체지향의 특성을 깬다는 말이다. 붕어빵 틀에 붕어빵을 찍어내야되는데 왜 찍어내지 못하니!!

왜? 이건 왜 또 필요한걸까? 언제 써야 할까?

  • 유틸함수를 생성시 사용하면 좋다. Math.round(), Math.max() 뭐 이런 유틸함수는 다 static함수이다.
  • 자주 사용하는 함수 변수의 경우엔 사용하면 편하고 좋으다!

public static [void]

제일 쉬워 제일 좋아
이건 리턴값을 의미한다.
void는 말 그대로 아무것도 리턴하지 않는다는 거고 저 자리에 String, Integer, Array, 객체 등등 써서 리턴 값으로 전달할 타입을 선언하는 것

이렇게 오늘도 깨알 공부 끝!

0개의 댓글