[JAVA 백엔드 스터디] 4회차

minhyeok·2023년 2월 12일
0
post-thumbnail

학습내용

  • 클래스
  • 다중생성자
  • 메서드 오버로딩
  • 깃 / 깃허브 사용법

클래스에 관한 내용이었다. 클래스가 정말 중요한 개념이라, 연습문제와 과제에 신경을 많이 썼다.
개념을 정확히 알고 있어야 하는 부분이라 생각된다.
클래스 파일 분할법
package
다른 클래스 간의 메서드나 멤버 변수 이용
클래스에서의 ArrayList

예제 풀이

Ex1) 아이유 프로필 출력하기

class Person {

    String name;
    int age;
    boolean student;
    double weight;

    Person(String name, int age, boolean student, double weight) {
        this.name = name;
        this.age = age;
        if (student) {
            this.student = true;
        } else {
            this.student = false;
        }
        this.weight = weight;
    }

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

public class ex1 {

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

클래스를 이용해 구현해보았다. main 함수에서는 인자만 넘겨주고, 함수만 호출하였다.

Ex2) 아이유 프로필 출력하기 2

class Person {

    String name;
    int age;
    boolean student;
    double weight;

    Person(String name, int age, boolean student, double weight) {
        this.name = name;
        this.age = age;
        if (student) {
            this.student = true;
        } else {
            this.student = false;
        }
        this.weight = weight;
    }

    Person(String name, String age, boolean student, String weight) {
        this.name = name;
        this.age = Integer.parseInt(age);
        if (student) {
            this.student = true;
        } else {
            this.student = false;
        }
        this.weight = Double.parseDouble(weight);
    }

    Person(String name, int age, boolean student, String weight) {
        this.name = name;
        this.age = age;
        if (student) {
            this.student = true;
        } else {
            this.student = false;
        }
        this.weight = Double.parseDouble(weight);
    }

    Person(String name, String age, boolean student, double weight) {
        this.name = name;
        this.age = Integer.parseInt(age);
        if (student) {
            this.student = true;
        } else {
            this.student = false;
        }
        this.weight = weight;
    }

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

public class ex2 {

    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();
    }
}

다중 생성자를 이용하여 인자가 다를 때, 함수를 이용하는 법을 예제를 통해 공부하였다. 나이와 몸무게를 String 으로 받고, int 형이나 double 형으로 형전환을 통해 출력하도록 하였다.

Ex3) 계산기 만들기

class Calculator {

    String name;

    Calculator(String name) {
        this.name = name;
    }

    String getOwner() {
        return this.name;
    }

    int add(int a, int b) {
        return a + b;
    }

    int minus(int a, int b) {
        return a - b;
    }

    int multiply(int a, int b) {
        return a * b;
    }

    double divide(double a, double b) {
        return a / b;
    }

    double divide(String a, String b) {
        return Double.parseDouble(a) / Double.parseDouble(b);
    }
}

public class CalculatorTest {

    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") + "입니다.");
    }
}

함수를 만들어, 인자를 받을 때 해당하는 계산 값을 출력하도록 하였다.

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

import java.util.*;

class Student {

    String name = "";
    int KoreanScore = 0;
    int EnglishScore = 0;

    Student(String name, int Korean, int English) {
        this.name = name;
        this.KoreanScore = Korean;
        this.EnglishScore = English;
    }

    String getName() {
        return this.name;
    }

    int getKoreanScore() {
        return this.KoreanScore;
    }

    int getEnglishScore() {
        return this.EnglishScore;
    }
}

public class ScoreList {

    public static void main(String[] args) {

        List<Student> students = new ArrayList<Student>();

        students.add(new Student("제이슨", 87, 92));
        students.add(new Student("레이첼", 82, 92));
        students.add(new Student("리사", 92, 88));

        for (int i = 0; i < students.size(); i++) {
            System.out.println("이름 : " + students.get(i).getName());
            System.out.println("국어 : " + students.get(i).getKoreanScore());
            System.out.println("영어 : " + students.get(i).getEnglishScore());
        }
    }
}

클래스에서의 ArrayList 사용법을 알게되는 예제였다. students 리스트에서 add 메서드를 활용해 학생의 정보를 담고 있는 인자를 넘겨주어, Student 클래스에서 이를 저장하고 함수를 통해 원하는 값을 return 하도록 구성하였다.

4회차 미션

책 대여 시스템

대여할 책의 번호를 입력하세요.
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) - 대여 가능
  • 클래스 내에서 static 메서드는 사용하지마라.
    (public static void main(String[] args)는 제외)
  • Main(프로그램을 실행하는 코드가 존재하는 클래스), Book(책)의 클래스를 만들어서 활용해라.
    (한 파일에 모든 코드를 작성하지 말고, 1개의 클래스마다 클래스 파일을 별도로 생성해서 사용해라.)
  • (심화 미션) Library(도서관)의 클래스도 만들어서 활용해라.
  • 조건 확인
    Main,Book,Library 클래스 세개 활용
    각각의 책 이름 / 번호 / 대여상태
  • 풀이 과정

힌트를 활용해 문제를 해결하였다. 맨 처음, Book 클래스와 Main 클래스 두개만을 이용하여 구현하는 방법은 쉽게 해결하였지만, Library 클래스를 이용하여 구현하는 방법은 고민이 많이 되었다.
먼저 Library 클래스에 어떤 기능을 넣어야 할지가 고민이었다.

Library 클래스에서는 생성자로 Book 클래스 ArrayList를 인자로 받고, 그 책의 내용을 저장하기로 하였다.
그 뒤, 책 번호 출력 / 책 이름 출력 / 책 대여 상태 출력 / 책 대여 작동 함수 총 4개의 함수를 구현하는 방식으로 코드를 작성하였다. 다른 것은 금방 구현하였지만, 책 번호 출력이 문제였다.
맨 처음에는 books arraylist 의 index 값을 받아와 그것에 + 1 하는 결과를 출력하려고 하였지만, 그 방법으로는 구현이 힘들다고 생각되었다.
인덱스 값이 -1 이 뜨다가, 결국에는 0 까지 출력하는 것(모든 책의 번호가 0으로 출력됨)은 성공했지만 이 방법으로는 0밖에 출력이 되지 않는다고 생각(Book 클래스 자체에서의 인덱스 값은 0 밖에 없다?)되어 방법을 바꾸고자 하였다. (이 부분에서는 멘토님의 도움을 많이 받았다)

따라서 그냥 main 클래스에서 번호를 그냥 출력할지 , 다른 방법이 또 없을지 고민하다가, 멘토님의 도움에서 힌트를 얻었다. 인덱스 값이 아닌, 책의 이름을 변수에 가져와 변수가 해당하는 책의 이름과 같다면 각각의 이름에 해당하는 책의 번호를 출력하는 방식으로 구현하였다. 이렇게 Library 에서 4가지 함수를 모두 구현하였다.

Book 클래스에서는 변수로 이름 과 대여상태 변수만 선언하였다.
함수에서는 책을 대여하기 위한 시스템 함수 / 대여 상태 확인 함수 / 책 이름 확인 총 3개의 함수를 구현하였다. isBorrowed 변수를 이용해 쉽게 구현할 수 있었다. 자세한 내용은 주석에서 확인 가능하다.

Main 클래스에서는 Library 클래스의 ArrayList를 사용하여 책을 생성하였다.
그리고 for 문을 통해 반복하면서 책 번호/책이름/대여상태 등을 출력하도록 하고, 숫자를 입력받아 해당 번호에 해당하는 책의 대여 시스템 함수를 작동하도록 하였다.

멘토님의 참고링크 1 : equals 메서드

멘토님의 참고링크 2 : equals 와 비교연산자 차이

코드는 클래스를 분리해 코드를 작성하여, 깃허브에 올려놓았다. 이번 미션을 통해 깃/ 깃허브를 사용하는 방법을 알게 되어 꾸준히 커밋을 하며 깃허브를 작성할 생각이다.
깃허브 링크

4회차 심화 미션

클래스에 static 메서드를 사용하면, 인스턴스를 생성하지 않고도 메서드를 쉽게 사용할 수 있습니다. 그런데도 불구하고 static 메서드 사용을 지양하는 이유가 있을까요?

  • 아래 링크를 참고해보자.
    왜 자바에서 static의 사용을 지양해야 하는가?
  • 참고) static 메서드를 지양해야 하는 이유를 말할 때, 메모리 낭비를 가끔 언급하기도 한다. 하지만 실제로 static 메서드를 사용했다고 해서 서버에 치명적인 영향을 줄 정도로 메모리 낭비를 일으키는 경우는 거의 없다. 그러니 static 메서드를 지양해야 하는 이유를 메모리 낭비 때문이라고 얘기하는 건 근거가 빈약하다.

Call By Value와 Call By Reference에 대해 설명해주세요.

  • 힌트
    • Call By Value와 Call By Reference의 차이점에 대해 한 줄로 요약해서 설명할 수 있어야 한다.
    • 자세히 풀어서도 설명할 수 있어야 한다.

정리

  • 배운 내용, 깨달은 점
    회차가 진행 될수록, 미션에 쓰이는 시간이 길어지고 있다. 이번 회차는 클래스에 관해 배웠는데, 클래스는 중요한 개념이라는 것을 알고 있기에 미션을 완벽히 구현하고자 하는 욕심에 시간이 좀 걸리게 되었다. 아직 클래스에 개념이 부족하다는 것을 깨달았고, 클래스의 메서드 / ArrayList를 활용한 클래스 사용법을 알게 되었다. 이 부분은 중요하다고 생각되어 관련하여 더 공부할 생각이다.

  • 어려웠던 점, 반성하고 싶은 점 / 개선할 방법
    클래스 간의 메서드나 변수 활용법이 조금 부족하다고 생각이 된다.
    코드에서 책의 번호를 출력할 때 index 값을 이용해 출력하고 싶었지만, 내 생각으로는 그것은 불가능하다고 생각되어 다른 방법으로 구현하였는데, 이 방법으로도 가능한지 예제 코드와 비교해 보아야겠다.
    ArrayList 를 사용할 때에도 반복되는 부분은 삭제를 해도 된다는 것을 멘토님을 통해 알게 되었다.
    구글링에서 ArrayList를 사용하는 방법을 알게되어(책에는 내용이 조금 부족하였다) 그런 식으로 사용하였는데, 멘토님이 짚어주시고 나니 아직 부족하구나 라는 것을 많이 깨닫게 되었다.

  • 궁금한 점

  1. 깃허브에 main 과 sub 브랜치 총 두개가 있습니다. 인텔리제이 터미널에서 sub 브랜치는 삭제하였지만 깃허브에서의 sub 브랜치가 삭제되지 않는데 이것은 어떻게 해결해야 할까요?
  2. 제가 구현하고자 했던 방향대로 책의 index 값을 가져와 +1 으로 책의 번호를 출력하는 방식이 가능한 방법일까요? 인덱스 값을 0으로 출력까지는 해보았지만, 그 다음으로는 진행이 불가능해 equals 메서드를 통해 네용을 비교하는 방식으로 진행하였습니다!

1개의 댓글

comment-user-thumbnail
2023년 2월 16일

안녕하세요 민혁님! 미션 수행 잘 해주셨습니다ㅎㅎㅎ 고민하시다가 궁금한 게 생길 때 질문 주시는 습관 굉장히 좋습니다👍 앞으로도 항상 그렇게 질문하시는 습관 꼭 가져가세요~! 성장하시는 데 아주 큰 발판이 될거에요:)

궁금한 점에 대해서 답변 드리도록 할게요!
Q. 깃허브에 main 과 sub 브랜치 총 두개가 있습니다. 인텔리제이 터미널에서 sub 브랜치는 삭제하였지만 깃허브에서의 sub 브랜치가 삭제되지 않는데 이것은 어떻게 해결해야 할까요?
A. 이 링크(https://wakestand.tistory.com/667) 참고해보시면 좋을 것 같아요!!

Q. 제가 구현하고자 했던 방향대로 책의 index 값을 가져와 +1 으로 책의 번호를 출력하는 방식이 가능한 방법일까요? 인덱스 값을 0으로 출력까지는 해보았지만, 그 다음으로는 진행이 불가능해 equals 메서드를 통해 네용을 비교하는 방식으로 진행하였습니다!
A. index 값을 가져왔다면, +1으로 책의 번호를 출력하기 위해서 System.out.println((index + 1))과 같이 'index + 1'이라는 코드를 작성해주시면 인덱스 번호가 아닌 책의 번호를 출력하실 수 있습니다! 이 부분 이해 안되시거나, 혹시 또 다른 부분 궁금하시면 질문 주세요~~

답글 달기