본문 바로가기

Java

JSCODE 4회차

클래스란?

- 클래스는 실생활에서 사용되는 개념을 코드로 표현하기 위한 수단

- 클래스는 속성과 행위를 가짐

 

연습 문제

 

- 아이유 프로필 출력하기

package jscode4;

public class Person {
    private final String name;
    private final int age;
    private final boolean isCollegeStudent;
    private final double weight;

    public Person(String name, int age, boolean isCollegeStudent, double weight) {
        this.name = name;
        this.age = age;
        this.isCollegeStudent = isCollegeStudent;
        this.weight = weight;
    }

    public void printProfile() {
        System.out.println("이름 : " + this.name);
        System.out.println("나이 : " + this.age);
        System.out.println("대학생인가요? : " + this.isCollegeStudent);
        System.out.println("몸무게 : " + this.weight);
        System.out.println();
    }
}

- 이름, 나이, 대학생인지, 몸무게의 속성을 가지고 프로필을 출력하는 행위를 가진 Person 클래스를 생성

 public static void main(String[] args) {
        Person person = new Person("아이유", 30, true, 40.5);
        person.printProfile();
    }

- 결과

 

- 아이유 프로필 출력하기2

요구 사항 : 아래 코드가 출력되도록 프로그래밍

public static void main(String[] args) {
        // 1.
        Person iu1 = new Person("아이유", 30, true, 40.5);
        iu1.printProfile();

        // 2. 
        Person iu2 = new Person("아이유", "30", true, "40.5");
        iu2.printProfile();

        // 3. 
        Person iu3 = new Person("아이유", 30, true, "40.5");
        iu3.printProfile();

        // 4. 
        Person iu4 = new Person("아이유", "30", true, 40.5);
        iu4.printProfile();
    }

- 코드

package jscode4;

public class Person {
    private final String name;
    private final int age;
    private final boolean isCollegeStudent;
    private final double weight;

    public Person(String name, int age, boolean isCollegeStudent, double weight) {
        this.name = name;
        this.age = age;
        this.isCollegeStudent = isCollegeStudent;
        this.weight = weight;
    }

    public Person(String name, String age, boolean isCollegeStudent, String weight) {
        this.name = name;
        this.age = Integer.parseInt(age);
        this.isCollegeStudent = isCollegeStudent;
        this.weight = Double.parseDouble(weight);
    }

    public Person(String name, String age, boolean isCollegeStudent, double weight) {
        this.name = name;
        this.age = Integer.parseInt(age);
        this.isCollegeStudent = isCollegeStudent;
        this.weight = weight;
    }

    public Person(String name, int age, boolean isCollegeStudent, String weight) {
        this.name = name;
        this.age = age;
        this.isCollegeStudent = isCollegeStudent;
        this.weight = Double.parseDouble(weight);
    }

    public void printProfile() {
        System.out.println("이름 : " + this.name);
        System.out.println("나이 : " + this.age);
        System.out.println("대학생인가요? : " + this.isCollegeStudent);
        System.out.println("몸무게 : " + this.weight);
        System.out.println();
    }
}

- 첫번째 연습 문제와 동일하지만 나이와 몸무게가 String 타입이여도 올바른 프로필을 출력하도록 생성자 오버로딩을 해야한다.

 

- 결과

- 계산기 만들기

요구사항 : 아래 코드가 정상적으로 작동하도록 프로그래밍

public static void main(String[] args) {
        Calculator calculator = new Calculator("제이슨");
        System.out.println("이 계산기는 " + calculator.getOwner() + "의 계산기입니다.");
        System.out.println("3+4는 " + calculator.add(3, 4) + "입니다.");
        System.out.println("6-2는 " + calculator.minus(6, 2) + "입니다.");
        System.out.println("2*9는 " + calculator.multiply(2, 9) + "입니다.");
        System.out.println("9/4은 " + calculator.divide(9, 4) + "입니다.");
        System.out.println("9/4은 " + calculator.divide("9", "4") + "입니다.");
    }

- 코드

package jscode4;

public class Calculator {
    private final String owner;

    public Calculator(String owner) {
        this.owner = owner;
    }

    public String getOwner() {
        return this.owner;
    }

    public int add(int value1, int value2) {
        return value1 + value2;
    }

    public int minus(int value1, int value2) {
        return value1 - value2;
    }

    public int multiply(int value1, int value2) {
        return value1 * value2;
    }

    public double divide(double value1, double value2) {
        return value1 / value2;
    }

    public double divide(String value1, String value2) {
        return Double.parseDouble(value1) / Double.parseDouble(value2);
    }
}

- 계산기 주인의 이름을 속성으로 가지고 덧셈, 뺄셈, 나눗셈, 곱셈의 연산을 행위로 하는 Calculator 클래스를 정의

- 나눗셈의 파라미터로 String 타입의 데이터를 받을 수 있으므로 메서드 오버로딩

 

- 결과

 

- 학생들의 국어, 영어 점수 출력하기

요구사항 : 아래와 같이 출력

이름 : 제이슨
국어 : 87
영어 : 92

이름 : 레이첼
국어 : 82
영어 : 92

이름 : 리사
국어 : 92
영어 : 88

- 코드

package jscode4;

public class Student {
    private final String name;
    private final int koreanScore, englishScore;

    public Student(String name, int koreanScore, int englishScore) {
        this.name = name;
        this.koreanScore = koreanScore;
        this.englishScore = englishScore;
    }

    public void printInfo() {
        System.out.println("이름 : " + this.name);
        System.out.println("국어 : " + this.koreanScore);
        System.out.println("영어 : " + this.englishScore);
        System.out.println();
    }
}

- 학생 이름, 국어 성적, 영어 성적을 속성으로 하고 이를 출력하는 행위를 가진 Student 클래스 선언

 

- 결과

 public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        Student jason = new Student("제이슨", 87, 92);
        Student rachel = new Student("레이첼", 82, 92);
        Student lisa = new Student("리사", 92, 88);
        students.add(jason);
        students.add(rachel);
        students.add(lisa);

        for (Student student : students) {
            student.printInfo();
        }
    }

 

- 4회차 미션

요구사항 :

- 아래와 같이 작동하도록 프로그래밍

- 클래스 내에서 static 메서드는 사용하지마라. (public static void main(String[] args)는 제외)

- Main(프로그램을 실행하는 코드가 존재하는 클래스), Book(책), Library(도서관)의 클래스를 만들어서 활용해라. (한 파일에 모든 코드를 작성하지 말고, 1개의 클래스마다 클래스 파일을 별도로 생성해서 사용해라.)

대여할 책의 번호를 입력하세요.
1. 클린코드(Clean Code) - 대여 가능
2. 객체지향의 사실과 오해 - 대여 가능
3. 테스트 주도 개발(TDD) - 대여 가능
1
정상적으로 대여가 완료되었습니다.
대여할 책의 번호를 입력하세요.
1. 클린코드(Clean Code) - 대여 중
2. 객체지향의 사실과 오해 - 대여 가능
3. 테스트 주도 개발(TDD) - 대여 가능
1
대여 중인 책은 대여할 수 없습니다.
대여할 책의 번호를 입력하세요.
1. 클린코드(Clean Code) - 대여 중
2. 객체지향의 사실과 오해 - 대여 가능
3. 테스트 주도 개발(TDD) - 대여 가능
2
정상적으로 대여가 완료되었습니다.
대여할 책의 번호를 입력하세요.
1. 클린코드(Clean Code) - 대여 중
2. 객체지향의 사실과 오해 - 대여 중
3. 테스트 주도 개발(TDD) - 대여 가능

 

Book Class

package jscode4;

public class Book {
    private final String name;
    private boolean enableRental;

    public Book(String name, boolean enableRental) {
        this.name = name;
        this.enableRental = enableRental;
    }

    public void printInfo(int number) {
        String rentStatus = this.enableRental ? "대여 가능" : "대여 중";
        System.out.println(number + ". " + name + "-" + rentStatus);
    }

    public boolean getEnableRental() {return this.enableRental;}

    public void setEnableRental(boolean value) {this.enableRental = value;}
}

- 책 이름, 대여 가능 여부를 속성으로 가지고 정보를 출력하고 대여 가능 여부를 가져오고 값을 변경하는 행위를 가지는 Book 클래스 선언

 

Library Class 

package jscode4;

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

public class Library {
    private final List<Book> books;

    public Library() {
        this.books = new ArrayList<>();
    }

    public void addBook(Book book) {
        this.books.add(book);
    }

    public void rent() {
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("대여할 책의 번호를 입력하세요.");
            for (int i = 0; i < this.books.size(); i++) {
                this.books.get(i).printInfo(i + 1);
            }

            int number = scanner.nextInt();
            if (number > 0 && number <= this.books.size()) {
                if (this.books.get(number - 1).getEnableRental()) {
                    this.books.get(number - 1).setEnableRental(false);
                    System.out.println("정상적으로 대여가 완료되었습니다.");
                }
                else {
                    System.out.println("대여 중인 책은 대여할 수 없습니다.");
                }
            }
        }
    }
}

- Book 타입 데이터를 담는 리스트를 속성으로 가지고, Book 추가, 대여 행위를 수행할 수 있는 Library 클래스를 선언

- 리스트 인덱스를 이용하여 번호를 부여하고 입력받는 번호를 통해 알 수 있는 인덱스에 해당하는 책의 데이터를 가져온다.

- 대여 여부를 가져와서 대여가 가능한 책이면 상태를 대여 불가로 바꿔준다.

 

- 결과

import jscode4.*;

public class Main {
    public static void main(String[] args) {
        Library library = new Library();
        Book book1 = new Book("클린코드(Clean Code)", true);
        Book book2 = new Book("객체지향의 사실과 오해", true);
        Book book3 = new Book("테스트 주도 개발(TDD)", true);
        library.addBook(book1);
        library.addBook(book2);
        library.addBook(book3);

        library.rent();
    }
}

 

github : https://github.com/ParkYongSu/JSCODE/tree/master/src

 

이번 회차는 클래스에 대해서 공부했다.

이전 회차에서 배웠던 내용들을 계속 사용해서 문제를 해결하기 때문에 계속 상기할 수 있어서 좋은 것 같고, github에 레포지토리를 만들고 직접 올리는 과정까지 수행하니 회차마다 매우 알찬 것 같다.

 

'Java' 카테고리의 다른 글

JSCODE 6회차  (1) 2023.02.20
JSCODE 5회차  (1) 2023.02.16
JSCODE 3회차  (1) 2023.02.09
JSCODE 2회차  (1) 2023.02.06
JSCODE 1회차  (1) 2023.01.30