[제로베이스] 백엔드 파트타임 스쿨 5기 - 3주차 회고

3주차 회고

- 이번주에 다룬 학습 내용은 주로 실무에서 많이 사용되는 부분들인 "인터페이스", "익명클래스", "입출력", "예외처리", "컬렉션 프레임워크"에 대해 학습하였다. 이론에 대해 모르고 개발을 진행하던 지난 날들을 회상하며 다양한 메소드들과 사용 방법을 익히며 실습하면서 한층 더 이해하는 주간이었다.

- 지난 2주 간의 학습 내용에 대한 복습을 진행하고, 3주차 학습을 진행하다보니 과제 제출 기한을 준수하지 못하는 상황이 벌어졌다. 이는 프로젝트의 납기일 준수를 지키지 못한 것과 같다고 생각하니 스케줄링(WBS)의 중요성을 다시금 깨닳는 시간이 되었다.

주요 학습 내용

JAVA의 인터페이스 [링크]

- 인터페이스는 추상 클래스가 발전된 기능이다.

- 인터페이스의 멤버는 상수와 추상 메소드만 가능하다.

- 상속과 인터페이스를 동시에 사용하여 다중 상속과 같은 효과를 얻을 수 있다.

- 여러 개의 인터페이스를 구현 클래스에서 사용하기 위해서는 콤마(,)를 사용하여 나열해준다.

JAVA의 내부 클래스(익명클래스)와 내부 인터페이스 [링크]

- 다른 클래스의 내부에 존재하는 클래스를 의미하며, 중첩 클래스라고도 한다.

- 내부 클래스는 외부 클래스의 멤버에 자유롭게 접근이 가능하나 외부에서는 내부 클래스에 접근이 불가능하다.

- 익명 내부 클래스는 이름을 가지지 않는 클래스를 의미하며, 선언과 동시에 객체를 생성한다.

- 클래스의 멤버로 선언된 인터페이스를 의미하며, static 키워드로 지정할 수 있다.

JAVA의 입출력 [링크1, 링크2 ]

구분 입력/출력 방법
콘솔 입력   Systrem.in.read()
  InputStreamReader reader = ...
  BufferedReader br = ...
  Scanner sc = ...
출력   System.out.println(...);
  System.out.print(...);
  System.out.printf(...);
파일 입력   FileInputStream ...
  BufferedReader br = ...
출력   FileOutputStream ...
  FileWriter ...
  PrintWriter ...

JAVA의 예외처리 [링크]

- 예외 (Exception) : 정상적이지 않은 케이스를 의미한다.

- 예외 처리 (Exception Handling) : 정상적이지 않은 케이스에 대한 적절한 처리 방법

try {
    // 예외가 발생할 수도 있는 부분;
} catch (예외 케이스 1) {
    // 예외 케이스 1이 발생해야 실행되는 부분;
}

- finally : 예외 발생 여부와 관계없이 항상 실행되는 부분

try {
    // 예외가 발생할 수도 있는 부분;
} catch (예외 케이스 1) {
    // 예외 케이스 1이 발생해야 실행되는 부분;
} finally {
    // 항상 실행되는 부분;
}

- throw는 예외를 발생시키는 것을 의미하고, throws는 예외를 전가시키는 것을 의미한다.

접근제어자 메소드명 () {
    throw new Exception();
}

접근제어자 메소드명 () throws 예외처리클래스명 {
    ...
}

JAVA의 컬렉션 프레임워크 [링크1, 링크2]

- 컬렉션 프레임워크 (Collection Framework)

    - 여러 데이터를 편리하게 관리할 수 있게 만들어 놓은 것을 말하며 자료 구조 및 알고리즘을 구조화한 것이다.

    - 대표적으로 List 인터페이스, Set 인터페이스, Map 인터페이스가 있다.

- List 인터페이스 (List Interface)

    - 순서가 있는 데이터의 집합이다.

    -  데이터의 중복을 허용한다.

    -  대표적인 구현 클래스 : ArrayList, LinkedList, Vector

- Set 인터페이스

    -  순서가 없는 데이터의 집합이다.

    -  데이터의 중복이 허용되지 않는다.

    -  대표적인 구현 클래스 : HashSet, TreeSet

-  Map 인터페이스

    -  키와 값이 쌍으로 이루어진 데이터 집합이다.

    -  순서를 유지하지 않는 다는 특징이 있다.

    -  대표적인 구현 클래스 : HashMap, TreeMap

과제 수행

놀이공원 입장권 계산 프로그램

- Scanner의 입력함수와 다중 조건문을 통한 입장권 계산하는 로직을 작성하는 목적을 둔 프로그램이다.

- 놀이동산의 입장권이 나이와 우대사항에 따라 입장료가 달라진다.

놀이공원 입장권 계산 프로그램
[놀이공원 입장권 계산 프로그램]

핵심 사항

-  중복이 적용되지 않으면서 가장 많은 할인을 받는 금액을 적용

-  3세 미만 무료입장 과 13세 미만, 17시 이후 입장에 대한 특별할인 적용

-  복지카드, 국가유공자에 대한 일반할인 적용

해결 방안

- 중복이 적용되지 않게 하기 위해 금액이 큰 할인 대상자부터 다중 조건문을 활용하여 분기처리를 진행하였다.

- 13세 미만과 17시 이후부터 24시 미만에 대해서는 OR 연산자를 사용하여 분기하였다.

- 복지카드와 국가유공자에 대한 처리는 입력같이 대문자로 들어올 수도 있을 것을 예상하여 String 클래스의equalsIgnoreCase()  메소드로 대상자 여부를 확인 하는 방식으로 하였다.

결과 소스 (링크)

- 핵심 로직

핵심 로직
[핵심 로직]

- 결과 예시

결과 예시
[결과 예시]

주민등록번호 생성 프로그램

- Scanner의 입력함수와 조건문, Random 클래스를 통한 주민번호 생성 로직을 하는 것에 목적을 둔 프로그램이다.

- 2020년부터 변경된 주민등록번호 생성 조건에 맞춰 생성하도록 로직을 구현하여야 한다.

주민등록번호 생성 프로그램
[주민등록번호 생성 프로그램]

핵심 사항

- Random 함수 사용 시 중복되는 번호 생성에 대한 방지

- 입력받는 탄생년도의 뒷자리 2자리 출력

- 입력받는 탄생월과 탄생일이 일단위 입력 시에 대한 처리

- 입력받는 성별이 숫자가 아닌 문자이므로 이에 대한 처리

해결 방안

- 중복이 적용되지 않게 하기 위해 Random 함수의 Seed를 현재 로컬 시간의 유닉스타임으로 설정하였다.

- Random 클래스의 nextInt() 메소드의 시작은 0 ~ 입력한 값까지의 범위에서 랜덤으로 추출되므로, 0이 발생될 경우를 대비하여 + 1를 해주었다.

- 성별에 대해서는 대소문자 구분 없이 분기 처리를 위해 equlasIgnoreCase() 메소드를 사용하여 분기 처리하여 남자는 3, 여자는 4로 int형 변수에 담아줬다.

- 탄생년도 뒷자리 2자리만 추출하기 위해 substring() 메소드를 사용하여 값을 추출하였으며, 월과 일에 대해 십단위가 아닌 일단위로 입력하였을 경우, 앞에 0을 입력해주기 위해 String.format() 메소드를 사용하였다.

결과 소스 (링크)

- 핵심 로직

핵심 로직
[핵심 로직]

- 결과 예시

결과 예시
[결과 예시]


사람은 누구나 자신이 할 수 있다고 생각하는 그 이상의 일을 할 수 있다.
- 헨리 포드