
접근 제어자를 사용하면 변수나 메서드의 사용 권한을 설정할 수 있음


private이 붙은 변수나 메서드는 해당 클래스 안에서만 접근이 가능함
ex)
public class Sample {
    private String secret;
    private String getSecret() {
        return this.secret;
    }
}
secret변수와 getSecret 매서드는 오직 Sample 클래스에서만 접근이 가능하고 다른 클래스에서는 접근이 불가능함

ex)
/* house/HouseKim.java */
package house;  // 패키지가 동일함
public class HouseKim {
    String lastname = "kim";  // lastname은 default 접근제어자로 설정됨
}
/* house/HousePark.java */
package house;  // 패키지가 동일함
public class HousePark {
    String lastname = "park";
    public static void main(String[] args) {
        HouseKim kim = new HouseKim();
        System.out.println(kim.lastname);  // HouseKim 클래스의 lastname 변수를 사용할 수 있음
    }
}
동일패키지를 사용하고 있으므로 HousePark 클래스에서 HouseKim의 lastname 변수에 접근이 가능하며, kim이 출력됨

protected가 붙은 변수나 메서드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은 클래스에서만 접근 가능함
ex)
/* house/HousePark.java */
package house;  // 패키지가 서로 다름
public class HousePark {
    protected String lastname = "park";
}
/* house/person/EungYongPark.java */
package house.person;  // 패키지가 서로 다르다.
import house.HousePark;
public class EungYongPark extends HousePark {  // HousePark을 상속했다.
    public static void main(String[] args) {
        EungYongPark eyp = new EungYongPark();
        System.out.println(eyp.lastname);  // 상속한 클래스의 protected 변수는 접근이 가능함
    }
}
패키지는 다르지만, EungYongPark 클래스는 HousePark 클래스를 상속했음
HousePark의 lastname 변수가 protected이기 때문에 eyp.lastname과 같은 접근이 가능함

public 접근 제어자가 붙은 변수나 메서드는 어떤 클래스에서도 접근이 가능함
ex)
package house;
public class HousePark {
    protected String lastname = "park";
    public String info = "this is public message.";
}
import house.HousePark;
public class Sample {
    public static void main(String[] args) {
        HousePark housePark = new HousePark();
        System.out.println(housePark.info);
    }
}
final은 오직 한 번만 할당할 수 있는 엔티티를 정의할 때 사용되는 키워드
ex)
public class Sample {
    public static void main(String[] args) {
        final int N = 123;  // final로 설정하면 값을 바꿀 수 없음
        N = 456;  // 컴파일 오류 발생
    }
}
public class Service {
	public void variableFinal() {
    	final int value = 2;
    	final Person person = new Person("사바라다", 29);
    	value = 2;  // 컴파일 오류 발생
    	person.setAge(10);
    	person.setName("사바라");
    	person = new Person("염광호", 29);  // 컴파일 오류 발생
  }
}
메서드에 final을 선언하면 Override를 제한함
class Person {
	private final String name;
	private final int age;
  	public Person(String name, int age) {
    	this.name = name;
    	this.age = age;
  	}
  	public void speech() {
    	System.out.println("나는 " + name + " 입니다.");
  	}
}
class Korean extends Person {
	public Korean(String name, int age) {
  		super(name, age);
  	}
  	@Override
  	public void speech() {
    	System.out.println("나는 " + name + " 이며, " + age + " 입니다.");
  	}
}
person에서 정한 speech메소드를 나라별로 바꾸는걸 방지하고 싶으면 public final void speech()로 바꾸면 됨
final을 class에 붙이면 상속 불가능 클래스가 됨
ex)
public final class Integer extends Number implements Comparable<Integer> { ... }

try-catch 블록 뒤에 둘 수 있는 선택적인 블록
try{
	// 예외 발생 가능성이 있는 문장들;
} catch(예외타입1 매개변수명){
	// 예외타입1의 예외가 발생할 경우 처리문장들;
} catch(예외타입n 매개변수명){
	// 예외타입n의 예외가 발생할 경우 처리문장들;
} finally{
	// 항상 수행할 필요가 있는 문장들;
}
https://wikidocs.net/232
https://www.tcpschool.com/java/java_modifier_accessModifier’
https://wikidocs.net/158529
https://sabarada.tistory.com/148
https://mangkyu.tistory.com/131
https://dev-coco.tistory.com/153
https://thalals.tistory.com/314
https://wjheo.tistory.com/entry/final-finally-finalize-%EC%B0%A8%EC%9D%B4%EC%A0%90
https://medium.com/@logishudson0218/java-final-finally-finalize%EC%9D%98-%EC%B0%A8%EC%9D%B4-ae04a58188fa