접근 제어자를 사용하면 변수나 메서드의 사용 권한을 설정할 수 있음
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