본문 바로가기

대학교 과제/Java [ 2 - 1 ]

Java 10주차 과제 - 상속

반응형

1. 과제 안내문


학생을 나타내는 수퍼클래스 Student와 그 서브클래스인 Graduate과 Undergraduate 클래스를 작성하라. Graduate은 대학원생, Undergraduate은 학부생을 나타낸다. 학생의 데이터는 ‘이름’, ‘학번’, ‘소속 학과’, ‘성적’(GPA) 등이고 여기에 추가로 학부생은 ‘학년’을, 대학원생은 ‘연구 주제’와 ‘지도교수’를가진다. 다음과 같은 테스트 클래스로부터 첨부한 실행 결과가 나오도록 클래스 계층을 작성하고 프로그램 소스와 실행 결과를 캡춰하여 제출하라.


 과제 안내문을 처음 봤을 때 그래픽을 활용하는 과제가 아니어서 매우 다행임을 느꼈다 ㅠㅠ (물론 다른 문제를 더 잘푼다는 것은 아니다.) 시행 결과를 보면 알겠지만 그렇게 어려운 문제가 아니었다. 실제로 이 글을 작성하는 지금, 나는 강원도 양양의 한 펜션에서 놀다 지쳐 과제를 하고 바로 블로그에 정리를 하고 있다. 상속은 어렵다면 어려운 문제이지만 Class와 오버라이딩의 개념만 확실히 안다면 문제를 충분히 해결할 수 있다고 생각한다. (지금 내가 배우고 있는 수준에서는!) 

 

2. 실행 결과 예시


실행 결과 예시


 다시 한 번 말하지만 이번과제는 난이도가 엄청 어려운 과제가 아니다. (실제로 이 과제를 해결하는데 20분 밖에 안걸림......) 그렇다고 중요하지 않은 과제도 아니다. 상속은 객체지향언어에서 매우 중요한 문법이기 때문이다. 아마 유지 보수가 쉽다는 객체지향 언어의 장점은 이 '상속'이라는 어마어마한 기능에서 나온 것일지도 모른다. ( 이건 논고가 아닙니다. 저만의 생각입니다.) 그리고 우리 Java 교수님은 쉬운 과제 다음에 언제나 어려운 과제로 정신차리게 해주신다......ㅎㅎ

 

3. 코드 작성

 

 일단 super 클래스인 Student 클래스 먼저 작성해보자! super클래스가 뭐지? 하시는 분들이 계시다면...... 곧 블로그의 개념정리 카테고리에 올리겠습니다...... 이 페이지에서는 문법에 대한 설명을 다루지 않습니다 ㅠㅠ 다음은 내가 작성한 Sutdent클래스이다.

 

- student 클래스 작성

public class Student {
	
	protected String name;
	protected String studentID;
	protected String major;
	protected double GPA;
	
	public Student(String name, String studentID,String major, double GPA){
		this.name = name;
		this.studentID = studentID;
		this.major = major;
		this.GPA = GPA;
	}
	
	public String toString() {
		return "이름=" + name + ", 학번=" + studentID + ", 학과=" + major + ", 성적=" + GPA;
	}
}

 변수들은 전부 protected로 선언하였다. 가끔 보면 super Class의 변수들을 private로 선언하고 super클래스 내의 메소드로 그 값들을 불러오는 분들이 계신다. 나는 그렇게 하지 않았다. 왜냐하면 이렇게 하는게 더 편하기 때문이다 ㅎㅎ 물론 이 과제에서는 생성자 메소드에서 super를 통해 다른 자식 Class에서 부모 Class로 접근하지만, 다른 프로그램에서는 super클래스의 구성 변수들을 참조해야하는 경우가 많다. 그런 경우는 private로 선언 한 후 getMajor()과 같이 변수들의 값을 반환하는 메소드를 사용하는 방식으로 코드를 짜겠지만 지금은 아니다.

 

- Graudate 클래스 작성

public class Graduate extends Student{
	protected String studyTopic;
	protected String professer;
	
	public Graduate(String name, String studentID, String major, double GPA, String studyTopic, String professer) {
		super(name, studentID, major, GPA);
		this.studyTopic = studyTopic;
		this.professer = professer;
	}
	
	public void setThesisTitle(String studyTopic) {
		this.studyTopic = studyTopic;
	}
	
	public String toString() {
		return super.toString() + ", 논문주제 = " + studyTopic + ", 지도교수=" + professer;
	}
	

}

 일단 생성자에서 super 생성자를 불러 값들을 저장해준다. protected로 선언했다고 해서 자식 Class의 생성자에서 값들을 저장하는 코드를 똑같이 작성할 필요는 없다. 그리고 실행 예시 코드에서 나왔듯이 이 Class에서는 setThesisTitle이라는 메소드를 작성해야한다. 만약 내가 Student Class에서 studyTopic을 private로 선언 했다면...... 이 부분은 조금 더 길어질 것이다. (물론 내가 알고 있는 지식의 한에서는) toString() 클래스는 많은 분들이 아는문법이라고 생각한다. 조금 다른 점이 있다면 super클래스의 toString() 메소드를 물러 값들을 반환 했다는 것이다. 생성자와 비슷한 원리라고 생각하면 좋을 것 같다.

 

- Undergraduate 클래스 작성

public class Undergraduate extends Student{
	
	protected int grade;
	
	public Undergraduate(String name, String studentID, String major, double GPA, int grade) {
		super(name, studentID, major, GPA);
		this.grade = grade;
	}

	public String toString() {
		return super.toString() + ", 학년=" + grade;
	}
	
}

 위의 Graduate 클래스와 똑같다. 오히려 setThesisTitle 메소드가 없어 쉬웠다.

 

- 전체 코드

//Student Class
public class Student {
	
	protected String name;
	protected String studentID;
	protected String major;
	protected double GPA;
	
	public Student(String name, String studentID,String major, double GPA){
		this.name = name;
		this.studentID = studentID;
		this.major = major;
		this.GPA = GPA;
	}
	
	public String toString() {
		return "이름=" + name + ", 학번=" + studentID + ", 학과=" + major + ", 성적=" + GPA;
	}
}

//Graduate Class
public class Graduate extends Student{
	protected String studyTopic;
	protected String professer;
	
	public Graduate(String name, String studentID, String major, double GPA, String studyTopic, String professer) {
		super(name, studentID, major, GPA);
		this.studyTopic = studyTopic;
		this.professer = professer;
	}
	
	public void setThesisTitle(String studyTopic) {
		this.studyTopic = studyTopic;
	}
	
	public String toString() {
		return super.toString() + ", 논문주제 = " + studyTopic + ", 지도교수=" + professer;
	}
	

}

//Undergraduate Class
public class Undergraduate extends Student{
	
	protected int grade;
	
	public Undergraduate(String name, String studentID, String major, double GPA, int grade) {
		super(name, studentID, major, GPA);
		this.grade = grade;
	}

	public String toString() {
		return super.toString() + ", 학년=" + grade;
	}
	
}

//StudentTest
public class TestStudent {
	public static void main(String[] args) {
		Undergraduate s1 = new Undergraduate("홍길동","201901012","소프트웨어학과",3.88, 2);
		Graduate s2 = new Graduate("정길동","201811234","컴퓨터공학과",4.12,"미정","박교수");
		Student s3 = new Graduate("김길동", "201611235","컴퓨터공학과",3.88,"미정","박교수");
		s2.setThesisTitle("정보보안");
		((Graduate)s3).setThesisTitle("빅데이터");
		
		System.out.println(s1.toString());
		System.out.println(s2.toString());
		System.out.println(s3.toString());
	}
}

4. 실행 결과


실행 결과


5. 결어

 

 Java를 조금이라도 접해보신 분은 아시겠지만 이번 과제는 정말 쉬웠다. 다만, 상속이라는 개념을 확실하게 이해하고 그것을 바탕으로 오버라이딩과 Object Class를 이해해야한다는 생각이 들었다. 장담하지만 다음과제는 꽤나 높은 난이도를 가질 것이다. 그 전까지 그 어려운 과제를 해결할 수 있도록 충분한 준비를 해야겠다.

반응형