본문 바로가기
자바/Do it! 자바 프로그래밍 입문

Do it! 자바 프로그래밍 입문 후기

by limdae94 2025. 1. 16.
 
Do it! 자바 프로그래밍 입문
성공에 힘입어 좀 더 입문자의 눈높이에 맞춰 내용을 수정하고 최신 개발 트렌드에 맞게 개정판을 출간했습니다. 저자인 박은종 선생님이 20년 간 3만 명이 넘는 수강생에게 강의한 경험과 실무에서 쌓은 노하우를 바탕으로 자바 기초 문법부터 객체 지향 프로그래밍, 컬렉션, 람다, 스트림 등 핵심 기술을 폭넓게 다뤘습니다. 특히 자바 17 버전 이상과 인텔리제이 환경을 활용한 이 책의 실습 예제로 자바에 입문해 실무에 바로 적용할 수 있도록 구성했습니다. 장이 끝날
저자
박은종
출판
이지스퍼블리싱
출판일
2025.01.10

01장 되새김 문제

01 프로그램(코드)을 기계(컴퓨터)가 이해할 수 있는 언어로 바꾸는 작업을 컴파일(이)라고 합니다.

02 객체지향언어는 자바나 C++와 같이 대상이 되는 객체를 기반으로 프로그램을 구현합니다.

03 자바로 만든 프로그램은 자바 가상 머신이(가) 설치되어 있으면 운영체제와 상관없이 실행할 수 있습니다.

04 자바 개발을 위해 설치하는 자바 라이브러리를 JDK 라고 합니다.

05 자바 프로그램이 실행되는 자바 실행 환경을 JRE (이)라고 합니다.

06 01-3절에서 만든 첫번째 자바 프로그램으로 참고해 이번에는 인텔리제이에서 'Hello, World' 대신 여러분의 이름을 출력해 보세요.

public class Main {
    public static void main(String[] args) {
        System.out.println("홍길동");
    }
}

07 다음 빈칸에 {, }, :, // 중 하나를 골라서 써 넣어 보세요.

package hello;

public class HelloJava {
    public static void main(String[] args) {
        // 1.// 
        System.out.println("자바 프로그래밍 재미있다!"); // 2. ;
    } // 3. }
}

02장 되새김 문제

01 바이트 크기가 작은 자료형을 더 큰 자료형으로 대입하는 형 변환은 자동으로 이루어집니다. O

02 실수를 정수형 변수에 대입하는 경우에 형 변환이 자동으로 이루어지고, 소수점 이하 부분만 없어집니다.X

03 더 많은 실수를 표현하기 위해 비트를 가수부와 지수부로 나누어 표현하는 방식을 부동 소수점 방식(이)라고 합니다.

04 변수 두 개를 선언해서 10과 2.0을 대입하고, 두 변수의 사칙 연산 결과를 정수로 출력해 보세요.

public class Main {

    public static void main(String[] args) {
        int n1 = 10;
        double n2 = 2.0;
        System.out.println("n1 + n2 = " + (n1 + n2));
        System.out.println("n1 - n2 = " + (n1 - n2));
        System.out.println("n1 * n2 = " + (n1 * n2));
        System.out.println("n1 / n2 = " + (n1 / n2));
        System.out.println("n1 % n2 = " + (n1 % n2));
    }
}
// 실행 결과
n1 + n2 = 12.0
n1 - n2 = 8.0
n1 * n2 = 20.0
n1 / n2 = 5.0
n1 % n2 = 0.0

05 '글'이라는 한글 문자의 유니코드값을 찾아서 char형으로 선언한 변수에 저장한 뒤, 그 변수를 출력하여 확인해 보세요.

public class Main {

    public static void main(String[] args) {
        char c = '글';
        System.out.println("c = " + c);
        System.out.println("(int)c = " + (int) c);
    }
}
// 실행 결과
c = 글
(int)c = 44544

06 44쪽 '변수 선언하여 사용하기' 예제에서 변수 이름을 나이를 뜻하는 age로 바꾸고 여러분의 나이를 대입해 보세요.

public class Main {

    public static void main(String[] args) {
        int age;
        age = 19;
        System.out.println("age = " + age);
    }
}
// 실행 결과
age = 19

07 'int형 변수 year에 값 2018을 대입한다'를 의미하는 코드를 완성해 보세요.

public class Main {

    public static void main(String[] args) {
        int year = 2018;
        System.out.println("year = " + year);
    }
}

08 다음 중 적합하지 않은 변수 이름을 모두 고르세요. 1, 3

  1. 2018 2. _hello 3. int 4. MAX_COUNT 5. numberOfBaby

09 다음 설명과 일치하는 자료형을 찾아 선으로 연결해 보세요. 1-c, 2-a, 3-b

10 52쪽에서 실습한 '문자형 연습' 예제에서 ch1='Z', ch2=38, ch3=97로 바꾸어 대입하면 출력 결과가 어떻게 될까요?
Z, 90, & 97, a

11 MY_AGE 상수를 선언하고 출력하도록 코드를 완성해 보세요.

public class Constant {
    public static void main(String[] args) {
        static int MY_AGE = 22;  // 상수 MY_AGE를 선언하고 값 22를 대입함
        System.out.println(MY_AGE); // MY_AGE값을 출력함
    }
}

12 52쪽에서 실습한 '문자형 연습' 예제에서 형 변환을 사용했던 것을 기억하고 있나요? 주석 내용에 맞게 코드를 완성해 보세요. 오타

public class CharacterEx1 {
    public static void main(String[] args) {
        char ch1 = 'A';
        System.out.println((int)ch1);

        int ch2 = 67;
        System.out.println((char));
    }
}

03장 되새김 문제

01 다음 코드의 빈칸을 채워 보세요.

package chapter3;

public class OperationEx1 {
    public static void main(String[] args) {
        int myAge = 23;
        int teacherAge = 38;

        boolean value = (myAge > 25);
        System.out.println(value);

        System.out.println(myAge <= 25);
        System.out.println(myAge == teacherAge);

        char ch;
        ch = (myAge > teacherAge) ? 'T' : 'F';
        System.out.println(ch);
    }
}

02 다음 코드가 수행될 때 출력되는 값을 적어 보세요. 10

03 다음 코드가 수행될 때 출력되는 값을 적어 보세요. 10, 10, 11, 10

04 다음 코드가 수행될 때 출력되는 값을 적어 보세요. false, true, false

05 다음 코드가 수행될 때 출력되는 값을 적어 보세요. 2, 10, 8, -3

06 다음 코드가 수행될 때 출력되는 값을 적어 보세요. 18, 8, 2

07 다음 코드가 수행될 때 출력되는 값을 적어 보세요. 30

08 73쪽에서 실습한 '총점과 평균 구하기' 예제에서 국어 점수를 의미하는 korScore 변수를 추가하여 여러분이 원하는 점수를 대입해 보세요. 그리고 국어 점수까지 포함한 총점(totalScore)과 평균 점수(avgScore)를 구해서 결괏값을 출력하도록 예제를 수정해 보세요.

package operator;

public class OperationEx1 {
    public static void main(String[] args) {
        int mathScore = 90;
        int engScore = 80;
        int korScore = 70; //  korScore 변수 추가

        int totalScore = mathScore + engScore + korScore;
        System.out.println("Total score: " + totalScore);

        double avgScore = totalScore / 3.0;
        System.out.println("Average score: " + avgScore);
    }
}
// 실행 결과
Total score: 240
Average score: 80.0

09 74쪽에서 실습한 '증가 감소 연산자를 사용하여 값 연산하기' 예제에서 7행의 ++gameScore를 garmeScore++로, 10행의 --gameScore를 gameScore--로 바꾼 후 출력해 보세요.

public class Main {

    public static void main(String[] args) {
        int gameScore = 150;

        int lastScore1 = gameScore;
        lastScore1++;
        System.out.println("lastScore1++ = " + lastScore1);

        int lastScore2 = gameScore;
        lastScore2--;
        System.out.println("lastScore2-- = " + lastScore2);
    }
}
// 실행 결과
lastScore1++ = 151
lastScore2-- = 149

10 다음 문제에서 단락 회로 평가에 주의하여 각 번호별 출력 결과를 예상해 적어 보세요. true, 50, 10

11 다음 코드를 복합 대입 연산자를 사용해서 변경해 보세요. isEven, (num % 2) == 0

12 조건 연산자를 사용하여 10이 짝수면 true, 그렇지 않으면 false를 출력하도록 빈칸을 채워 보세요. ++, ==, &&, +=

13 다음 연산자를 우선순위가 높은 순으로 배치해 보세요. ++, ==, &&, +=

14 정수의 비트를 반대로 뒤집는 프로그램을 만들어 보세요. 5의 이진수는 0101입니다. 이를 뒤집으면 1010이 됩니다. 부호 비트까지 변경되므로 음수로 출력되어야 합니다. 정수 5의 비트가 반드로 바뀐 값을 출력해 보세요. 이때, Integer.toBinaryString(n)라고 작성하면 n에 대한 이진수 값이 출력됩니다.

System.out.println("이진수로 표현한 원래 값: " + Integer.toBinaryString(n));
public class Exercise14 {

    public static void main(String[] args) {
        int n = 5;
        int flippedDecimal = ~n;

        System.out.println("원래 값: " + n);
        System.out.println("비트를 반대로 뒤집은 값: " + flippedDecimal);
        System.out.println("이진수로 표현한 원래 값: " + Integer.toBinaryString(n));
        System.out.println("이진수로 표현한 뒤집은 값: " + Integer.toBinaryString(flippedDecimal));
    }
}

04장 되새김 문제

01 문제

public class Main {

    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 2;
        char operator = '+';

        if (operator == '+') {System.out.println("num1 + num2 = " + (num1 + num2));} 
        else {System.out.println("error");}
    }
}
public class Main {

    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 2;
        char operator = '+';

        switch (operator) {
            case '+':
                System.out.println("num1 + num2 = " + (num1 + num2));
                break;
            default:
                System.out.println("operator = " + operator);
        }
    }
}

02 문제

public class Main {

    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            for (int j = 0; j <= 9; j++) {
                if (i % 2 != 0) break;
                System.out.printf("%d * %d = %d\n", i, j, i * j);
            }
            System.out.println();
        }
    }
}

03 문제

public class Main {

    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            for (int j = 0; j <= 9; j++) {
                if (i < j) break;
                System.out.printf("%d * %d = %d\n", i, j, i * j);
            }
            System.out.println();
        }
    }
}

04 문제

public class Main {

    public static void main(String[] args) {
        int n = 4;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                System.out.print(" ");
            }
            for (int j = 0; j < 2 * i + 1; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

05 문제

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        int n = 4;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                System.out.print(" ");
            }
            for (int j = 0; j < 2 * i + 1; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

        for (int i = n - 2; i >= 0; i--) {
            for (int j = 0; j < n - i - 1; j++) {
                System.out.print(" ");
            }
            for (int j = 0; j < 2 * i + 1; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

    }
}

06 문제

public class Main {

    public static void main(String[] args) {
        char gender = 'F';
        if (gender == 'F') {
            System.out.println("여성입니다.");
        } else {
            System.out.println("남성입니다.");
        }
    }
}

07 문제

public class Main {

    public static void main(String[] args) {
        int age = 60;
        int charge = 0;

        if (age <= 60) {
            charge = 0;
            System.out.println("경로우대입니다.");
        }
        System.out.println("입장료는" + charge + "원입니다.");
    }
}

08 문제

public class Main {

    public static void main(String[] args) {
        int score = 70;
        char grade;

        if (score >= 90) {
            grade = 'A';
        } else if (score >= 80) {
            grade = 'B';
        } else if (score >= 70) {
            grade = 'C';
        } else if (score >= 60) {
            grade = 'D';
        } else {
            grade = 'F';
        }
        System.out.println(grade);
    }
}

09 문제

grade = (score >= 90) ? 'A' : 'B';

10 문제

public class Main {

    public static void main(String[] args) {
        int floor = 2;

        switch (floor) {
            case 1:
                System.out.println("1층 약국 입니다.");
                break;
            case 2:
                System.out.println("2층 정형외과 입니다.");
                break;
            case 3:
                System.out.println("3층 피부과 입니다.");
                break;
            case 4:
                System.out.println("4층 치과 입니다.");
                break;
            case 5:
                System.out.println("5층 헬스 클럽 입니다.");
                break;
            default:
                System.out.println("잘못된 입력 입니다.");
        }
    }
}

문제 17

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("숫자를 입력하세요 : ");
        int n = sc.nextInt();
        int f = 0;
        List<Integer> list = new ArrayList<>();

        for (int i = 2; i < n; i++) {
            for (int j = 2; j < i; j++) {
                if (i % j == 0) f += 1;
                if (f >= 1) break;
            }
            if (f == 0) {list.add(i);}
            f = 0;
        }

        for (Integer i : list) {
            System.out.println(i);
        }
    }
}

문제 18

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("팩토리얼 계산할 숫자를 입력하세요: ");
        int n = sc.nextInt();
        int result = 1;

        for (int i = 1; i <n; i++) {
            result += result * i;
        }
        System.out.printf("%d 팩토리얼은 %d 입니다.", n, result);
    }
}

05장 되새김 문제

09 문제

public class Member {
    private final String name;
    private final Integer age;
    private final Boolean maritalStatus;
    private final Integer numberChildren;

    private Member(String name, Integer age, Boolean maritalStatus, Integer numberChildren) {
        this.name = name;
        this.age = age;
        this.maritalStatus = maritalStatus;
        this.numberChildren = numberChildren;
    }

    public static Member of(String name, Integer age, Boolean maritalStatus, Integer numberChildren) {
        return new Member(name, age, maritalStatus, numberChildren);
    }

    @Override
    public String toString() {
        return "Member{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", maritalStatus=" + maritalStatus +
                ", numberChildren=" + numberChildren +
                '}';
    }
}

public class Main {
    public static void main(String[] args) {
        Member james = Member.of("James", 40, true, 3);
        System.out.println("james = " + james);
    }
}

10 문제

public class Main {

    public static void main(String[] args) {
        Order order = Order.of(20240731, "abc123", "2024년 7월 31일", "홍길순", "PD0345-12",
                "서울시 영등포구 여의도동 20번지");

        System.out.println("주문 번호 : " + order.orderId);
        System.out.println("주문자 아이디 = " + order.customerId);
        System.out.println("주문 날짜 = " + order.orderDate);
        System.out.println("주문자 이름 = " + order.customerName);
        System.out.println("주문 상품 번호 = " + order.productName);
        System.out.println("배송 주소 = " + order.address);

    }


    private static class Order {

        private final Integer orderId;
        private final String customerId;
        private final String orderDate;
        private final String customerName;
        private final String productName;
        private final String address;

        private Order(Integer orderId, String customerId, String orderDate, String customerName,
                String productName, String address) {
            this.orderId = orderId;
            this.customerId = customerId;
            this.orderDate = orderDate;
            this.customerName = customerName;
            this.productName = productName;
            this.address = address;
        }

        private static Order of(Integer orderId, String customerId, String orderDate,
                String customerName,
                String productName, String address) {
            return new Order(orderId, customerId, orderDate, customerName, productName, address);
        }

        @Override
        public String toString() {
            return "Order{" +
                    "orderId=" + orderId +
                    ", customerId=" + customerId +
                    ", orderDate=" + orderDate +
                    ", customerName='" + customerName + '\'' +
                    ", productName='" + productName + '\'' +
                    ", address='" + address + '\'' +
                    '}';
        }
    }
}

13장 되새김 문제

01 문제 지역 내부 클래스에서 외부 클래스 메서드의 지역 변수를 사용할 수 있지만, 그 값을 변경하면 오류가 발생합니다. 이때 사용하는 지역 변수는 final 변수가 되기 때문입니다.

02 문제 내부 클래스 중 클래스 이름 없이 인터페이스나  추상 클래스 자료형에 직접 대입하여 생성하는 클래스를 익명 클래스(이)라고 합니다.

03 문제 자바에서 제공하는 함수형 프로그래밍 방식으로 인터페이스의 메서드를 직접 구현하는 코드를 람다식(이)라고 합니다.

 

04 문제 람다식으로 구현할 수 있는 인터페이스는 메서드를 하나만 가져야 합니다. 이러한 인터페이스를 함수형 인터페이스(이)라고 합니다.

 

05 문제

public class Main{

    public static void main(String[] args) {
        Calc addCalc = (num1, num2) -> num1 + num2;

        int calc = addCalc.calc(10, 20);
        System.out.println(calc);
    }
}

06 문제 자바에서 자료 처리를 추상화하여 여러 자료형의 자료를 동일하게 처리할 수 있도록 제공하는 클래스를 스트림(이)라고 합니다. (근데, 문제만 보면 제네릭이 적용된 클래스도 해당되는데 논란의 여지가 있는 문제다. 스트림도 엄밀하게 최상위 클래스는 인터페이스인데..)

 

 

정리 안한 챕터들은 내가 원하는만큼 깊게 설명하지 않고 있다. 그래서 별도로 내가 조사해서 정리할 예정이다. 
이 책 출판의 목적 자체가 자바 프로그래밍 입문자를 대상으로 나온 책이기 때문에 목적에 적합하게 정말 설명은 잘 되어 있다. 해당 내용만 잘 알아도 나중에 더 깊게 자바를 학습한다면 분명히 큰 도움이 될 책이 분명하다.