<캡슐화>

-package private 는 명칭을 안붙일때 자동으로 붙는 default 값이고 다른 패키지에 import를 해도 이 명칭이 사용된 형식은 못쓰고 본인이 포함된 패키지에만 사용 가능.
-public 다른 패키지에 import하면 쓸 수 있음.
-일반적으로 메소드는 public붙여주면 됨.
-일반적으로 클래스 내의 변수(필드)는 private를 붙여주고 필요하면 풀어주거나 하면 됨.
-다른데서 쓰면 안되겠다 싶은건 private를 써주면 됨. 함수내에만 사용 가능 한 지역변수 같은 느낌으로 되는 듯.
-Class 값을 null로 설정하면 내부의 필드값을 전부 null로 설정하는것이 아니라 해당 Class가 참조한 주소를 없앤다는 의미이다.
-쉽게 생각하면 됨. 그냥 public화 된 필드를 입,출력으로 나누었을 뿐이다. 필드 속성도 나누면 알아서 다 맞춰주니까 그냥 필요할 때 잘 구분해서 쓰면 된다.
초기 설정 할 때는 생성자로 설정해 주는 것이 좋고 캡슐화 하여 만든 getter와 setter는 동작도중에 변경해야 할 상황에 쓰는게 좋음.
결국은 변수를 지역변수 처럼 변경한 뒤 입출력 기능으로 각각 메소드에 넣어서 사용하는 것이다. 자유도를 줄여서 버그를 줄이기 위함이다.
※클래스 다이어그램 검색하면 나옴
※중요 
객체자형은 이런식으로 간다. 클래스 내에 필드들은 private으로 두고 해당 필드들을 외부에 쓰게 만드려면 public으로 설정된 메소드에 넣어서 사용할 수 있게 해주면 된다.
사실상 좁게보면 public으로 설정된 필드랑 다를 것 없지만 사용이 너무 자유로워져서 한번이라도 잘못 사용하면 꼬이게 될 수있기 때문이 이유일 것 같다. 또한 메소드로 나누면 기능도 더 명확하게 명명할 수 있고 뭐 여튼 그래.
객체 지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다.
객체 데이터를 외부에서 읽고 변경 시 객체의 무결성이 깨질 수 있기 때문이다.
ex) 자동차 속도는 음수 불가, 하지만 외부에서 음수로 설정하면 객체 무결성이 깨진다.
따라서 객체 지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 선호한다.
데이터는 외부에서 접근하지 않도록 막고, 메소드는 공개해서
외부에서 메소드를 통해 데이터에 접근하도록 유도한다.
<상속>
상속해줄 class에 커서를 놓고 alt+enter를 하고 create subclass를 누르고 이름정하면 상속한 class가 생성된다.
@ 이런 주석을 '어노테이션 주석'이라고 한다. 일반 주석과 다른점이라면 평소에는 의미없는 주석이라도 기능을 부여하면 실제로 쓸 수 있다. 예) @Override
상속하기 싫은 변수에 final을 쓰면 상속을 못하게 할 수 있다.
상속을 받아오는건 이전 상속것만 가능하다. (super.super.~~ 같은건 안된다는 거임)
다른 클래스의 메소드의 인자에 상속을 선언한 클래스의 최상위 클래스(부모)가 인자로 선언되었을 때, 그 메소드를 사용할 때 해당 클래스의 하위상속 클래스들(자식)도 인자로 사용 가능하더라
<그 외>
옮기기 전에 실행이 되던 클래스를 다른 패키지로 옮기고나면, 해당 클래스의 생성자를 다른 패키지에 사용하려면 클라스가 public이기만 하면 되는게 아니라 생성자도 public이여야 한다.
<결론>
꼭 캡슐화를 해서 과정은 복잡해져도 실수를 줄여나가도록 하자.
-필드값은 private화, class와 method, 생성자는 public화.
상속은 확장의 개념이다. 원래 성질에서 추가적인 성질을 부여할 때 사용해도 좋고 분류표로 나눈다 치면 상위 분류표에서 계속 하위로 추가해나가면 된다.(예> 슬라임->독슬라임,불슬라임 / 무기-칼,도끼,활-칼1,칼2,칼3,도끼1,도끼2...)