public, private, static의 역할은 알지만 막상 class, method에 붙고, 이게 경우의 수로 나뉘니 이해에 어려움을 느꼈다.
예를들어 private이 클래스에 달리면 어떤 조건이 생기며, 어떤 목적을 위함인지 몰랐다. 또한 내가 잘못 이해하고있는 부분도 있었다.
이를 확실히 하기위해 정리해보았다.
package free;
class Test {
public static int a = 3;
}
package free2;
import free.test;
public class Test1 {
public static void main(String[] args) {
Test.a = 1; // 에러 발생
System.out.println("hello world");
}
}
private의 경우, public 메서드로 private 멤버 넣으면 public 메서드 사용 가능했잖아.
비슷한 논리로, default 클래스의 public static멤버 또한 사용할 수 있지 않을까?
불가능. 왜냐하면 접근권한은 상위 개념을 우선하기 때문.
->Test.a에서 Test는 a의 상위. 그러므로default가public보다 우선시 된다.
클래스 범위 넘어서면 접근 불가능.
private 멤버는 포함되지 않음 -> 클래스 벗어난 거니까.최상위 클래스엔 private class 불가능. 이너 클래스로 가능.
private이면 사용을 할 수가 없으니까.class AAA {
private String secret = "비밀 문자열"; // private 필드
private void tellSecret() { // private 메서드
System.out.println(this.secret);
}
public void possibleMethod() {
tellSecret(); // 내부에서 호출
System.out.println(this.secret); // 내부에서 접근
}
}
class BBB {
public void tryAccess() {
AAA a = new AAA();
a.tellSecret(); // 에러. private 메서드는 외부에서 호출 불가.
String s = a.secret; // 에러. private 필드는 외부에서 접근 불가.
a.possibleMethod(); // 가능
}
}
a.tellSecret() 에러.private이기 때문.a.possibleMethod() 가능.왜 생성자를 private로 선언할까?
유틸리티 클래스
모든 멤버가 static인 유틸리티 클래스의 경우, 객체 생성이 필요없음을 알리기 위함.
싱글톤 패턴처럼, 단 하나만 존재하게 하기 위함. (외부에서 못만드니까.)
팩토리 메서드 패턴
생성자 없애고, 객체 생성하는 복잡한 로직 숨기는 팩토리 메서드 위함.
static은 멤버를 객체가 아닌 클래스에 소속시킨다.
static method : 인스턴스 필드 사용 불가능.
객체들을 만들어 static필드 변경해도, 모두 동일한 값 가리킴. (객체가 아닌 클래스 소속이기 때문. 완전 별개로 떨어지게 됨)
-> 방향성을 완전히 다르게 생각해야함. 클래스에 들어있다고 똑같은 변수가 아니고, 그냥 별개로 존재하는 것으로 바라보아야함.
불가능. static은 클래스 레벨의 멤버(필드, 메서드) 에 사용됨.
근데 애초에 생성자는 멤버가 아님. 메서드와 생성자는 엄연히 다른 것.
-> 해당 메서드에서 어떤 인스턴스 변수, 메서드도 이용하지 않을 때.
1. 모든 기능이 기술을 위해서만 존재함이 아닌, 코드를 작성하는 사람들을 위한 의도 또한 존재함을 알았다.
예를들어 유틸 클래스의 private 생성자가 있다. 객체를 생성하면 메모리를 소모할 수 있다는 것도 막지만, "객체 생성 필요 없음의 의미 전달" 또한 담겨있음.
최근 대충 알고 넘어갔던 static에 대해 찾아보았는데, 이 글에 깔끔하게 정리되어 있어 잘 보고 갑니다 !