접근제한자를 배우진 않았지만 그 전에 각 변수에 private 지정하는 법과 get,set 메소드를 통해 해당 변수에 쉽게 접근하는 방법을 배워보겠다. 이런 형태를 캡슐화 라고 한다.
한 눈에 보기에 복잡하고 긴 코드 처럼 보이지만 일일이 손으로 치지 않고 생성할 수 있는 단축어가 있다.
<Person.java>
package Private;
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;
}
}
private String name;
private int age;
private int height;
private int weight;
먼저 각 변수에 private 제한자를 지정한다. 해당 변수에 접근을 하기 위해서 마우스 오른쪽 클릭 - Source - ... or Alt + Shift + S - Generate Getters and Setters 메뉴를 클릭. 이어 나타나는 창에서 체크 박스를 모두 체크(select All)하고 하단에 있는 Generate 버튼을 클릭하면 끝!
초기화는 Shift + S - Generate Constructor using Fileds 메뉴를 클릭해서 전체 변수를 체크하고 OK 누르면 끝!
위에서 캡슐화가 끝났다. 위에서 정의한 Person 클래스를 가지고 상속(extends)을 배워보도록 하겠다. 부모 클래스를 만들어 놓으면 상속을 받아 자식 클래스에서 부모가 갖고 있는 변수나 메소드를 사용할 수 있다. 이것을 상속이라고 부른다. 추가해서 자신의 것처럼 사용할 수 있다. 위의 클래스 파일을 만들어 놓고 시작을 하자.
<Studen.java>
package Private;
public class Student extends Person {
private String studentID;
private int grade;
private double GPA;
public String getStudentID() {
return studentID;
}
public void setStudentID(String studentID) {
this.studentID = studentID;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public double getGPA() {
return GPA;
}
public void setGPA(double gPA) {
GPA = gPA;
}
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;
}
public void show() {
System.out.println("학생 이름 : " + getName());
System.out.print(" 학생 나이 : " + getAge());
System.out.print(" 학생 키 : " + getHeight());
System.out.print(" 학생 몸무게 : " + getWeight());
System.out.print(" 학 번 : " + getStudentID());
System.out.print(" 학 년 : " + getGrade());
System.out.println(" 학 점 : " + getGPA());
}
}
student 클래스를 만들고 클래스명 옆에 상속의 예약어 extends를 사용해 부모 클래스의 이름을 입력해 상속을 받으면 끝이다! 추가하고 싶은 변수를 추가한다. 마찬가지로 접근제한을 두고 싶다면 private를 이용해서 캡슐화를 시키고, 위에서 한 것처럼 get, set 메소드 생성과 초기화를 한다. 명심해야 하는 것은 초기화를 하기 전에 먼저 상속을 받아야 한다는 점!! 가장 먼저 하는 게 헷깔리지 않아서 좋다.
지금까지는 초기화만 해주었으니까 Main에서 불러낼 메소드를 만들어준다. 그게 바로 가장 아래 있는 블록인 public void show() 이 부분이다. 여기서 public은 private와는 반대로 어디서든 접근이 가능한 접근제한자이다. 다른 클래스에서도 접근이 가능하다!
사용할 때는 getName() 이런식으로 getXXX 메소드를 호출해서 출력해주면 된다.
<Teacher.java>
package Private;
public class Teacher extends Person {
private String teacherID;
private int pay;
private int year;
public String getTeacherID() {
return teacherID;
}
public void setTeacherID(String teacherID) {
this.teacherID = teacherID;
}
public int getPay() {
return pay;
}
public void setPay(int pay) {
this.pay = pay;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public Teacher(String name, int age, int height, int weight, String teacherID, int pay, int year) {
super(name, age, height, weight); //초기화 시켜줘야 됨
this.teacherID = teacherID;
this.pay = pay;
this.year = year;
}
public void show() {
System.out.println("교사 이름 : " + getName());
System.out.print(" 교사 나이 : " + getAge());
System.out.print(" 교사 키 : " + getHeight());
System.out.print(" 교사 몸무게 : " + getWeight());
System.out.print(" 교 번 : " + getTeacherID());
System.out.print(" 월 급 : " + getPay());
System.out.println(" 년 차 : " + getYear());
}
}
<Main.java>
package Private;
public class Main {
public static void main(String[] args) {
Student st1 = new Student("홍길동", 20, 175, 67, "21001", 1, 4.5);
Teacher tr1 = new Teacher("이순신", 42, 177, 70, "20142", 1000000, 15);
st1.show();
tr1.show();
}
}
Main에서 인자를 던져주고 각 show메소드를 이용해서 출력한다. 단, 메소드에 지정된 순서대로 입력을 해주어야 한다.
<Main에서 입력 받아서 출력하기>
package Private;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("몇 명을 입력하실 건가요?");
int num = sc.nextInt();
Student[] students = new Student[num];
System.out.println("순서대로 이름/나이/키/몸무게/학번/학년/학점을 입력하세요.");
//입력
for(int i=0; i<num; i++) {
System.out.print("이름 : ");
String name = sc.next();
System.out.print("나이 : ");
int age = sc.nextInt();
System.out.print("키 : ");
int height = sc.nextInt();
System.out.print("몸무게 : ");
int weight = sc.nextInt();
System.out.print("학번 : ");
String studentID = sc.next();
System.out.print("학년 : ");
int grade = sc.nextInt();
System.out.print("학점 : ");
double gPA = sc.nextDouble();
students[i] = new Student(name, age, height, weight, studentID, grade, gpa);
}
//출력
for(int i=0; i<num; i++) {
students[i].show();
}
}
}
//10명의 학생을 입력해서 일차원 배열에 넣음 그리고 그걸 출력함
몇 명을 입력하실 건가요?1 순서대로 이름/나이/키/몸무게/학번/학년/학점을 입력하세요. 이름 : 홍길동 나이 : 20 키 : 170 몸무게 : 60 학번 : 21543 학년 : 1 학점 : 4.5 학생 이름 : 홍길동 학생 나이 : 20 학생 키 : 170 학생 몸무게 : 60 학 번 : 21543 학 년 : 1 학 점 : 4.5 |
여러명 입력을 받고 출력할 때는 for문을 사용하고, 배열 객체를 생성해서 인자값을 전달해준 뒤 출력한다.
'개발일지 > Java + Spring' 카테고리의 다른 글
[Java] 접근 제한자, final 예약어 (0) | 2021.09.29 |
---|---|
[Java] 상속(extends)의 정의 - overriding, Super() (0) | 2021.09.29 |
[Java] 생성자(Constructor), this() 생성자, 초기화 블록 (0) | 2021.09.29 |
[Java] 성적 입출력 - 클래스로 나누기, 소수점 n번째 자리 (0) | 2021.09.28 |
[Java] 메소드 정의와 다양한 종류 - 매개변수(parameter), 인자(Argument) (0) | 2021.09.27 |