추상 클래스에서 error 발생 처리 방법 - 2가지
1. 자식 클래스에서 추상 메서드를 재정의 ( O )
2. 자식 클래스에서 추상 메서드를 재정의 하지 않는 경우 : 자식 클래스 이름 앞에 abstract 키워드를 붙여야 함
<예시>
추상 클래스 Super 클래스 생성
=============================코드=============================
public abstract class Super { // 추상 클래스
int num1; // 인스턴스 멤버변수
int calc() { // 인스턴스 멤버메서드
return num1 + 100;
}
abstract void output(); // 추상 메서드
}
Super 추상 클래스를 상속 받을 Sub 클래스 생성

=============================코드=============================
public class Sub extends Super{
@Override
void output() {
System.out.println("추상 메서드 재정의 했어요!!");
}
}
메인메서드로 출력할 Super_01 클래스 생성

=============================코드=============================
public static void main(String[] args) {
// 추상 클래스는 객체 생성 불가능
// Super super = new Super();
Sub sub = new Sub();
sub.num1 = 35;
System.out.println("calc() 메서드 호출 >>> " + sub.calc());
sub.output(); // 추상메서드 재정의 호출
}
<예시>
추상클래스 Person을 생성하고 setter, getter를 이용해 사람의 정보를 출력하는 메서드를 만들어보자
=============================코드=============================
public abstract class Person {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 사람의 정보를 출력하는 메서드
abstract void getInfo(); // 추상 메서드
}
Person 추상 클래스를 상속 받을 Student 클래스 생성하고, Student 클래스에 멤버변수로 학번과 학과를 호출하자

=============================코드=============================
public class Student extends Person{
String hakbun;
String major;
public Student() { } // 기본 생성자
public Student(String hakbun, String name, String major) {
this.name = name;
this.hakbun = hakbun;
this.major = major;
} // 인자 생성자
// 부모 클래스의 추상 메서드를 재정의한 메서드
@Override
void getInfo() {
System.out.println("학생 학번 >>> " + hakbun);
System.out.println("학생 이름 >>> " + name);
System.out.println("학생 학과 >>> " + major);
} // getInfo() 메서드 end
}
마찬가지로 Person 추상 클래스를 상속 받을 Professor 클래스를 생성하고, 전공을 멤버변수로 호출하자

=============================코드=============================
public class Professor extends Person {
String major;
public Professor() { } // 기본 생성자
public Professor(String name, String major) {
this.name = name;
this.major = major;
} // 인자 생성자
// 부모 클래스의 추상 메서드를 재정의한 메서드
@Override
void getInfo() {
System.out.println(name + " 교수입니다.");
System.out.println(major + " 과목을 강의 중입니다.");
} // getInfo() 메서드 end
}
메인메서드로 출력할 Person_02 클래스를 생성

=============================코드=============================
public static void main(String[] args) {
Student student = new Student("2024_001", "홍길동", "컴퓨터공학과");
Professor professor = new Professor("세종대왕", "국문학과");
student.getInfo();
System.out.println();
professor.getInfo();
}

<예시>
스마트폰의 공통적인 기능을 추상 클래스로 생성하고 각 스마트폰 제조사별의 특성(회사 이름, 기계 이름, 색상, 크기, 무게, 가격)을 멤버변수로, 위 멤버변수를 담을 추상 메서드를 호출해보자
추상클래스로 만들 SmartPhone 클래스 생성
=============================코드=============================
public abstract class SmartPhone {
// 스마트폰의 공통적인 기능의 특성(속성)
String call = "전화";
String sns = "문자";
String search = "검색";
String game = "게임";
// 각각의 기계(단말기)들의 특성
String company, name, color, size, weight, price;
void purpose() {
System.out.println("사용목적 : " + call + " / " + sns + " / " + search + " / " + game);
}
// 각각의 단말기(기계)들의 spec
abstract void spec();
}
SmartPhone 추상 클래스를 상속받을 Galaxy 클래스 생성
public class Galaxy extends SmartPhone {
@Override
void spec() {
company = "삼성"; name = "Galaxy s24";
color = "화이트"; size = "22cm";
weight = "350g"; price = "140만원";
System.out.println("제조사 : " + company + " / 단말기명 : " + name + " / 색상 : " + color +
" / 규격 : " + size + " / 무게 : " + weight + " / 가격 : " + price);
}
}
SmartPhone 추상 클래스를 상속받을 IPhone 클래스 생성

=============================코드=============================
public class IPhone extends SmartPhone {
@Override
void spec() {
company = "애플"; name = "IPhone 14 pro";
color = "화이트"; size = "15cm";
weight = "200g"; price = "155만원";
System.out.println("제조사 : " + company + " / 단말기명 : " + name + " / 색상 : " + color +
" / 규격 : " + size + " / 무게 : " + weight + " / 가격 : " + price);
}
}
메인메서드로 출력할 SmartPhone_03 클래스를 생성
=============================코드=============================
public static void main(String[] args) {
Galaxy galaxy = new Galaxy();
IPhone iPhone = new IPhone();
galaxy.purpose();
galaxy.spec(); // 추상 메서드 재정의
System.out.println();
iPhone.purpose();
iPhone.spec(); // 추상 메서드 재정의
}
