티스토리 뷰

Java/Java Study 기록 일지

JSON 백엔드 자바 4회차

응애~ 개발자 2023. 2. 14. 00:36
728x90
반응형

연습 문제

아이유 프로필 출력하기

이름 : 아이유
나이 : 30
대학생인가요? : true
몸무게 : 40.5
  • 사람(Person)이라는 클래스를 활용해라. (한 파일에 모든 코드를 작성하지 말고, Person이라는 클래스 파일을 별도로 생성해서 사용해라.)
  • 클래스 내에서 static 메서드는 사용하지마라. (public static void main(String[] args)는 제외)

필요한 문법

  • 타입
  • 출력
  • 클래스
  • 객체지향
  • 생성자
  • this
  • 메소드

문제 풀이

 이번에 필요한 요구사항이다.

  1. 이름, 나이, 대학생 여부, 몸무게 구조체
  2. 출력하는 메소드

 2가지만 구현하면 된다. 구현 하기전에 클래스에 대한 개념을 알아야하는데 클래스에 대한 설명은 추후에 다시 하겠다.

이번 미션은 자바의 꽃인 class가 들어가고 c언어와 다르게 객체지향이라는 개념이 들어간다. 객체지향에 대해서 간단하게 설명한다면 모든 사물(객체)에서 그 객체 특징을 데이터와 함수로 구현한것이라고 보면된다.

 그 다음에 알아야 될 내용은 메소드이다. 메소드는 클래스안에 함수를 나타내는 말이다. 즉 메소드는 함수랑 같다고 보면된다. 그러면 객체 생성하고 그 객체는 행위를 메소드로 호출해서 함수를 실행 한다고 생각하면된다. 

이름, 나이, 대학생 여부, 몸무게 구조체

public class Person {

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

 일단 클레스를 만든후 위 요구사항에서 이름, 나이, 대학생 여부, 몸무게를 정의할 데이터 타입을 선언하면된다.

 Person(String name, int age, boolean isUniverseStudent, double weight) 이 구문은 생성자이고 클래스의 객체를 인스턴스화 할때 초기화를 시켜주는 메소드이다. 객체 생성하자마다 이 구문이 실행한다는 점만 기억하면된다. 그리고 객체를 생성할때는 

Person iu = new Person("아이유", 30, true, 40.5 ); 

이런식으로 선언하면된다. 선언시에 객체안에 생성자의 파라미터에 맞게 넣으면된다.

new는 객체를 새로 생성하겠다는 의미인데 new 연산을 할시에는 메모리중 heap영역에 새로 생성한 객체를 추가 하겠다는 의미이다. 자세한 설명은 추후에 다시 올리도록하겠다.

그리고 this라는 것을 볼수 있는데 this는 생성한 객체의 자기자신을 의미한다. 자세한 설명은 추후에 다시 올리겠다.

출력하는 메소드

public void printProfile() {
    System.out.printf("이름 : %s\n", this.name);
    System.out.printf("나이 : %d\n", this.age);
    System.out.printf("대학생인가요? : %b\n", this.isUniverseStudent);
    System.out.printf("몸무게 : %.1f\n", this.weight);
}

 void에대해서 약간 설명한다면 메소드 작성할때 (public/protected/private) (void/데이터 타입) 함수명(파라미터)이런식이다. void를 할시에는 반환값이 없지만 데이터타입이 들어갈때는 반환값 return이 필요하다. return에 대해서는 추후에 설명하겠다.

전체 코드

Person.java

public class Person {

	String name;
	int age;
	boolean isUniverseStudent;
	double weight;
	
	Person(String name, int age, boolean isUniverseStudent, double weight){
		this.name = name;
		this.age = age;
		this.isUniverseStudent = isUniverseStudent;
		this.weight = weight;
	}
	
	public void printProfile() {
		System.out.printf("이름 : %s\n", this.name);
		System.out.printf("나이 : %d\n", this.age);
		System.out.printf("대학생인가요? : %b\n", this.isUniverseStudent);
		System.out.printf("몸무게 : %.1f\n", this.weight);
	}
}

아이유 프로필 출력하기2

아래 4가지 방식의 코드가 정상적으로 작동하게 Person 클래스를 만들어라. (한 파일에 모든 코드를 작성하지 말고, Person이라는 클래스 파일을 별도로 생성해서 사용해라.)

public class Main {

  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();
  }
}
이름 : 아이유
나이 : 30
대학생인가요? : true
몸무게 : 40.5

이름 : 아이유
나이 : 30
대학생인가요? : true
몸무게 : 40.5

이름 : 아이유
나이 : 30
대학생인가요? : true
몸무게 : 40.5

이름 : 아이유
나이 : 30
대학생인가요? : true
몸무게 : 40.5

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

 

문제 풀이

 이번에 필요한 요구사항이다. 

 위 요구사항에 추가로 생성할때 나이와 몸무게가 문자열로 받을수 있었어 나이와 몸무게가 문자열 들어왔을때 처리하는 방법만 알면 된다.

 

 

일단 먼저 Person은 코드 보여준다음 설명하겠다.

public class Person {

	String name;
	int age;
	boolean isUniverseStudent;
	double weight;
	
	// 생성자 오버로딩
	Person(String name, int age, boolean isUniverseStudent, double weight){
		this.name = name;
		this.age = age;
		this.isUniverseStudent = isUniverseStudent;
		this.weight = weight;
	}
	
	Person(String name, int age, boolean isUniverseStudent, String weight){
		this.name = name;
		this.age = age;
		this.isUniverseStudent = isUniverseStudent;
		this.weight = Double.parseDouble(weight);
	}
	
	Person(String name, String age, boolean isUniverseStudent, double weight){
		this.name = name;
		this.age = Integer.parseInt(age);;
		this.isUniverseStudent = isUniverseStudent;
		this.weight = weight;
	}
	
	Person(String name, String age, boolean isUniverseStudent, String weight){
		this.name = name;
		this.age = Integer.parseInt(age);
		this.isUniverseStudent = isUniverseStudent;
		this.weight = Double.parseDouble(weight);
	}
	
	public void printProfile() {
		System.out.printf("이름 : %s\n", this.name);
		System.out.printf("나이 : %d\n", this.age);
		System.out.printf("대학생인가요? : %b\n", this.isUniverseStudent);
		System.out.printf("몸무게 : %.1f\n", this.weight);
	}
}

 여기에 보면 Person이 여러개 선언한것을 볼수있다. 이 구문을 오버로딩이라고 부른다. 오버로딩은 똑같은 이름 메서드나 생성자를 여러번 구현한대신 받는 파라미터만 다르게 선언한것이라고 보면된다. 오버로딩의 장점은 파라미터가 다르게 선언할때마다 다른 함수를 선언하면 함수명짓기가 불편할뿐만 아니라 다른 사람이 코드를 볼때도 불편할수 있다는 점을 해결해줄수 있다. 이번 문제는 오버로딩에 대한 개념만 추가한것이라고 보면 된다. 그 외는 위에 문제에서 설명 했다.

계산기 만들기

아래의 코드가 정상적으로 작동하게 Calculator 클래스를 만들어라.

public class Main {

  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") + "입니다.");
  }
}
이 계산기는 제이슨의 계산기입니다.
3+4는 7입니다.
6-2는 4입니다.
2*9는 18입니다.
9/4은 2.25입니다.
9/4은 2.25입니다.
  • 계산기(Calculator) 클래스를 만들어라. (한 파일에 모든 코드를 작성하지 말고, Calculator라는 클래스 파일을 별도로 생성해서 사용해라.)
  • 클래스 내에서 static 메서드는 사용하지마라. (public static void main(String[] args)는 제외)

문제 풀이

 이번에 필요한 요구사항이다. 

  1.  객체 구조체 이름
  2. 객체 메소드 +,-, *,/
  3. 이름 호출

이번에 알아야 될 분법은 return 이다. 위에서 메소드 구현할때 void 말고 데이터 타입이 있다. 데이터 타입 선언할때는 데이터 타입에 맞게 값을 반환 해줘야한다. 값을 반환할때 쓰는게 return이다.

객체 메소드 +,-, *,/

// 더라기
public int add(int a, int b) {
    return a + b;
}

//빼기
public int minus(int a, int b) {
    return a - b;
}

// 곱하기
public int multiply(int a, int b) {
    return a * b;
}

// 나누기
public int divide(int a, int b) {
    return a / b;
}

// 나누기
public int divide(String a, String b) {
    return Integer.parseInt(a) / Integer.parseInt(b);
}

이름 호출

// 이름 출력
public String getOwner() {
    return this.name;
}

전체 코드

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

	// 이름 출력
	public String getOwner() {
		return this.name;
	}
	
	// 더라기
	public int add(int a, int b) {
		return a + b;
	}
	
	//빼기
	public int minus(int a, int b) {
		return a - b;
	}
	
	// 곱하기
	public int multiply(int a, int b) {
		return a * b;
	}
	
	// 나누기
	public int divide(int a, int b) {
		return a / b;
	}
	
	// 나누기
	public int divide(String a, String b) {
		return Integer.parseInt(a) / Integer.parseInt(b);
	}
}

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

아래와 같이 출력해라.

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

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

이름 : 리사
국어 : 92
영어 : 88
  • 학생(Student)이라는 클래스를 활용해라. (한 파일에 모든 코드를 작성하지 말고, Student라는 클래스 파일을 별도로 생성해서 사용해라.)
  • List<Student> students 라는 변수를 만들어서 활용해라.
  • 여러 학생의 정보를 출력할 때 반복문을 사용해라.
  • 클래스 내에서 static 메서드는 사용하지마라. (public static void main(String[] args)는 제외)

문제 풀이

 이번에 필요한 요구사항이다. 

  1.  학생객체
  2. 학생객체 정보 출력하는 메소드
  3. 학생들 담을 리스트
  4. 반복문으로 각 학생 정보 출력하기

힉셍 겍체 만들기

public class Student {
	
	String name;
	int kor;
	int eng;
	
	Student(String name, int kr, int en){
		this.name = name;
		this.kor = kr;
		this.eng = en;
	}

}

학생객체 정보 출력하는 메소드

public void printStudent() {
    StringBuilder sb = new StringBuilder();
    sb.append("이름 : ").append(name).append("\n")
        .append("국어 : ").append(kor).append("\n")
        .append("영어 : ").append(eng).append("\n");
    System.out.println(sb);
}

 

학생들 담을 리스트 만들기기

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

반복문으로 각 학생 정보 출력하기

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

전체 코드

Student.java

public class Student {
	
	String name;
	int kor;
	int eng;
	
	Student(String name, int kr, int en){
		this.name = name;
		this.kor = kr;
		this.eng = en;
	}
	
	public void printStudent() {
		StringBuilder sb = new StringBuilder();
		sb.append("이름 : ").append(name).append("\n")
			.append("국어 : ").append(kor).append("\n")
			.append("영어 : ").append(eng).append("\n");
		System.out.println(sb);
	}

}

Main.java

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

public class Main {

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

	}

}

미션: 책 대여하기

아래와 같이 작동하도록 코드를 작성해라.

대여할 책의 번호를 입력하세요.
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개의 클래스마다 클래스 파일을 별도로 생성해서 사용해라.)
    • 힌트Main.javaBook.java
    • public class Book { private String name; private boolean isBorrowed; public Book(String name) { this.name = name; this.isBorrowed = false; } // 추가로 코드 작성하기! }
    • public class Main { public static void main(String[] args) { List<Book> books = new ArrayList<>(Arrays.asList( new Book("클린코드(Clean Code)"), new Book("객체지향의 사실과 오해"), new Book("테스트 주도 개발(TDD)") )); // 추가로 코드 작성하기! } }
    • 아래 코드와 꼭 동일하게 작성하지 않아도 됩니다:)
  • (심화 미션) Library(도서관)의 클래스도 만들어서 활용해라.

문제 풀이

 이번에 필요한 요구사항이다

  1. 책 클래스 만들기
  2. 도서관 클래스 만들기
  3. 도서관에 책을 추가하기
  4. 도서관에 있는 책 정보 출력하기
  5. 책 대여하기

책 클래스 만들기

public class Book {

	String subject;
	boolean isRent;
	
	Book(String text){
		this.subject = text;
		this.isRent = true;
	}
	
}

 책에 제목과 대여 가능한 여부관한 정보를 만든다.

도서관 클래스 만들기

public class Library {
	
	List<Book> books;
	
	Library() {
		books = new ArrayList<>();
	}
}

 책들을 저장하기 위해서 책에 관한 정보를 리스트를 만든다.

도서관에 책을 추가하기

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

도서관에 책들을 추가할 메소드를 만든다.

 

도서관에 있는 책 정보 출력하기

// Book.java
public String printBook() {
    return this.subject + " - " + (this.isRent? "대여 가능" : "대여 중");
}

// Library.java
public void printLibrary() {
    System.out.println("대여할 책의 번호를 입력하세요.");
    for(int i = 0; i < books.size(); i++) {
        System.out.println(i + 1 + ". " + books.get(i).printBook());
    }
}

책 클래스에서는 책에 관한 정보를 출력하는 메도스를 만들고 도서관 클래스에서는 각 첵을 출력할수있는 메소드를 만든다.

책 대여하기

public boolean rent(int index) {
    if(books.get(index - 1).isRent) {
        books.get(index - 1).isRent = false;
        System.out.println("정상적으로 대여가 완료되었습니다.");
        return true;
    }
    System.out.println("대여 중인 책은 대여할 수 없습니다.");
    return false;
}

 책을 대여하는 메소드이다. 만약 책이 있으면 대여하도록하고 아니면 대여 못하고 메서지를 출력하는 로직을 구현한다.

 

이렇게 책과 도서관에 필요하는 데이터 타입과 메소드를 구현하면된다. 나머지 실행하는 쪽은 지난 3회차에서 과제 한것이랑 비슷하기 때문에  따로 설명하지 않겠다. 만약 이해가 안되면 아래 사이트에서 보면서 공부하면된다.

https://jih3508.tistory.com/138

 

JSON 백엔드 자바 3주차

연습 문제 구구단 프로그램 [구구단] 몇 단을 출력하실건가요? 13 1단에서 9단까지만 출력이 가능합니다. [구구단] 몇 단을 출력하실건가요? 8 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 46 8 * 7

jih3508.tistory.com

전체코드

Book.java

public class Book {

	String subject;
	boolean isRent;
	
	Book(String text){
		this.subject = text;
		this.isRent = true;
	}
	
	public String printBook() {
		return this.subject + " - " + (this.isRent? "대여 가능" : "대여 중");
	}
}

Library.java

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

public class Library {
	
	List<Book> books;
	
	Library() {
		books = new ArrayList<>();
	}
	
	public void add(Book book) {
		books.add(book);
	}
	
	public boolean rent(int index) {
		if(books.get(index - 1).isRent) {
			books.get(index - 1).isRent = false;
			System.out.println("정상적으로 대여가 완료되었습니다.");
			return true;
		}
		System.out.println("대여 중인 책은 대여할 수 없습니다.");
		return false;
	}
	
	public void printLibrary() {
		System.out.println("대여할 책의 번호를 입력하세요.");
		for(int i = 0; i < books.size(); i++) {
			System.out.println(i + 1 + ". " + books.get(i).printBook());
		}
	}

}

Main.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		Library library = new Library();
		library.add(new Book("클린코드(Clean Code)"));
		library.add(new Book("객체지향의 사실과 오해"));
		library.add(new Book("테스트 주도 개발(TDD)"));
		int n;
		
		while(true) {
			library.printLibrary();
			n = Integer.parseInt(br.readLine());
			library.rent(n);	
		}
	}

}

마무리

 이번 회사 과제 전체 코드는 여기에서 보면 된다.

https://github.com/jih3508/Java_Study/tree/main/JSCODE_BACKEND_JAVA/JSCODE_JAVA/src/CH04

 

GitHub - jih3508/Java_Study

Contribute to jih3508/Java_Study development by creating an account on GitHub.

github.com

이번 회차는 지난 회차보다는 쉽다. 지난 회차와 비슷하게 요구사항을 전체를 보고 하니씩 요구사항 맞게 설계와 구현하는 방법 같다. 실무에서도 설계나 구현할때도 전체다 한번에 하지않고 요구사항 하나씩 분석해서 개발하기때문에 위 같은 방법으로 구현하는 습관을 기르도록하자.

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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 29 30 31
글 보관함