본문으로 바로가기
반응형

 

이전까지 자바의 기초부터 객체까지 다뤄보고, 

객체 실습 문제도 풀어봤습니다.

 

 

 

 

 

객체의 배열을 학습하기 전, 

 

다시 한 번 메소드를 활용한 자바 객체의 실습문제를 풀어보려고 합니다.

 

 

 

실제 업무에서도 사용자의 요구사항에 맞게

모델(변수)들을 작성하고, 행동(메소드)들을 작성하는 업무가 주를 이룹니다.

 

 

 

그에 기반을 둔 것이 지금 풀어보고자 하는 객체 생성 예제입니다.

 

 

 

 

 

 

그럼 객체 생성 예제를 풀어봅시다!

 

 

 

 

 

 

 

 


자바 객체(메소드) 생성 예제


 

 

 

 

난이도 ★

 

 

 

예제 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

 

[Java] 자바 객체 배열 (java로 웹개발하기)(day13)

이전 포스팅에서는 자바의 객체에 대해서 다뤄봤습니다. 객체, 생성자, 필드, 메서드, 객체 예제 등등 여러 가지를 알아보았는데요. 이번 포스팅에선 객체의 배열에 대해서 다뤄보고자 합니다.

healthdevelop.tistory.com

 

반응형