15. 상속과 super - (자식클래스가 부모의 필드까지 이용하기) [Tutorial15]
미리 만든 [Person - 이름, 키, 나이, 몸무게 ]클래스를 상속하면,
아래 자식클래스들[ Student - 학점, 학번, 학년 + (상속)이름, 키,나이,몸무게 ] , [ Teacher - 교직원 번호, 월급, 년차 + (상속)이름, 키,나이,몸무게] 를 만들 때, 상속해서 그 속성을 쓸 수 있다. 불필요한 코드를 줄여서, 효율적으로 코딩할 수 있다.
[1] 부모클래스(4가지 변수)를 만들고 자식클래스(3가지변수 + 부모 4가지 변수)에서 상속해보자.
1. 사람의 특징을 가진 [Person]클래스를 만든다.( private 필드 -> getter/setter -> 생성자 -> 그외 매쏘드 순)
(1) 각각 private로 필드들을 만든다.
(2) 보안private필드에 접근할 수 있는 get/set()매쏘드를 만든다.(이번에는 한번에 만들 수 있는 자바기능을 이용한다)
*** 클래스 내부에서 우클릭 > [ Source ] > [ Generate getter / setter ]
cf) 외부에서 꺼내쓰는 int get() / 내부에 입력하는 void set(int x)
(3) 각 필드(private 필드=멤버변수)에 대한 생성자를 만든다. 우클릭 > source > Generate Constructor using Field
*** 이 때 super()라는 것은, 부모클래스의 생성자를 호출해서 초기화 시키겠다는 의미이다.
그러나, Person은 가장 상위 클래스로, 아직 상속한 부모클래스가 없기 때문에, 비어있다.
public class Person {
private String name;
private int age;
private int height;
private int weight;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public Person(String name, int age, int height, int weight) {
super();
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
}
}
2. Person이라는 클래스를 상속하는 Student클래스를 만들자.
(1) 클래스를 만들고, extends Person 으로 상속하자.
(2) 학생클래스에 필요한 필드를 만들어주자.
(3) getter/setter를 만들고
(4) 생성자를 만들어주자. 이때, Student클래스에 만든 필드들 이외에,
상속한 Person클래스의 필드(name, age, height, weight)들까지 입력되어있다.*******
- 개발의 편의성을 위해, 자신이 상속한 부모클래스의 필드들까지 한꺼번에 초기화 해주기 위한 것이다.
- super( 파라미터)는 부모가 가진 생성자를 호출해서, 초기화 한다는 의미이다.****
public Student(String name, int age, int height, int weight, String studentID, int grade, double gPA) {
super(name, age, height, weight);
this.studentID = studentID;
this.grade = grade;
GPA = gPA;
}
(5) 이제 추가적으로 Student클래스 내부에 show() 라는 매쏘드도 만들어주자. 출력시 get변수명()으로 꺼내쓰자.
*** 이때 Person클래스 내부 필드인 name을 getName()할 때는, 상속받은 상태이므로 Person.getName()이 아니라 getName()으로 바로 사용할 수 있다.
public void show() {
System.out.println("-----------------------------");
System.out.println("학생 이름 : " + getName());
System.out.println("학생 나이 : " + getAge());
System.out.println("학생 키 : " + getHeight());
System.out.println("학생 몸무게 : " + getWeight());
//위에는 상속받은 Person클래스의 매쏘드를 바로 사용함
System.out.println("학생 학번 : " + getStudentID());
System.out.println("학생 학년 : " + getGrade());
System.out.println("학생 학점 : " + getGPA());
System.out.println("-----------------------------");
}
3. 이제 메인클래스를 만들고 메인함수에서 객체를 만들고, show()매쏘드를 호출해보자.
public class Main {
public static void main(String[] args) {
Student student1 = new Student("조재성", 32, 163, 55, "1111048", 3, 4.1);
Student student2 = new Student("김석영", 31, 167, 47, "1311051", 3, 3.8);
student1.show();
student2.show();
}
}
4. 출력물을 확인해보자.
-----------------------------
학생 이름 : 조재성
학생 나이 : 32
학생 키 : 163
학생 몸무게 : 55
학생 학번 : 1111048
학생 학년 : 3
학생 학점 : 4.1
-----------------------------
-----------------------------
학생 이름 : 김석영
학생 나이 : 31
학생 키 : 167
학생 몸무게 : 47
학생 학번 : 1311051
학생 학년 : 3
학생 학점 : 3.8
-----------------------------
[2] 또하나의 클래스를 만들고 출력해보자.
1. Teacher클래스를 만들고, extends Person을 해보자.
(1) 3가지 private필드를 만들고 -> 외부에서 접근할 수 있는 public 겟셋터 -> 생성자까지 만들자.
(2) show()함수를 만들어서 3+ 부모4 총 7가지 변수를 출력해주자.
2. 메인클래스 메인함수로 가서, Teacher객체를 만들면서 초기화해주고, 출력도 해보자.
Teacher teacher1 = new Teacher("이숭인", 38, 171, 55, "0000000", 400, 5);
teacher1.show();
------------------
교사 이름 : 이숭인
교사 나이 : 38
교사 키 : 171
교사 몸무게 : 55
교직원 번호 : 0000000
교사 월급 : 400
교사 연차 : 5
------------------
[3]배열을 이용해서 많은 객체들을 관리해보자.
1. Student클래스 객체100개를 배열로 생성하자.
*** 객체배열을 만들때는, 생성자호출이 아니므로 new Student() [ 배열 ] ; 이 아니라, new Student[ 배열 ]; 로 우항을 적는다.
생성자로 초기화하는 것은 따로 해줄 것이다.
Student[] students = new Student[100];
2. for문을 이용해서 100명의 학생들을 모두 [ 생성자를 이용한 초기화 ]를 한번해 해주자. 대신 학번만 다르게 주자.
- 학번은 숫자가 하나의 단어로 인식되는 String 문자열이다. index인 i를 쓰더라도 뒤에 [ + "" ] 로 끝나야한다.( i + "" )
for(int i=0;i<100;i++) {
students[i] = new Student("홍길동 "+i+"번째", 20, 175, 70, i + "" , 1, 4.5 );
students[i].show();
}
3. 출력값
for(int i=0;i<100;i++) {
students[i] = new Student("홍길동 "+i+"번째", 20, 175, 70, i + "" , 1, 4.5 );
students[i].show();
}
[4] Scanner로 실제 입력을 받아서 객체를 초기화하여, 출력해주자.
1. Scanner 변수를 생성해서, 콘솔창에서 총 학생수를 입력받고, 그 숫자로 배열을 만들자.
Scanner sc = new Scanner(System.in);
System.out.print("총 몇명의 학생이 존재합니까?(배열수) : ");
int number = sc.nextInt();
2. for문을 만들고, 각 학생들마다 입력받을 정보들을 Student클래스의 생성자의 파라미터에서 복사해와서 가져온 뒤,
임시적으로 변수로 선언하여 받은 다음, 생성자로 초기화 해준다.
< 객체 생성시, 생성자로 초기화해줄 파라미터는, 클래스의 생성자부분의 파라미터를 복사해와서 편하게 작성할 수 있다>
(1) Student 클래스에서 생성자의 파라미터에 각 변수들을 복사해오자
public Student(String name, int age, int height, int weight, String studentID, int grade, double gPA)
(2) 그것을 for문 안에 변수선언으로서 수정하자.
for(int i = 0 ; i <number ; i++) {
String name;
int age;
int height;
int weight;
String studentID;
int grade;
double gPA;
}
(3) 출력문 + sc.nextInt() 등 7가지를 만들어서, 각 변수에다 대입해준다.
*** 이때, String은 sc.nextString()이 아니라 , sc.next()이다! / double 은 sc.nextDouble()
for(int i = 0 ; i <number ; i++) {
String name;
int age;
int height;
int weight;
String studentID;
int grade;
double gPA;
System.out.print("학생의 이름을 입력하세요 : ");
name = sc.next();
System.out.print("학생의 나이를 입력하세요 : ");
age = sc.nextInt();
System.out.print("학생의 키를 입력하세요 : ");
height = sc.nextInt();
System.out.print("학생의 몸무게를 입력하세요 : ");
weight = sc.nextInt();
System.out.print("학생의 학번을 입력하세요 : ");
studentID = sc.next();
System.out.print("학생의 학년을 입력하세요 : ");
grade = sc.nextInt();
System.out.print("학생의 학점을 입력하세요 : ");
gPA = sc.nextDouble();
}
(4) 입력받은 값을 가진 변수들을 이용해서, 생성자를 호출하여 각 배열[i]에 new Student(~ , , , ,~)로 초기화해준다.
*** Student 클래스의 파라미터를 다시 복사해 온 뒤, 자료형을 다 지워주면 쉽게 생성자호출을 할 수 있따.
my) 생성자의 파라미터에 Model타입에 직접 값을 입력해주는 것이 아니라, 생성자의 변수명과 똑같은 변수를 선언한 뒤, 입력받아서 변수에 넣고,
생성자의 파라미터를 활용해서 자료형만 지워주면, 바로 대입하는 식을 만들 수 있다.
students[i] = new Student(name,age, height, weight, studentID, grade, gPA);
3. 출력도 for문을 써서 show()로 출력해준다.
for(int i = 0; i < number ; i++) {
students[i].show();
}
4. 출력값을 보자.
총 몇명의 학생이 존재합니까?(배열수) : 3
학생의 이름을 입력하세요 : 조재성
학생의 나이를 입력하세요 : 20
학생의 키를 입력하세요 : 19
-----------------------------
학생 이름 : 조재성
학생 나이 : 20
학생 키 : 19
'Java > 기초 튜토리얼' 카테고리의 다른 글
17. final 키워드 [ Tutorial17 ] (0) | 2018.02.21 |
---|---|
16. 추상(Abstract) [Tutorial16] (0) | 2018.02.21 |
14. 클래스 ( priavte 필드->public get( )/set( ) + 생성자 / Node클래스로 중앙좌표 구하기 ) [ Tutorial14 ] (0) | 2018.02.20 |
13. 다차원 배열 - 2차원 배열 (2차원배열에 랜덤정수 넣고 출력) [ Tutorial 13] (0) | 2018.02.20 |
12. 배열(Array) (입력받은 배열의 최대값/ 100개의 랜덤 정수의 평균) [ Tutorial12 ] (0) | 2018.02.19 |