일반화(추상화)
하는 것재사용
을 고려하여 설계된 개념이다.추상화한 개념을 자바에서 실제 클래스로 만드는 과정
단, 추상 클래스는 인스턴스(객체)화
하여 사용할 수 없다. 단지 개념만 적용한 클래스로 추상 클래스를 상속한 자식 클래스를 사용한다.
추상 클래스는 미완성 설계도
라고 볼 수 있다. 즉, 완성되지 못한 상태로
남겨진 설계도이고 클래스가 미완성이라는 것은 미완성 메소드(추상 메소드)
를 포함하고 있다는 의미이다.
public abstract class 클래스명 {
// 나머지 클래스와 동일
}
// 추상클래스를 상속 받아 자식 클래스가 만든다.
public class 클래스명 extends 추상클래스 {
// 실체 클래스의 변수와 메소드...
}
추상 메소드란 자식 클래스에서 반드시 오버라이딩
해야만 사용할 수 있는 메소드를 의미한다.
자바에서 추상 메소드를 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함이다.
메소드를 굳이 미완성으로 만들어야 할까?
메소드를 미완성으로 남겨 놓는 이유는 다음과 같다. 메소드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서는 선언부만 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려주고, 실제 내용은 상속받는 클래스에서 구현하도록 비워 두는 것이다.
abstract 반환타입 메소드이름();
// 1-1
public abstract class Bank {
// 멤버변수
String name;
String account;
int balance;
// 기본 생성자
public Bank() {
// super // 부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는데 사용하는 참조 변수
// 이와 마찬가지로 부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같을 경우
// super 키워드를 사용하여 구별 가능
// 이렇게 자바에서는 super 참조 변수를 사용하여 부모 클래스의 멤버에 접근할 수 있습니다.
super(); // this() 메소드가 같은 클래스의 다른 생성자를 호출할 때 사용된다면,
// super() 메소드는 부모 클래스의 생성자를 호출할 때 사용한다.
}
// 매개변수 생성자
public Bank(String name, String account, int balance) {
super();
this.name = name;
this.account = account;
this.balance = balance;
}
// 메소드
// 입금
public void in() {
System.out.println("--money deposit--");
}
// 출금
public void out() {
System.out.println("--money withdraw");
}
// 추상메소드
// 적금
public abstract void saving();
// 적금 해지
public abstract void cancel();
// 정보 출력
public void getInfo() {
System.out.printf("name : %s\n", name);
System.out.printf("account : %s\n", account);
System.out.printf("balance : %d\n", balance);
}
}
// 1-2
public class MyBank extends Bank{
public MyBank(String name, String account, int balance) {
super(name, account, balance);
}
@Override
public void saving() {
System.out.println("--money saving");
}
@Override
public void cancel() {
System.out.println("--money saving cancel--");
}
}
// 1-3
public class BankExam {
public static void main(String[] args) {
MyBank b = new MyBank("", "", 0);
b.in();
b.out();
b.saving();
b.cancel();
b.name = "안유진";
b.account = "114-574-514579";
b.balance = 3000000;
b.getInfo();
}
}
private
클래스 자신만 접근을 허용한다.
default
다른 패키지에 소속된 클래스 차단
protected
일반적으로 자식클레서만 허용하고 같은 패키지에서는 default와 같지만 다른 패키지에서는 자식클래스에서만 허용된다.
public
모든 곳에서 접근 허용
// 1-1
class Human {
char type; // 성별 // 멤버 변수
public Human() {
this.type = 0;
}
// 초기화 생성자
public Human(char type) {
this.type = type;
}
// getter
public char getType() {
return type;
}
// setter
public void setType(char type) {
this.type = type;
}
}
/ 1-2
//extends를 통해 Human 클래스를 상속 받는다.
//즉, Human이 부모 클래스가 되고 Teacher는 자식 클래스가 된다.
public class Teacher extends Human {
// 멤버 변수
String className;
String name;
int age;
// 생성자(기본 생성자)
public Teacher() {
className = "";
name = "";
age = 0;
}
// 생성자(초기화 생성자)
public Teacher(String className, char type, String name, int age) {
this.className = className;
this.name = name;
this.age = age;
// 상속한 부모의 멤버 변수 type 값을 설정한다.
this.type = type;
}
// setter 메소드
public void setClassName(String className) {
this.className = className;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
// setType()은 부모가 가지고 있으므로 정의하지 않는다.
// getter 메소드
public String getClassName() {
return className;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
// getType()은 부모가 가지고 있으므로 정의하지 않는다.
// print 메소드
public void print() {
System.out.println("============ 나의 선생님 정보 =============");
System.out.println(className + "입니다.");
System.out.println("이름은 " + name + "입니다.");
System.out.println("성별은" + type + "입니다.");
System.out.println("나이는 " + age + "입니다.");
System.out.println("=====================================");
}
}
// 1-3
// extends를 통해 Human 클래스를 상속 받는다.
// 즉, Human이 부모 클래스가 되고 Student는 자식 클래스가 된다.
public class Student extends Human {
// 멤버 변수
String className;
String name;
// age, score 멤버 변수 추가
int age;
int score;
// 생성자(기본 생성자)
public Student() {
className = "";
name = "";
// 초기화 추가
age = 0;
score = 0;
}
// 생성자(초기화 생성자)
public Student(String className, char type, String name, int age, int score) {
this.className = className;
this.name = name;
// 초기화 추가
this.age = age;
this.score = score;
// 상속한 부모의 멤버 변수 type 값을 설정한다.
this.type = type;
}
// setter 메소드
public void setClassName(String className) {
this.className = className;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setScore(int score) {
this.score = score;
}
// setType()은 부모가 가지고 있으므로 정의하지 않는다.
// getter 메소드
public String getClassName() {
return this.className;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public int getScore() {
return this.score;
}
// getType()은 부모가 가지고 있으므로 정의하지 않는다.
// print 메소드
public void print() {
System.out.println("============ 나의 학생 정보 =============");
System.out.println(className + "입니다.");
System.out.println("이름은 " + name + "입니다.");
System.out.println("성별은 " + type + "입니다.");
System.out.println("나이는 " + age + "입니다.");
System.out.println("점수는 " + score + "점 입니다.");
System.out.println("=====================================");
}
}
// 1-4
public class Aschool {
public static void main(String[] args) {
// Teacher 클래스 객체 생성 및 테스트
Teacher te = new Teacher("컴퓨터 공학과", '남', "홍길동", 40);
te.print();
System.out.println("\n");
// Student 클래스 객체 생성 및 테스트
Student st = new Student("컴퓨터 공학과", '남', "김유신", 16, 90);
st.print();
// Teacher setter/getter 테스트
System.out.println("\n");
te.setClassName("디자인 공학과");
te.setName("김유리");
te.setAge(30);
te.setType('여');
System.out.println("학과 : " + te.getClassName());
System.out.println("이름 : " + te.getName());
System.out.println("나이 : " + te.getAge());
System.out.println("성별 : " + te.getType());
// Student setter/getter 테스트
System.out.println("\n");
st.setClassName("디자인 공학과");
st.setName("김남수");
st.setAge(20);
st.setScore(90);
st.setType('남');
System.out.println("학과 : " + st.getClassName());
System.out.println("이름 : " + st.getName());
System.out.println("나이 : " + st.getAge());
System.out.println("점수 : " + st.getScore());
System.out.println("성별 : " + st.getType());
}
}
HomeWork부분은 day가 지날 수록 추가 예정!!!