- 학습 목표 1 : JAVA 접근 제한자 공부하기
클래스, 변수, 메소드 등의 멤버에 대한 접근 권한을 지정하는 키워드
- 외부로부터의 접근을 제한하여 데이터를 보호하고, 코드를 안전하게 관리할 수 있도록 도와준다.
- 라이브러리 클래스를 설계할 때, 클래스의 내부 구현을 감추고 외부에서 사용할 수 있는 인터페이스만을 제공하기 위해 사용된다.
접근 제한자 | 클래스 내부 | 동일 패키지 | 하위 클래스 | 전체 |
---|---|---|---|---|
private | O | X | X | X |
default | O | O | X | X |
protected | O | O | O | X |
public | O | O | O | O |
-
클래스의 접근 제한
클래스에 적용할 수 있는 접근 제한은public
과default
두 가지이다.// default class A {} // public public class B {}
-
생성자의 접근 제한
생성자에 적용할 수 있는 접근 제한은public
,protected
,default
,private
네 가지이다.public class A { // public public A() {} // protected protected A() {} // default A() {} // private private A() {} }
- 클래스에 생성자를 선언하지 않으면, 컴파일러에 의해 기본 생성자가 자동으로 생성된다. 이 때 기본 생성자의 접근 제한은 클래스의 접근 제한과 동일하다.
-
필드와 메소드의 접근 제한
필드와 메소드에 적용할 수 있는 접근 제한은public
,protected
,default
,private
네 가지이다.public class A { // public public int num; // protected protected void method() {} // default void method2() {} // private private void method3() {} }
- 필드와 메소드의 접근 제한은 클래스의 접근 제한보다 더 강하게 제한할 수 있다.
예를 들어, 클래스의 접근 제한이
public
이라면, 필드와 메소드의 접근 제한을private
로 지정하여 외부로부터 완전히 숨길 수 있다.
- 필드와 메소드의 접근 제한은 클래스의 접근 제한보다 더 강하게 제한할 수 있다.
-
상황
샌드위치 만드는 시간을 현실적으로 표현하기 위해 출력을 일정 시간 간격으로 나타내고 싶었다.샌드위치 만드는 중. 샌드위치 만드는 중.. 샌드위치 만드는 중...
-
구현 방법으로는
Timer
클래스와Thread.sleep()
메소드가 있었다.-
Timer 클래스
- 일정 시간 간격으로 작업을 수행할 수 있도록 도와주는 클래스
- 내부적으로 별도의 스레드를 생성하여 작업을 수행한다.
- 메인 스레드가 다른 작업을 수행하는 동안에도 예약된 작업이 백그라운드에서 실행된다.
import java.util.Timer; import java.util.TimerTask; public class TimerExample { public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new TimerTask() { // schedule 메소드를 사용하여 TimerTask를 예약 @Override public void run() { System.out.println("작업 실행됨"); } }, 1000); // 1초 후에 작업 실행 } }
-
Thread.sleep() 메소드
- 현재 스레드를 일정 시간 동안 멈추게 하는 메소드
- 지연 시간동안 해당 스레드는 다른 작업을 수행할 수 없다.
- 예외 처리가 필요하다. (
InterruptedException
)
public class ThreadSleepExample { public static void main(String[] args) { for (int i = 0; i < 3; i++) { System.out.println("작업 실행됨"); try { Thread.sleep(1000); // 1초 동안 멈춤 } catch (InterruptedException e) { e.printStackTrace(); } } } }
-
-
방법
나는 일정 시간 지연을 주는 것이 아니라, 일정 시간 간격으로 작업을 수행하고 싶었기 때문에Timer
클래스를 사용하여 구현하였다.Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { StringBuilder sb = new StringBuilder("= 샌드위치 제작중"); sb.append(".".repeat(Math.max(0, count % 4))); sb.append(" ="); System.out.print(sb.toString() + "\r"); count++; if (count == 4) { timer.cancel(); System.out.println("= 샌드위치 제작 완료! ="); } } }, 0, 1000);
-
상황
start()의 다음 작업인 주문 완료 completeOrder()는 status가 배달 완료로 업데이트 된 후에 진행되어야 한다. 근데 샌드위치를 제작하는 makeSandwich()를 호출하는 Main 클래스의 start() 메소드가 비동기적으로 실행되기 때문에, 샌드위치 제작이 완료되기 전에 배달이 시작되는 문제가 발생했다. -
의도
start() 메소드 완료되기를 기다렸다가 completeOrder() 메소드를 실행하도록 동기 처리를 해야 한다. -
방법 CountDownLatch 클래스의
latch.await()
메소드를 사용하여, start() 메소드가 완료되었는지 확인하고, completeOrder() 메소드를 실행하도록 했다.[CountDownLatch.await()]
- CountDownLatch의 count가 0이 될 때까지 대기한다.
import java.util.concurrent.CountDownLatch;
public class Main {
CountDownLatch latch = new CountDownLatch(1);
public static void main(String[] args) {
Main main = new Main();
main.start();
try { // start() 메소드가 끝나면 latch.await()가 끝나면서 다음 코드 실행
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (delivery.getStatus().equals("배달완료")) {
main.completeOrder();
}
}
}
public void processDelivery() {
// ===== 생략 =====
updateStatus("배달중");
try {
Thread.sleep(2000);
updateStatus("배달완료");
Main.latch.countDown(); // start() 메소드가 끝났음을 알림
} catch (InterruptedException e) {
e.printStackTrace();
}
}
- 스크럼 중 완료한 작업:
JAVA 접근 제한자 공부하기
- 접근 제한자가 클래스, 생성자, 필드, 메소드에 적용되는 방식을 공부하였다. 접근 제한자를 사용하면 외부로부터의 접근을 제한하여 데이터를 보호하고, 코드를 안전하게 관리할 수 있도록 도와준다는 것을 알게 되었다.
- [이것이 자바다] 6.13. 접근 제한자