[JAVA] 접근 제어자, final/finally/finalize

mingsso·2023년 10월 8일
0

Java-Kotlin

목록 보기
4/17

1️⃣ 접근 제어자(Access Modifier)

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

  • 종류: private, dafault, protected, public
  • private < default < protected < public 순으로 많은 접근을 허용함

private

private이 붙은 변수나 메서드는 해당 클래스 안에서만 접근이 가능함

ex)

public class Sample {
    private String secret;
    private String getSecret() {
        return this.secret;
    }
}

secret변수와 getSecret 매서드는 오직 Sample 클래스에서만 접근이 가능하고 다른 클래스에서는 접근이 불가능함


default

  • 접근 제어자를 별도로 설정하지 않을 경우 자동으로 default로 설정됨
  • 동일한 패키지 안에서만 접근이 가능함

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

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

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);
    }
}



2️⃣ final (상수)

final은 오직 한 번만 할당할 수 있는 엔티티를 정의할 때 사용되는 키워드

  • 변수, 메소드, 클래스에 대해 사용할 수 있음
  • 데이터를 ReadOnly로 만들어, 객체 내부에서 값의 변환이나 가공을 하지 않겠다고 선언하여 데이터를 지킬 때 사용됨

변수에서

  • 변수에 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에 붙이면 상속 불가능 클래스가 됨

  • 클래스 설계시 재정의를 불가능하게 하고 싶으면 final로 등록하는게 추후 유지보수차원에서 좋음

ex)

public final class Integer extends Number implements Comparable<Integer> { ... }



3️⃣ finally

try-catch 블록 뒤에 둘 수 있는 선택적인 블록

  • try-catch 블록과 함께 사용되며, 예외가 던져지더라도 꼭 실행되어야 하는 로직이 있을 경우 finally절에 두면 됨
  • finally블록은 try와 catch블록이 실행된 후, 제어 흐름이 원래 지점으로 돌아가기 전에 실행됨
try{
	// 예외 발생 가능성이 있는 문장들;
} catch(예외타입1 매개변수명){
	// 예외타입1의 예외가 발생할 경우 처리문장들;
} catch(예외타입n 매개변수명){
	// 예외타입n의 예외가 발생할 경우 처리문장들;
} finally{
	// 항상 수행할 필요가 있는 문장들;
}



4️⃣ finalize()

  • 가비지 콜렉터가 더 이상 참조가 존재하지 않는 객체를 발견한 순간 호출하는 메서드임
  • Object 클래스에 정의된 메서드이기 때문에, 오버라이딩하여 커스텀 클래스의 객체가 GC에 의해 정리될 때 특정 동작을 수행하도록 할 수 있음






참고자료

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

profile
🐥👩‍💻💰

0개의 댓글