Java Programming (8-1)

Beautify.log·2021년 12월 15일
0

Java 튜토리얼

목록 보기
10/14
post-thumbnail

자 그러면 Java Programming (8)까지의 내용을 바탕으로 문제를 해결해보겠습니다.

문제 1

  1. ClassTest_1을 상속받아 ClassTest_2 클래스를 정의한다.
  2. 하위클래스에 String department 변수를 선언한다.
  3. 하위클래스를 객체생성시 인수 값 3개를 넘겨준다
    (이름, 연봉, 부서)
  4. 다음과 같이 출력되도록 상위클래스 getInformation() 메소드를 오버라이딩 한다.
    이름:이지나 연봉:3000 부서:교육부
  5. 하위클래스에 prn() 메소드 오버라이딩
    => "서브클래스"문자열 출력
  6. 하위클래스에 callSuperThis()메소드 정의하고 상위의 prn() 메소드와 하위의 prn()메소드 호출

미리 주어진 클래스 파일

// Main Class

package main;

import cls.ClassTest_2;

public class Main {

    public static void main(String[] args) {
        ClassTest_2 ct = new ClassTest_2("이지나", 3000, "교육부");
        ct.callSuperThis();
        ct.getInformation();
    }
}
// ClassTest_1

package cls;

public class ClassTest_1 {
    private String name;
    private int salary;

    public ClassTest_1() { }

    public ClassTest_1(String n, int s) {
        name = n; salary = s;
    }
    public String getName() {
        return name;
    }
    public int getSalary() {
        return salary;
    }
    public void getInformation() {
        System.out.print("이름:" + name + " 연봉:" + salary);
    }
    public void prn() {
        System.out.println("수퍼클래스");
    }
}

Solutions

STEP 1. ClassTest_1을 상속받아 ClassTest_2 클래스를 정의한다

클래스 파일을 생성해주고 각각 ClassTest_1, ClassTest_2로 만들어줍니다.

이 때, ClassTest_2는 ClassTest_1을 상속받아야 하기 때문에 다음과 같이 작성해줍니다.

package cls;

public class ClassTest_2 extends ClassTest_1 {... }

STEP 2. 하위클래스에 String department 변수를 선언한다.

외부 객체에서의 참조를 피하기 위해 private 접근 제어자를 사용했습니다.

package cls;

public class ClassTest_2 extends ClassTest_1{

    private String department;

}

STEP 3. 하위클래스를 객체생성시 인수 값 3개를 넘겨준다.

상속을 받은 ClassTest_1에 변수가 두개 있습니다. 바로 namesalary입니다.

우선 생성자를 만들어주고 그 안에 부모 클래스의 인수 값을 넘겨주겠습니다. 그리고 ClassTest_2에서 따로 선언한 department 변수도 같이 넣어주겠습니다.

package cls;

public class ClassTest_2 extends ClassTest_1{

    private String department;
    
    public ClassTest_2(String name, int salary, String department) {
    	super(name, salary);
        this.department = department;
    }

}

STEP 4. 다음과 같이 출력되도록 상위클래스 getInformation() 메소드를 오버라이딩 한다. <이름:이지나 연봉:3000 부서:교육부>

우선 부모 클래스인 ClassTest_1에 있는 getInformation() 메서드를 가져와줍니다.

이때 오버라이드임이 명확하도록 저는 주석처리를 해주겠습니다.

package cls;

public class ClassTest_2 extends ClassTest_1{

    private String department;
    
    public ClassTest_2(String name, int salary, String department) {
    	super(name, salary);
        this.department = department;
    }
    
    @OVerride
    public void getInformation() {
    	super.getInformation();
        System.out.print("부서:" + department);
    }

}

부모 클래스의 메서드를 호출하기 위해서 super를 사용했습니다. 그리고 우리가 추가적으로 부서만 나타내주면 되기 때문에 부서를 따로 추가해줬습니다.

STEP 5. 하위클래스에 prn() 메소드 오버라이딩 <"서브클래스"문자열 출력>

package cls;

public class ClassTest_2 extends ClassTest_1{

    private String department;
    
    public ClassTest_2(String name, int salary, String department) {
    	super(name, salary);
        this.department = department;
    }
    
    @OVerride
    public void getInformation() {
    	super.getInformation();
        System.out.print("부서:" + department);
    }
    
    @Override
    public void prn() {
        System.out.println("서브클래스");
    }

}

마찬가지로 오버라이딩을 하는데 부모 클래스에 있던 prn()을 가져와서 단지 "서브클래스"라는 메시지만 출력해주면 됩니다. 그런데 부모 클래스에 원래 있던 "수퍼클래스"는 별도로 출력해 달라는 문제는 아니기 때문에 super를 쓸 필요는 없습니다.

STEP 6. 하위클래스에 callSuperThis()메소드 정의하고 상위의 prn() 메소드와 하위의 prn()메소드 호출

package cls;

public class ClassTest_2 extends ClassTest_1{

    private String department;
    
    public ClassTest_2(String name, int salary, String department) {
    	super(name, salary);
        this.department = department;
    }
    
    @OVerride
    public void getInformation() {
    	super.getInformation();
        System.out.print("부서:" + department);
    }
    
    @Override
    public void prn() {
        System.out.println("서브클래스");
    }
    
    public void callSuperThis() {
      super.prn();
      prn()
    }

}

우선 callSuperThis 멤버 메서드를 정의해주고, 부모 클래스에 있는 메서드를 가져올 때는 super + 메서드명과 같은 형식으로 작성해주면 부모 클래스에 있는 메서드를 가져올 수 있습니다.
그리고 그냥 메서드명만 써주면 자기 클래스 안에 있는 메서드를 호출해주죠.


문제 2

  1. Human 클래스를 상속 받은 Student 클래스를 구현하시오.
  2. 3개의 Student 객체를 생성하여 배열에 셋팅 한 후 각각의 객체의 나이, 신장을 출력 한다.
    [출력결과]
    name 나이 신장 몸무게 학번
    홍길동 15 171 81 201101
    정길동 13 183 72 201102
    박길동 16 175 65 201103

미리 주어진 클래스 파일

package main;

import human.Student;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Student se[] = new Student[3];

        se[0] = new Student("홍길동", 15, 171, 81, "201901");
        se[1] = new Student("정길동", 13, 183, 72, "201502");
        se[2] = new Student("박길동", 16, 175, 65, "202103");

        System.out.printf("%4s %5s %8s %8s %8s\n", "name", "나이", "신장", "몸무게", "학번");    // %칸수s

        for (Student sm : se)
            System.out.println(sm.toString());

    }

}

Solutions

STEP 1. Human 클래스를 상속 받은 Student 클래스를 구현하시오.

각각의 클래스 파일을 만들어줍시다.

우선 부모 클래스가 있어야 자식 클래스가 만들어질 수 있기 때문에 Human 클래스 파일과 Student 클래스 파일을 각각 만들어줍시다.

// Human Class

package human;

public class Human { ... }
// Student Class
package human;

public class Student extends Human { ... }

STEP 2. 3개의 Student 객체를 생성하여 배열에 셋팅 한 후 각각의 객체의 나이, 신장을 출력 한다.

우선은 배열 자체는 주어진 파일에 세팅이 되어 있기 때문에 건너 뛰고 우리가 고민해야 할 것은 클래스에 어떤 변수를 넣어줄지입니다.

우선 출력해주어야 할 정보가 이름, 나이, 신장, 몸무게, 학번이잖아요? 그러니까 사람의 공통된 특성과 학생의 공통된 특성으로 나눠주면 좋을 것 같습니다.

그래서 Human 클래스에는 이름, 나이, 신장, 몸무게를 넣어줄 것이고 Student 클래스에는 학번만 넣어주겠습니다.

STEP 2-1. 변수 선언해주기

이렇게 우선 클래스마다 변수만 세팅해주겠습니다.

// Human Class

package human;

public class Human {

	private String name;
	private int age;
	private double height;
	private double weight;

}
// Student Class
package human;

public class Student extends Human {

	private String hak;

}

STEP 2-2. 클래스마다 생성자 만들어주기

우선 클래스가 메인함수에서 생성되려면 생성자가 있어야겠죠?

각 클래스마다 생성자를 만들어주겠습니다.

// Human Class

package human;

public class Human {

	private String name;
	private int age;
	private double height;
	private double weight;
    
    public Human (String name, int age, double height, double weight) {
    	this.name = name;
        this.age = age;
        this.height = height;
        this.weight = weight;
    }

}

부모 클래스에서 받아오는 매개변수는 super() 메서드로 정의해줍니다!

// Student Class
package human;

public class Student extends Human {

	private String hak;		// 학번
    
    public Student (String name, int age, double height, double weight, String hak) {
    	super(name, age, height, weight);
    	this.hak = hak;
    }

}

STEP 2-3. 출력해주기

메인 함수 제공된 파일 보시면 다음과 같이 구성되어 있습니다.

System.out.printf("%4s %5s %8s %8s %8s\n", "name", "나이", "신장", "몸무게", "학번");    // %칸수s

for (Student sm : se)
	System.out.println(sm.toString());

우선 printf로 표의 제목행(?)을 출력해주고 나머지 항목은 for each문으로 출력해줍니다.

System.out.println(sm.toString());에서 sm은 배열이었고, 이 배열을 toString 문자열로 나타내라는 것이죠.

그러면 각각의 클래스에 멤버 메서드를 만들어서 배열을 리턴해주도록 하겠습니다.

// Human Class

package human;

public class Human {

	private String name;
	private int age;
	private double height;
	private double weight;
    
    public Human (String name, int age, double height, double weight) {
    	this.name = name;
        this.age = age;
        this.height = height;
        this.weight = weight;
    }
    
    public String toString() {
    	String data = name + "\t" + age + "\t" + height + "\t" + weight
        return data;
    }

}

각각의 변수들을 모두 합해서 출력해주는 방식입니다.

// Student Class
package human;

public class Student extends Human {

	private String hak;		// 학번
    
    public Student (String name, int age, double height, double weight, String hak) {
    	super(name, age, height, weight);
    	this.hak = hak;
    }
    
    @Override
    public String toString() {
      return super.toString() + "\t" + hak;
    }

}

이렇게 하고 실행해보면 정상적으로 출력됩니다!


문제 3

Movie클래스를 상속받아 MovieWork클래스를 구현하세요.
MovieWork클래스에서 display( )메소드를 오버라이딩해서 아래와 같이 구현하세요.
[출력결과]
영화제목: 스파이더맨
감독 : 7, 배우 : 5
영화총점 :12
영화평점 : ☆☆☆☆
*******************************
영화제목: 매트릭스
감독:9, 배우:10, 작품성:10, 대중성:8, 대본:9
영화총점 : 46
영화평점 : ☆☆☆☆☆

미리 주어진 클래스 파일

// Main Class

package main;

import movie.Movie;
import movie.MovieWork;

public class Main {

    public static void main(String[] args) {

        Movie mv = new Movie("스파이더맨", 7, 5);
        mv.display();

        System.out.println("***********************************"); 
        
        // 매개변수 4개인 생성자로 객체 생성
        MovieWork mk = new MovieWork("매트릭스", 9, 10, 10, 8, 9);
        mk.display();

    }
}
// Movie Class

package movie;

public class Movie {
    String title; 	// 영화제목 - 멤버변수
    int director; 	// 감독점수 - 멤버변수
    int actor; 		// 배우점수 - 멤버변수

    public Movie(String title, int director, int actor) {
        this.title = title;
        this.director = director;
        this.actor = actor;
    }

    public void display() {
        int total = director + actor;
        String result = "";

        System.out.printf("영화제목:%s\n", title);
        System.out.printf("감독:%d, 배우:%d\n", director, actor);
        System.out.printf("영화총점 :%d\n", total);

        if (total >= 15)
            result = "☆☆☆☆☆";
        else if (total >= 12)
            result = "☆☆☆☆";
        else if (total >= 10)
            result = "☆☆☆";
        else
            result = "☆☆";

        System.out.println("영화평점 : " + result);
    }
}
// MovieWork Class

package movie;

public class MovieWork extends Movie {

    private final int[] score;

    public MovieWork(String title, int director, int actor, int ... score) {
        super(title, director, actor);
        this.score = score;
    }
    
    @Override
    public void display() { // 여기를 구현하세요
    
    }
}

Solutions

// MovieWork Class

package movie;

public class MovieWork extends Movie {

    private final int[] score;

    public MovieWork(String title, int director, int actor, int ... score) {
        super(title, director, actor);
        this.score = score;
    }
    
    @Override
    public void display() { // 여기를 구현하세요
    
    	super.display();
        int total = director + actor;
        for (int i = 0; i < score.length; i++) {
            total += score[i];
        }
        
        /*
    	int total = director + actor;
        String result = "";

        for (int i = 0; i < score.length; i++) {
            total += score[i];
        }

        System.out.printf("영화제목:%s\n", title);
        System.out.printf("감독:%d, 배우:%d\n", director, actor);
        System.out.printf("영화총점 :%d\n", total);

        if (total >= 15)
            result = "☆☆☆☆☆";
        else if (total >= 12)
            result = "☆☆☆☆";
        else if (total >= 10)
            result = "☆☆☆";
        else
            result = "☆☆";

        System.out.println("영화평점 : " + result);
        */
    }
}

Movie 클래스에 있던걸 밀어넣어주고 for문으로 배열을 채워주니까 간단하게 작동했습니다...

그런데 이제 중복을 피하기 위해서 부모 요소에 있던 원래 display를 가져와주고 total이라는 변수는 따로 만들어서 for문을 돌려 배열에 채워 넣어 주었습니다.

간단한 문제이기 때문에 넘어가겠습니다.


문제 4

사람의 신장(H)와 몸무게(W)를 입력 받아서 비만도(B)를 계산하는 프로그램을 작성하시오.

  • 표준체중:SW=(H-100)x0.9
  • 비만도: B(%)=(W-SW)/SWx100
  • HealthRate 클래스에 아래 사항을 추가합니다.
  1. 표준체중 계산하는 메소드를 정의한다.
  2. 비만도를 계산하는 메소드를 정의한다.
    비만도가 10% 이내이면 정상, 10%이상 20%이면 과체중, 20% 이상은 비만
  3. 출력결과
    홍길동님의 신장 168 , 몸무게 45 정상입니다.
    일지매님의 신장 168 , 몸무게 90 비만입니다.

미리 주어진 클래스 파일

// Main Class

package main;

import health.HealthRate;

public class Main {

    public static void main(String[] args) {
        HealthRate hr = new HealthRate("홍길동", 168, 45);
        hr.prn();
        HealthRate hr2 = new HealthRate("일지매", 168, 90);
        hr2.prn();

    }
}
// Health

package health;

public class Health {
    String name; 	// 이름
    double height; 	// 신장
    double weight; 	// 몸무게

    public Health(String name, double height, double weight) {
        this.name = name;
        this.height = height;
        this.weight = weight;
    }

    public void prn() {
        System.out.printf("%s님의 키 %.0f, 몸무게 %.0f 입니다.\n", name, height, weight);
    }
}

Solutions

STEP 1. 표준체중 계산하는 메소드를 정의한다.

우선 HealthRate 클래스를 만들어주고 생성자까지 선언하겠습니다.

package health;

public class HealthRate extends Health {

	public HealthRate(String name, double height, double weight) {
		super(name, height, weight);
	}

}

그리고 표준 체중을 계산하는 메서드를 만들어주겠습니다.

package health;

public class HealthRate extends Health {

	public HealthRate(String name, double height, double weight) {
		super(name, height, weight);
	}
    
	public double getSW() {
		return (height-100) * 0.9;
	}

}

STEP 2. 비만도를 계산하는 메소드를 정의한다.

비만도는 (W-SW)/SWx100 이었기 때문에 getSW() 메서드를 활용해야 합니다.

package health;

public class HealthRate extends Health {

	public HealthRate(String name, double height, double weight) {
		super(name, height, weight);
	}
    
	public double getSW() {
		return (height-100) * 0.9;
	}
    
	public getB() {
		return (weight - getSW()) / getSW() * 100;
	}

}

STEP 3. 결과 출력하기

결과를 출력하려면 부모 클래스에 있는 prn() 메서드를 오버로드해서 재정의 해주어야 합니다.

package health;

public class HealthRate extends Health {

	public HealthRate(String name, double height, double weight) {
		super(name, height, weight);
	}
    
	@Overroad
	public void prn() {
		System.out.printf("%s님의 키 %.0f, 몸무게 %.0f ", name, height, weight);
        
        double b = getB();		// 비만도 저장할 변수
        
        if (b < 10) 		    System.out.println("정상입니다");
        else if (10 <= b && b < 20) System.out.println("과체중입니다");
        else 			    System.out.println("비만입니다");
	}
    
	public double getSW() {
		return (height-100) * 0.9;
	}
    
	public getB() {
		return (weight - getSW()) / getSW() * 100;
	}

}

이렇게 완성되었습니다.

어떠셨나요? 복습하는데 많은 도움이 되시길 바랍니다!

profile
tried ? drinkCoffee : keepGoing;

0개의 댓글