JAVA 문제 질문 받아주실 수 있나요???
public class Student {
public String name;
public int grade;
public Student( ) {
System.out.println("Student 생성자 호출");
}
public String getName( ) {
return name;
}
public int getGrade( ) {
return grade;
}
public String getStudInfo( ) {
System.out.println("Student 클래스의 getStudInfo( ) 메서드 호출");
return "이름은 : " + name + " ,학년은 " +grade;
}
public String getTeacher( ) {
return "김길동 선생님";
}
}
public class Elementary extends Student {
private int point;
public Elementary(String name, int grade, int point) {
System.out.println("Elementary 생성자 호출");
super.name=name;
super.grade=grade;
this.point=point;
}
public String getClassTeacher( ) {
return "박길순 선생님";
}
}
Q1 : 요러한 슈퍼클래스 Student와 서브클래스 Elementary를 짰는데요! 추상클래스와 추상메소드를 공부중인데 추상클래스와 추상메소드를 이용해서 Student 클래스를 바꾸면 어디를 어떻게 바꿔야하나요?
Q2 : 그리고 Student 클래스를 추상클래스로 바꾼다고 하면 서브클래스인 Elementary도 바꾸어주어야 하잖아요! 어떻게 바꿔줘야할까요?ㅠ
public class MyStudent {
private String name;
private int grade;
public MyStudent(String name, int grade) {
this.name = name;
this.grade = grade;
}
public String getName( ) {
return name;
}
public int getGrade( ) {
return grade;
}
public boolean equals(Object o) {
MyStudent s=(MyStudent)o;
if(name.equals(s.name) && (grade==s.grade))
return true;
else return false;
}
}
Q3 : 이 코드에서 equals() 메소드의 의미를 잘 모르겠습니다 ㅠㅠ
안녕하세요.
질문이 애매모호한 부분이 있어서 제 생각대로 풀이했습니다.
Q1. 요러한 슈퍼클래스 Student와 서브클래스 Elementary를 짰는데요! 추상클래스와 추상메소드를 공부중인데 추상클래스와 추상메소드를 이용해서 Student 클래스를 바꾸면 어디를 어떻게 바꿔야하나요?
Q2 : 그리고 Student 클래스를 추상클래스로 바꾼다고 하면 서브클래스인 Elementary도 바꾸어주어야 하잖아요! 어떻게 바꿔줘야할까요?ㅠ
abstract class를 추가하고 Student 생성자를 변경했습니다. getClassTeacher를 getTeacher로 변경했습니다.
public abstract class Student { public String name; public int grade; public Student(String name, int grade) { System.out.println("Student 생성자 호출"); this.name = name; this.grade = grade; } public String getName() { return name; } public int getGrade() { return grade; } public String getStudInfo() { System.out.println("Student 클래스의 getStudInfo( ) 메서드 호출"); return "이름은 : " + name + " ,학년은 " + grade; } public String getTeacher() { return "김길동 선생님"; } } public class Elementary extends Student { private int point; public Elementary(String name, int grade, int point) { super(name, grade); System.out.println("Elementary 생성자 호출"); this.point = point; } public String getTeacher() { return "박길순 선생님"; } }Q3 : 이 코드에서 equals() 메소드의 의미를 잘 모르겠습니다 ㅠㅠ
equals는 객체 비교 시 사용됩니다.
MyStudent myStudent1 = new MyStudent("홍길동", 1); MyStudent myStudent2 = new MyStudent("이순신", 1); // myStudent1과 myStudent2가 같은지를 비교할 때 equals 메소드에 선언된 것처럼 // 이름과 grade를 비교하여 둘 다 같으면 true, 아니면 false를 반환합니다. if (myStudent1.equals(myStudent2)) { ... }Q1, Q2
추상클래스는 공통으로 사용될 함수들을 정의하고 상속받은 클래스들에서 공통으로 작성해야하는 함수를 추상함수로 정의합니다.
예를들어 담임선생님이름을 리턴하는 함수(getClassTeacher)가 반드시 필요하다는 가정하에 추상화클래스로 변경해봤습니다.
public abstract class Student { public String name; public int grade; public Student( ) { System.out.println("Student 생성자 호출"); } public String getName( ) { return name; } public int getGrade( ) { return grade; } public String getStudInfo( ) { System.out.println("Student 클래스의 getStudInfo( ) 메서드 호출"); return "이름은 : " + name + " ,학년은 " +grade; } public String getTeacher( ) { return "김길동 선생님"; } public abstract String getClassTeacher(); } public class Elementary extends Student { private int point; private String classTeacher; public Elementary(String name, int grade, int point, String classTeacher) { System.out.println("Elementary 생성자 호출"); super.name=name; super.grade=grade; this.point=point; this.classTeacher = classTeacher; } public String getClassTeacher( ) { return this.classTeacher+" 선생님"; } } public class Elementary2 extends Student { private int point; private String classTeacher; public Elementary2(String name, int grade, int point, String classTeacher) { System.out.println("Elementary 생성자 호출"); super.name=name; super.grade=grade; this.point=point; this.classTeacher = classTeacher; } public String getClassTeacher( ) { return this.name+"의 담임은 "+this.classTeacher+" 선생님입니다."; } }Q3
equals 함수는 동일한 객체인지를 확인하기위해서 사용됩니다. 모든 클래스는 java.lang.Object를 상속받습니다. Ojbect.equals() 함수를 확인해보세요.
특별한 경우에 동일한 객체가 아니더라도 같은 객체로 인식하기 위해서 equals함수를 overriding하여 사용합니다. 대표적으로 String.equals() 함수입니다.
여기서는 name,grade 같다면 객체가 다르더라도 같은 값으로 인식하기 위해서 작성되었습니다.
예) MyStudent a = new MyStudent('나','1학년'); MyStudent b = new MyStudent('나','1학년'); 현재 : a.equals(b) ==> true MyStudent 에서 equals()함수를 삭제할 경우 : a.equals(b) ==> falseJava에서는 Object에 대한 equals는 멤버 변수들의 값을 비교하는 것이 아닙니다.
해당 Object가 같은 Object인지를 비교하는것이다보니 Object에 있는 멤버 변수들의 값은 같아도 다르다고 나오게 됩니다.
그렇다보니 equals 메소드를 오버라이드해서 멤버 변수들을 비교하는 코드로 재정의한것이라고 보면 됩니다.