이전까지 자바의 기초부터 객체까지 다뤄보고,
객체 실습 문제도 풀어봤습니다.
객체의 배열을 학습하기 전,
다시 한 번 메소드를 활용한 자바 객체의 실습문제를 풀어보려고 합니다.
실제 업무에서도 사용자의 요구사항에 맞게
모델(변수)들을 작성하고, 행동(메소드)들을 작성하는 업무가 주를 이룹니다.
그에 기반을 둔 것이 지금 풀어보고자 하는 객체 생성 예제입니다.
그럼 객체 생성 예제를 풀어봅시다!
자바 객체(메소드) 생성 예제
난이도 ★★★★★
예제 1
Q : 아래 클래스에 있는 메소드와 메소드에 맞는 요구사항을 보고 객체와 메소드를 생성하여라.
● 과목 클래스
1. 아래와 같은 다양한 방식으로 과목 클래스의 인스턴스 생성 가능
Subject sub1 = new Subject();
Subject sub2 = new Subject("국어"); // 과목명을 전달하여 인스턴스 생성
Subject sub3 = new Subject("수학", 80); // 과목명과 점수를 전달하여 인스턴스 생성
2. 과목명을 별도의 Setter 이용하여 저장 가능
sub1.setName("영어");
3. 점수는 0 ~ 100 사이의 정수만 입력받아 저장할 수 있다.
범위를 벗어난 값의 입력이 있는 경우 -1 이 저장되도록 한다.
sub1.setJumsu(70); // 점수를 별도의 Setter 이용하여 저장 가능
4. 저장된 점수가 올바른 범위의 점수인지 확인하는 메서드이다.
올바른 점수인 경우 true, 올바르지 않은 경우 false 를 반환한다.
if(sub1.isValid()) {
System.out.println("점수가 유효합니다.");
} else {
System.out.println("점수가 유효하지 않습니다.");
}
5. 저장된 점수를 기반으로 등급 반환, 등급은 A ~ D 그리고 F
// A 등급은 100 ~ 90 이상
// B 등급은 90 미만 ~ 80 이상
// C 등급은 80 미만 ~ 70 이상
// D 등급은 70 미만 ~ 60 이상
// F 등급은 60 미만
System.out.println(sub1.getGrade());
6. 점수의 입력 범위를 한정하기 위한 메서드이다. 기본값으로 0 ~ 100 의 범위가 설정되어 있지만
아래의 메서드를 통해 입력 범위를 제한할 수 있다.
이미 점수가 입력되어 있는 상태에서 범위가 변경되면 기존 점수도 범위에 맞추어 재설정되어야 한다.
sub1.setRangeJumsu(0, 10); // 점수의 입력 범위를 0 ~ 10으로 한정한다.
7. 점수의 입력 범위를 확인할 수 있게 만들어 주는 메서드이다.
int[] rg = sub1.getRangeJumsu();
8. 점수의 범위가 변경이 되면 등급 또한 변경된 범위에 맞추어 계산이 이루어져야 한다.
System.out.println(sub1.getGrade());
9. 동일한 과목인지 비교하는 메서드이다.
if(sub1.equalSubject(sub2)) {
System.out.println("동일한 과목 입니다.");
} else {
System.out.println("동일한 과목이 아닙니다.");
}
10. 점수를 비교하는 메서드이다.
이 메서드는 gt, lt, ge, le, eq, nq 의 추가 메서드도 만들어서 동작하게 한다.
// gt : 큰 값인지 비교하기 위해 사용
// ge : 크거나 같은 값인지 비교하기 위해 사용
// lt : 작은 값인지 비교하기 위해 사용
// le : 작거나 같은 값인지 비교하기 위해 사용
// eq : 같은 값인지 비교하기 위해 사용
// nq : 다른 값인지 비교하기 위해 사용
if(sub1.gt(sub2)) {
System.out.println(sub1.getName() + "의 점수가 더 높습니다.");
}
package exam10;
class Subject {
private int jumsu;
private String name;
private int min=0;
private int max=100;
public Subject() {
}
public Subject(String name) {
this.name = name;
}
public Subject(String name, int jumsu) {
this.name = name;
this.jumsu = jumsu;
}
public int getJumsu() {
return jumsu;
}
public void setJumsu(int jumsu) {
if(this.jumsu < this.min | this.jumsu > this.max) {
System.out.println("-1");
}else {
this.jumsu = jumsu;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isValid() {
if(this.jumsu >= 0 && this.jumsu <= 100) {
return true;
}else {
return false;
}
}
public char getGrade() {
if(this.jumsu >= max-(max/10) && this.jumsu <= max) {
return 'A';
}else if(this.jumsu >= max-(2*max/10) && this.jumsu <= max-(max/10)) {
return 'B';
}else if(this.jumsu >= max-(3*max/10) && this.jumsu <=max-(2*max/10)) {
return 'C';
}else if(this.jumsu >= max-(4*max/10) && this.jumsu <=max-(3*max/10)) {
return 'D';
}else {
return 'F';
}
}
public void setRangeJumsu(int i, int j) {
this.min = i; this.max = j;
double dJumsu;
dJumsu = (double)this.jumsu * ((double)j/100);
this.jumsu = (int) dJumsu;
}
public int[] getRangeJumsu() {
int arr[] = new int[this.max-this.min];
int count = this.min;
for(int i=0; i<arr.length; i++) {
arr[i] = count++;
}
return arr;
}
public boolean equalSubject(Subject sub2) {
if(this.name.equals(sub2.name)) {
return true;
}else {
return false;
}
}
public boolean gt(Subject sub2) {
if(this.jumsu > sub2.jumsu) {
return true;
}else {
return false;
}
}
public boolean ge(Subject sub2) {
if(this.jumsu >= sub2.jumsu) {
return true;
}else {
return false;
}
}
public boolean lt(Subject sub2) {
if(this.jumsu < sub2.jumsu) {
return true;
}else {
return false;
}
}
public boolean le(Subject sub2) {
if(this.jumsu <= sub2.jumsu) {
return true;
}else {
return false;
}
}
public boolean eq(Subject sub2) {
if(this.jumsu == sub2.jumsu) {
return true;
}else {
return false;
}
}
public boolean nq(Subject sub2) {
if(this.jumsu != sub2.jumsu) {
return true;
}else {
return false;
}
}
}
public class Sample6 {
public static void main(String[] args) {
Subject sub1 = new Subject();
Subject sub2 = new Subject("국어"); // 과목명을 전달하여 인스턴스 생성
Subject sub3 = new Subject("수학", 80); // 과목명과 점수를 전달하여 인스턴스 생성
sub1.setName("영어"); // 과목명을 별도의 Setter 이용하여 저장 가능
sub1.setJumsu(70); // 점수를 별도의 Setter 이용하여 저장 가능
if(sub1.isValid()) {
System.out.println("점수가 유효합니다.");
} else {
System.out.println("점수가 유효하지 않습니다.");
}
System.out.println(sub1.getGrade());
sub1.setRangeJumsu(0, 10);
int[] rg = sub1.getRangeJumsu();
System.out.println(sub1.getGrade());
if(sub1.equalSubject(sub2)) {
System.out.println("동일한 과목 입니다.");
} else {
System.out.println("동일한 과목이 아닙니다.");
}
if(sub1.gt(sub2)) {
System.out.println(sub1.getName() + "의 점수가 더 높습니다.");
}
}
}
난이도 ★★★★★☆
예제 2
Q : 다음 요구사항에 맞는 메소드와 객체를 생성하여라.
● 직원 클래스
- 직원 정보를 가지고 있는 Employee 클래스가 있다.
이 클래스를 사용하여 직원들의 사번, 이름, 부서, 직급, 나이, 성별, 연봉, 연락처, 주소 등의
정보를 관리할 것이다.
Employee e = new Employee();
1. 직원 정보 관리를 위한 객체를 생성할 때 반드시 사번, 이름, 부서, 직급의 정보가 있어야 한다.
2. 생성된 직원의 연봉을 설정할 수 있다.
3. 급여는 연봉에서 12개월을 나눈 값으로 지급하나 매달 세금으로 급여의 8% 를 빼고 수령받게
될 것이다. 따라서 급여 정보를 반환하는 메서드는 위의 사항을 고려하여 값이 반환될 수 있게
해야 한다.
4. 회사 내규에 따라 연봉 협상은 현재 연봉의 2.5% 까지만 최대로 올릴 수 있다. 이는 모든 직원들이
동일하다. 단, 전년도 실적에 따라 더 높이거나 낮출 수는 있다.
package exam10;
import java.util.Scanner;
class Employee {
private int coNum;
private String name;
private String dept;
private String rank;
private int age;
private char gender;
private int salary;
private int pNum;
private String addr;
private boolean lastYear;
static Scanner sc = new Scanner(System.in);
public Employee() {
}
public Employee(int coNum, String name, String dept, String rank) {
this.coNum = coNum; this.name = name;
this.dept = dept; this.rank = rank;
}
public void setLastYear(boolean lastYear) {
this.lastYear = lastYear;
}
public int getMonth() {
int mSalary = this.salary / 12 ;
mSalary -= (mSalary * (8/100));
return mSalary;
}
public String getName() {
return this.name;
}
public int getSalry() {
return this.salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public void negoSalary() {
double nego;
System.out.print("전년도 성과가 좋으면 true, 아니면 false 입력 : ");
this.setLastYear(sc.nextBoolean()); sc.nextLine();
if(this.lastYear) {
while(true) {
System.out.print("협상 후 올릴 퍼센트 : ");
nego = sc.nextDouble(); sc.nextLine();
if(nego > 2.5) {
System.out.println("2.5% 초과해서 올릴 수 없습니다.");
continue;
}else {
this.salary += (double)this.salary * (nego/100);
System.out.println("연봉은 : " + this.salary);
break;
}
}
}else {
System.out.print("협상 후 올리거나 내릴 퍼센트 : ");
nego = sc.nextDouble(); sc.nextLine();
if(nego>0.0) {
this.salary += (double)this.salary * (nego/100);
System.out.println("연봉은 : " + this.salary);
}else {
nego *= -1;
this.salary -= (double)this.salary * (nego/100);
System.out.println("연봉은 : " + this.salary);
}
}
}
}
public class Sample7 {
public static void main(String[] args) {
/*
* 직원 정보를 가지고 있는 Employee 클래스가 있다.
* 이 클래스를 사용하여 직원들의 사번, 이름, 부서, 직급, 나이, 성별, 연봉, 연락처, 주소등의
* 정보를 관리할 것이다.
*/
Employee e = new Employee();
/*
* 직원 정보 관리를 위한 객체를 생성할 때 반드시 사번, 이름, 부서, 직급의 정보가 있어야 한다.
*/
Employee e1 = new Employee(12341232, "홍길동", "풀스택", "전무");
e1.setSalary(6000);
System.out.println(e1.getName() + "님의 연봉은 " + e1.getSalry()+ "만원 입니다.");
/*
* 급여는 연봉에서 12개월을 나눈 값으로 지급하나 매달 세금으로 급여의 8% 를 빼고 수령받게
* 될것이다. 따라서 급여 정보를 반환하는 메서드는 위의 사항을 고려하여 값이 반환될 수 있게
* 해야 한다.
*/
System.out.println(e1.getName() + "님의 월급은 " + e1.getMonth() + "만원 입니다.");
/*
* 회사 내규에 따라 연봉 협상은 현재 연봉의 2.5% 까지만 최대로 올릴 수 있다. 이는 모든 직원들이
* 동일하다. 단, 전년도 실적에 따라 더 높이거나 낮출 수는 있다.
*/
e1.negoSalary();
}
}
지금까지 자바의 기초과정들을 학습해왔습니다.
이전까지는 코드만 잘 작성하면 됐었는데, 객체 부분을 학습하고 나서부턴
어떤 모델(변수)을 생성할지, 어떤 동작(메서드)을 생성할지
고민을 하고 작성하기에
많은 실습 문제가 필요합니다.
실제 웹 개발 업무도 요구사항에 맞는 모델과 화면(뷰)을 개발하는 것이 업무이니만큼,
이번 객체 부분이 중요하다고 생각합니다.
이상 java의 객체 실습 문제를 마치겠습니다.
다음 포스팅에선 java 객체 배열에 대해 다뤄보고자 합니다.
https://healthdevelop.tistory.com/entry/java13