Skip to content

Latest commit

 

History

History
227 lines (169 loc) · 7.26 KB

2024-05-20.md

File metadata and controls

227 lines (169 loc) · 7.26 KB

날짜: 2024-05-20


🌤️ 스크럼

  • 학습 목표 1 : JAVA 접근 제한자 공부하기

⚡️ 새로 배운 내용

[JAVA] 접근 제한자 (Access Modifier)

클래스, 변수, 메소드 등의 멤버에 대한 접근 권한을 지정하는 키워드

  • 외부로부터의 접근을 제한하여 데이터를 보호하고, 코드를 안전하게 관리할 수 있도록 도와준다.
  • 라이브러리 클래스를 설계할 때, 클래스의 내부 구현을 감추고 외부에서 사용할 수 있는 인터페이스만을 제공하기 위해 사용된다.
접근 제한자 클래스 내부 동일 패키지 하위 클래스 전체
private O X X X
default O O X X
protected O O O X
public O O O O
  • 클래스의 접근 제한
    클래스에 적용할 수 있는 접근 제한은 publicdefault 두 가지이다.

    // 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로 지정하여 외부로부터 완전히 숨길 수 있다.


🔥 오늘의 도전 과제와 해결 방법

[JAVA] Timer 클래스 vs Thread.sleep() 메소드

  • 상황
    샌드위치 만드는 시간을 현실적으로 표현하기 위해 출력을 일정 시간 간격으로 나타내고 싶었다.

    샌드위치 만드는 중.
    샌드위치 만드는 중..
    샌드위치 만드는 중...
  • 구현 방법으로는 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);

[JAVA] latch.await() 메소드로 동기 처리하기

  • 상황
    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. 접근 제한자