본문 바로가기
백엔드개발자/JAVA: JAVA TPC 강의

private 생성자 ( static과의 관계)

by 보혀니 2021. 10. 8.

생성자 메서드 

 

생성자가 non-static 인 경우 (인스턴스 메서드)

생성자가 static 인 경우 (클래스 메서드)

 

요약

=> 객체생성에 관여하는 생성자 메서드가 private 접근제어를 가지면 객체 생성을 할 수 없다.

=> 객체를 생성하지 않고도 사용가능 하려면 모든 클래스의 멤버가 static 멤버가 되어야한다.

 

 

예시 1

public class Exx {

//	인스턴스 메서드
	public void hi() {
		System.out.println("저는 hi입니다.");
	}

//	클래스 메서드 / static 메서드
	public static void bye() {
		System.out.println("저는 bye입니다.");
	}
}
public class MyExMain {

	public static void main(String[] args) {
		Exx ex = new Exx();
		ex.hi();
		
//		1 번
//		Exx.bye();
//		2 번
//		ex.bye();
		
//		2번 코드에는 노랑색 밑줄이 뜨는니까 1번 처럼 사용하는게 맞겠지
//		이미 static-zone에 bye()가 올라가 있는데
//		굳이 ~~~~~ 2번 처럼..?
		
//		1번에 대해서 다시 또 얘기하자면,
//		Exx. => 클래스를 사용하는 시점에서 static 멤버는 먼저 자동으로 메모리에 로딩이 되고 호출이 됨.
//		method-area에 Exx라는 라벨을 붙인 bye메서드가 자동으로 로딩이 된다는 말임.
		
	}

}

 

QQQQQ
 근데 2번 처럼 하면 non-static-zone에 hi와 같이 또 올라갈 수 있는지 아직 모르겠음.
누군 올라간다하고 누군 안올라간다고 하는데
static 메서드 bye와 인스턴스 메서드 bye를 동시에 못 만드는 걸 보면
static-zone, none-static-zone에 bye가 동시에 못 올라간다는 뜻으로 봐야하는건가.

 

 

 

 

 

예시 2

public class Exx2 {

//	private 생성자
	private Exx2() {
	}

//	인스턴스 메서드
	public void hi() {
	}

//	클래스 메서드 / static 메서드
	public static void bye() {
	}
}
public class MyExMain2 {

	public static void main(String[] args) {
		Exx2 ex2 = new Exx2();
//		new Exx2, 객체생성 부분에 빨간 줄이 뜨는 이유는 뭘까?
		
//		ex2.hi()
//		호출하려면 Exx2 객체가 생성되어있어야 하는데
//		객체생성은 생성자가 합니다.
//		그런데 생성자가 private 이여서 접근 할 수가 없어서 객체 생성을 못한 상태임
//		호출가능하게 하려면? => hi메서드도 static으로 만들면 된다.
		
		Exx2.bye();
//		얘는 static이니 static-zone에 이미 잘 올라가 있어서 호출 가능~
		
		
//		Java API 중에서도 생성자가 private인 클래스도 많이 있다.
//		System, Math .....
//		System sys = new System();   => 이거 아님. 안 됨 XXXXXX
		System.out.println();
//		클래스이름 쩜 으로 접근함 ( className.methodName )
		
	}

}

 

+ 21.11.25

자바의 정석에서 객체생성을 생성자가 한다는 것은 잘못되었다고 함

위처럼 생성자가 private이라 생성자가 객체생성을 못해서 오류다 라고 이해하지말고

객체생성을 할 때에 생성자가 호출이 되는데 생성자가 private이라서 오류다 라고 일단 이해해야겠다.