자 그러면 Java Programming (8)까지의 내용을 바탕으로 문제를 해결해보겠습니다.
- ClassTest_1을 상속받아 ClassTest_2 클래스를 정의한다.
- 하위클래스에 String department 변수를 선언한다.
- 하위클래스를 객체생성시 인수 값 3개를 넘겨준다
(이름, 연봉, 부서)- 다음과 같이 출력되도록 상위클래스 getInformation() 메소드를 오버라이딩 한다.
이름:이지나 연봉:3000 부서:교육부- 하위클래스에 prn() 메소드 오버라이딩
=> "서브클래스"문자열 출력- 하위클래스에 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("수퍼클래스");
}
}
ClassTest_1
을 상속받아 ClassTest_2
클래스를 정의한다클래스 파일을 생성해주고 각각 ClassTest_1, ClassTest_2로 만들어줍니다.
이 때, ClassTest_2는 ClassTest_1을 상속받아야 하기 때문에 다음과 같이 작성해줍니다.
package cls;
public class ClassTest_2 extends ClassTest_1 {... }
String department
변수를 선언한다.외부 객체에서의 참조를 피하기 위해 private
접근 제어자를 사용했습니다.
package cls;
public class ClassTest_2 extends ClassTest_1{
private String department;
}
상속을 받은 ClassTest_1에 변수가 두개 있습니다. 바로 name
과 salary
입니다.
우선 생성자를 만들어주고 그 안에 부모 클래스의 인수 값을 넘겨주겠습니다. 그리고 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;
}
}
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
를 사용했습니다. 그리고 우리가 추가적으로 부서만 나타내주면 되기 때문에 부서를 따로 추가해줬습니다.
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
를 쓸 필요는 없습니다.
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
+ 메서드명과 같은 형식으로 작성해주면 부모 클래스에 있는 메서드를 가져올 수 있습니다.
그리고 그냥 메서드명만 써주면 자기 클래스 안에 있는 메서드를 호출해주죠.
- Human 클래스를 상속 받은 Student 클래스를 구현하시오.
- 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());
}
}
각각의 클래스 파일을 만들어줍시다.
우선 부모 클래스가 있어야 자식 클래스가 만들어질 수 있기 때문에 Human
클래스 파일과 Student
클래스 파일을 각각 만들어줍시다.
// Human Class
package human;
public class Human { ... }
// Student Class
package human;
public class Student extends Human { ... }
우선은 배열 자체는 주어진 파일에 세팅이 되어 있기 때문에 건너 뛰고 우리가 고민해야 할 것은 클래스에 어떤 변수를 넣어줄지입니다.
우선 출력해주어야 할 정보가 이름, 나이, 신장, 몸무게, 학번이잖아요? 그러니까 사람의 공통된 특성과 학생의 공통된 특성으로 나눠주면 좋을 것 같습니다.
그래서 Human
클래스에는 이름, 나이, 신장, 몸무게를 넣어줄 것이고 Student
클래스에는 학번만 넣어주겠습니다.
이렇게 우선 클래스마다 변수만 세팅해주겠습니다.
// 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;
}
우선 클래스가 메인함수에서 생성되려면 생성자가 있어야겠죠?
각 클래스마다 생성자를 만들어주겠습니다.
// 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;
}
}
메인 함수 제공된 파일 보시면 다음과 같이 구성되어 있습니다.
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;
}
}
이렇게 하고 실행해보면 정상적으로 출력됩니다!
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() { // 여기를 구현하세요
}
}
// 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문을 돌려 배열에 채워 넣어 주었습니다.
간단한 문제이기 때문에 넘어가겠습니다.
사람의 신장(H)와 몸무게(W)를 입력 받아서 비만도(B)를 계산하는 프로그램을 작성하시오.
- 표준체중:SW=(H-100)x0.9
- 비만도: B(%)=(W-SW)/SWx100
- HealthRate 클래스에 아래 사항을 추가합니다.
- 표준체중 계산하는 메소드를 정의한다.
- 비만도를 계산하는 메소드를 정의한다.
비만도가 10% 이내이면 정상, 10%이상 20%이면 과체중, 20% 이상은 비만- 출력결과
홍길동님의 신장 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);
}
}
우선 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;
}
}
비만도는 (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;
}
}
결과를 출력하려면 부모 클래스에 있는 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;
}
}
이렇게 완성되었습니다.
어떠셨나요? 복습하는데 많은 도움이 되시길 바랍니다!