접근 지정자
java의 접근 지정자로는 public, private, protected, default(생략)이 있다. 접근 지정자는 클래스나 멤버를 공개/비공개로 설정하여 다른 클래스에서의 접근을 제한하기 위해 사용한다. OOP의 캡슐화는 기본적으로 내부를 숨기지만, 접근 지정자를 통해 일부를 공개할 수 있다.
*패키지는 클래스 파일을 저장하는 폴더와 같은 개념이다.
public은 모든 클래스에게 접근을 허용하지만, default는 같은 패키지의 클래스에게만 접근을 허용한다. 클래스에 접근할 수 있다면 인스턴스를 생성할 수 있다.
인스턴스이름.을 입력하면 멤버가 보이지 않는다.public class A에 protected int a가 있고, 다른 패키지에 A를 상속받은 class B extend A가 있다면 B에서 a에 접근할 수 있다.getter와 setter는 약속된 메소드로, private로 선언된 값을 가져오거나 값을 변경할 때 사용한다. 필드에 직접 접근하는 것을 막을 수 있다. getter는 리턴타입 getFieldName()과 같이 사용하고 setter는 void setFieleName(타입 변수)와 같이 사용한다.

source > Generate Getters and Setters에서 자동으로 생성할 수 있다.static, final, 싱글톤
static은 인스턴스(non-static)과 반대되는 개념이다. 인스턴스는 new로 객체를 생성하여 사용하는 필드/메소드이다. 객체마다 하나씩 존재한다. 이때 this는 객체 자신의 필드를 가리키기 때문에 non-static으로 생성된 멤버에만 사용한다(static 메소드는 this 사용 불가). 또한 생성하지 않으면 사용이 불가능하다.
반면 static은 정적 변수/메소드로, 클래스 전체에서 하나만 존재한다. 따로 객체를 생성할 필요가 없으며 존재하는 static 변수를 모든 객체가 공유한다. static 클래스가 로딩될 때 static 공간에 할당된다.
static은 전역 변수/메소드를 만들 때 사용한다. 예를 들어, Math 클래스는 모든 필드와 메소드가 public static으로 선언되어 있어 다른 클래스에서 Math.abs(x)와 같이 접근할 수 있다.
non-static 멤버는 생성해야 사용할 수 있으므로 static 메소드에서 사용이 불가능하다. 반면 static 멤버는 실행과 동시에 생성되므로 non-static 메소드에서 사용할 수 있다. 따라서 다른 메소드에서 접근해야 하는 전역 변수와 전역 메소드는 static으로 선언한다.

싱글톤은 단 하나만 생성되도록 만든 객체를 말한다. 최초 1번만 생성하고, 이후에는 생성되어있다면 이미 생성된 객체를 불러오는 방식으로 구현한다.

instance==null이므로 하늘 객체를 생성하고 리턴한다.하늘 sky1=하늘.getInstance()에서 생성된 객체를 가리킨다.final 필드는 C에서의 const와 유사하다. 실행 중에 값을 변경할 수 없어 상수를 선언할 때 사용한다. 초기값을 반드시 지정해주어야 한다.

패키지는 폴더와 같은 개념이다.