자바 프로그래밍 (1)
포스트
취소

자바 프로그래밍 (1)

강의 자료: https://github.com/hbsowo58/autoever

설치

  1. zulu에서 자바 17(LTS) 버전 설치 → 강의 환경이기 때문에 적어도 “17” 버전은 맞춰줘야 함. 이게 다르면 코드 작성에 문제가 있을 수 있다.
    • 왜 17인가? 지금 현업에서 많이 쓰기 때문
  2. 인텔리제이 IDE 설치 → 난 vscode 쓸거긴 한데 일단 깔아는 두기로 했음. 깔아서 손해볼 거 없잖아.

개념을 똑바로 아세요

  • 변수: 개발자는 variable이라고 대답하면 안돼요 메모리 공간에 하나의 값을 할당하기 위한 데이터 형식이라고 대답해야 맞다
  • 프레임워크와 라이브러리: 붕어빵틀 알죠? 면접관들 연배에 맞게 대답하세요. 그 사람들은 붕어빵으로 배웠어.
  • 프로그램: 이건 사실상 순서도죠. 프로그래머는 순서도를 작성하는 기계고요 프로그래밍은 순서도를 작성하는 일입니다
  • 배열: 같은 자료형의 여러 값을 하나의 변수명에 묶어서 저장. “같은 자료형”인 게 중요해. 파이썬 list는 배열 아닙니다.
  • 강타입과 약타입 언어: 서로 다른 자료형끼리 연산을 시켰을 때 오류가 나면 강타입(예: 파이썬), 오류가 안 나고 알아서 계산해주면 약타입(예: 자바스크립트)
  • 함수와 메소드의 차이: 함수는 그냥 정의된 기능, 메소드는 그게 클래스 안에 있는 것
  • 객체: 상태와 행동의 집합. 클래스는 그 객체를 양산하기 위한 틀이자 생산자. 클래스 없이 객체를 선언하는 걸 객체 리터럴이라고 하고, 클래스가 생산한 객체를 인스턴스라고 구분해서 부르는 거다.
  • 단축 평가 and: and 연산을 실행할 때, 자바스크립트 기준, 왼쪽부터 T/F를 평가하면서 제일 먼저 발견되는 falsy한 값을 반환한다. falsy가 없으면 마지막 값을 반환한다. 0, null, None 등은 falsy로 간주되는 값이기 때문에 바로 반환되지만 1, 2, 3 같은 것은 falsy하지 않으므로 마지막 값이 반환되는 거임.
    • 요점은 순서대로 연산을 하다가 처음으로 false가 확정되는 순간 break하고 바로 false를 반환한다는 거임
  • 단축 평가 or: or 연산을 실행할 때 처음으로 truthy한 값이 나오면 바로 반환하되, 그런 게 없으면 마지막 값을 반환.
    • and와 or의 특성상 T/F만 반대이다 뿐이지 결과가 확정될 때까지만 연산하는 건 마찬가지임.
  • 조건문: if를 줄줄이 연쇄하는 것보다는 if에서 바로 return하는 걸 여러 번 쓰는 걸 선호한다.

코딩하기

어떤 웹 서비스에서 사용자의 기본 정보를 저장하려고 합니다.

아래 정보를 저장합니다. 적절한 자료형과 변수명을 생각합니다. 변수로 선언한 후, 예시 값을 대입하세요.

저장할 정보설명예시 값
사용자 이름문자로 저장되는 이름“김자바”
나이정수로 저장되는 나이29
로그인 여부로그인한 상태인지 아닌지true
회원 ID아주 큰 정수 값으로 저장됨202406131234L
평점소수점 포함 점수4.8
휴대폰 번호아직 입력하지 않음 → 빈 값(null)null
관심 있는 태그 목록사용자가 선택한 태그 3개“코딩”, “자바”, “웹개발”
1
2
3
4
5
6
7
8
9
10
11
public class DAY1_1 {
    public static void main(String[] args) {
        String name = "Kim Ja Va";
        int age = 29;
        Boolean is_login = true;
        long id = 202406131234L;
        double score = 4.8;
        String phone = null;
        String[] tags = {"Coding", "Java", "Web Development"};
    }
}

간단한 영화 예매 시스템을 개발하고 있다. 필요한 정보들을 변수, 배열, 형변환, 상수를 활용하여 구현하시오.

요구사항

  • 예매 가능한 영화는 3편이며, 각각의 제목을 문자열 배열에 저장한다.
  • 영화 가격은 모두 동일하며, 상수로 선언하여 1장당 12,000원으로 저장한다.
  • 사용자가 선택한 영화는 “어벤져스”, “인사이드 아웃”, “라라랜드” 순으로 각각 1장, 2장, 3장을 예매했다고 가정한다.
  • 입력값은 문자열(String)로 주어지며, 이를 정수로 변환하여 계산한다.
  • 총 결제 금액을 출력한다.

예제 출력

1
2
3
4
5
영화: 어벤져스, 예매 수: 1, 금액: 12000
영화: 인사이드 아웃, 예매 수: 2, 금액: 24000
영화: 라라랜드, 예매 수: 3, 금액: 36000

 결제 금액: 72000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class DAY1_2 {
    public static void main(String[] args) {
        // 영화 제목 배열
        String[] movies = {"어벤져스", "인사이드 아웃", "라라랜드"};

        // 영화 가격 상수
        final int MOVIE_PRICE = 12_000;

        int tickets[] = {1, 2, 3}; // 예매한 티켓 수

        int totalAmount = 0; // 총 결제 금액
        // 각 영화에 대한 결제 금액 계산 및 출력
        for (int i = 0; i < movies.length; i++) {
            int amount = tickets[i] * MOVIE_PRICE; // 각 영화의 결제 금액 계산
            totalAmount += amount; // 총 결제 금액 누적
            System.out.println(String.format("영화: %s, 예매 수: %d, 금액: %d원", movies[i], tickets[i], amount));
        }
        // 총 결제 금액 출력
        System.out.println("\n총 결제 금액: " + totalAmount + "원");
    }
}

교재 답안

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Solution {
    public static void main(String[] args) {
        // 상수 선언: 영화 한 장 가격은 고정된 값이므로 final 사용
        final int PRICE_PER_TICKET = 12000;
        // 배열: 영화 제목들을 배열에 저장
        String[] movieTitles = { "어벤져스", "인사이드 아웃", "라라랜드" };
        // 배열 + 문자열 자료형: 예매 수량을 문자열로 저장
        String[] ticketCounts = { "1", "2", "3" };

        // 형변환: 문자열을 정수로 변환 (String → int)
        int count1 = Integer.parseInt(ticketCounts[0]);
        int count2 = Integer.parseInt(ticketCounts[1]);
        int count3 = Integer.parseInt(ticketCounts[2]);

        // 계산: 예매 수량 × 가격 → 영화별 금액 계산
        int total1 = count1 * PRICE_PER_TICKET;
        int total2 = count2 * PRICE_PER_TICKET;
        int total3 = count3 * PRICE_PER_TICKET;
        int grandTotal = total1 + total2 + total3; // 전체 금액 계산: 영화별 금액 합산

        // 출력: 각 엉화 청보 출력
        System.out.println("영화: " + movieTitles[0] + ", 예매 수: " + count1 + ", 금액: "+ total1 +"원");
        System.out.println("영화: " + movieTitles[1] + ", 예매 수: " + count2 +", 금액: " + total2 + "원");
        System.out.println("영화: " + movieTitles[2] + ", 예매 수: " + count3 + ", 금액: " + total3 + "원");
        System.out.println(); // 줄 바꿈
        System.out.println("총 결제 금액: " + grandTotal + "원"); // 총 결제 금액 줄력
    }
}

여행지를 선택하고, 나이와 회원 여부에 따라 추천 혜택을 받는다.

여행지 이름과 예약 수량, 회원 여부와 나이가 다음과 같이 저장되어 있다.

1
2
3
4
String[] destinations = { "제주도", "강름", "부산" };
String[] bookingCounts = { "2", "0", "1" };
boolean isMember = true;
int age = 25;

요구사항

  • 각 여행지의 예약 현황을 출력한다. (예약 수량은 정수로 변환하여 활용)
  • 1인당 여행 비용은 100,000원으로 고정되어 있다.
  • 전체 여행 예약 수가 3건 이상이고, 회원이며, 나이가 20세 이상이면 “여행 추천 혜택 대상” 출력, 아니라면 “일반 고객” 출력

출력 결과

1
2
3
4
5
6
7
[예약 현황]
제주도: 2건
강증: 0건
부산: 1건

총 금액: 300000원
여행 추천 혜택 대상
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class DAY1_3 {
    public static void main(String[] args) {
        String[] destinations = { "제주도", "강릉", "부산" };
        String[] bookingCounts = { "2", "0", "1" };
        boolean isMember = true;
        int age = 25;

        System.out.println("[예약 현황]");
        int totalBookings = 0;
        for (int i = 0; i < destinations.length; i++) {
            int bookings = Integer.parseInt(bookingCounts[i]);
            totalBookings += bookings;
            System.out.println(destinations[i] + ": " + bookings + "건");
        }

        int totalCost = totalBookings * 100000;
        System.out.println("\n총 금액: " + totalCost + "원");

        if (totalBookings >= 3 && isMember && age >= 20) {
            System.out.println("여행 추천 혜택 대상");
        } else {
            System.out.println("일반 고객");
        }
    }
}

단축 평가 이해하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class DAY1_4 {
    public static void main(String[] args) {
        int a = 10;

        if (a < 5 && a++ > 1) {
            System.out.println("A");
        }
        else {
            System.out.println("B");
        }
        System.out.println(a);

        int b = 10;

        if (b > 5 || ++b > 1) {
            System.out.println("A");
        }
        else {
            System.out.println("B");
        }
        System.out.println(b);
    }
}
1
2
3
4
B
10
A
10

아래의 요구사항을 보고 자바 클래스의 변수를 선언해보자

  • 공장의 고유 식별 번호 (매우 큰 숫자)
  • 공장 명칭 (한글/영문 혼용)
  • 현재 공정 온도 (소수점 발생 가능, 센서 오류 시 데이터 비어있음)
  • 오늘 생산된 제품 총 개수 (최대 100만 개)
  • 현재 라인 가동 여부 (ON/OFF)
  • 최근 점검 일자 (날짜와 시간 포함)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.time.LocalDateTime;

public class DAY1_5 {
    public static void main(String[] args) {
        // 공장의 고유 식별 번호 (매우 큰 숫자)
        long factoryId = 123456789012345L;

        // 공장 명칭 (한글/영문 혼용)
        String factoryName = "서울공장 Seoul Factory";

        // 현재 공정 온도 (소수점 발생 가능, 센서 오류 시 데이터 비어있음)
        Double currentTemperature = 75.5; // 센서 오류 시 null로 설정 가능

        // 오늘 생산된 제품 총 개수 (최대 100만 개)
        int totalProductsProduced = 500000;

        // 현재 라인 가동 여부 (ON/OFF)
        boolean isLineOperating = true; // ON: true, OFF: false

        // 최근 점검 일자 (날짜와 시간 포함)
        LocalDateTime lastInspectionDate = LocalDateTime.parse("2024-06-01T14:30:00"); // ISO 8601 형식
    }
}

컨베이어 벨트 이상 감지 시스템 구축

10개의 제품이 컨베이어 벨트를 지나갑니다.

각 제품의 무게는 100, 102, 95, 110, 88, 105, 101, 99, 103, 100입니다.

조건 1:무게가 90 미만이거나 110 초과면 “불량품 발생” 메시지를 출력하세요.

조건 2:불량품이 3개 이상 나오면 “라인 즉시 정지”를 출력하고 반복문을 탈출하세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class DAY1_6 {
    public static void main(String[] args) {
        int[] weights = {100, 102, 95, 110, 88, 105, 101, 99, 103, 100};
        int defectiveCount = 0;

        for (int weight : weights) {
            if (weight < 90 || weight > 110) {
                System.out.println("불량품 발생: " + weight + "kg");
                defectiveCount++;
            }
            if (defectiveCount >= 3) {
                System.out.println("라인 즉시 정지");
                break;
            }
        }
    }
}

기본 입출력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Scanner;

public class DAY1_7 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = "";

        while (!input.equals("1234")) {
            System.out.print("비밀번호를 입력하세요: ");
            input = sc.nextLine();
        }
        System.out.println("접속 성공!");

        sc.close();
    }
}

문제

  • 여러 개의 여행지가 있고, 각각은 계절 정보를 포함합니다.
  • 사용자에게 계절을 입력 받아, 해당 계절에 맞는 여행지를 추천해주는 프로그램을 작성하세요.
  • 여행지 목록과 계절 정보는 인덱스로 연결되어 있음
  • places[0] = 제주도, seasons[0] = 여름 -> 제주도는 여름에 추천
1
2
const places = ["제주도", "강릉", "부산", "설악산", "여수"];
const seasons = ["여름", "겨울","여름","가을", "봄"];
  • 일치하는 여행지가 없다면 “해당 계절의 추천 여행지가 없습니다.” 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.Scanner;

public class DAY1_8 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String[] places = {"제주도", "강릉", "부산", "설악산", "여수"};
        String[] seasons = {"여름", "겨울", "여름", "가을", "봄"};

        System.out.print("계절을 입력하세요: ");
        String inputSeason = sc.nextLine();

        boolean found = false;
        for (int i = 0; i < seasons.length; i++) {
            if (seasons[i].equals(inputSeason)) {
                System.out.println(places[i] + "는 " + inputSeason + "에 추천되는 여행지입니다.");
                found = true;
            }
        }

        if (!found) {
            System.out.println("해당 계절의 추천 여행지가 없습니다.");
        }

        sc.close();
    }
}
이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.

Optuna와 TPE, 메타-하이퍼파라미터

자바 프로그래밍 (2)