추상화(abstract)
객체를 만드는 과정에서 공통된 부분을 추출하여 일반화(추상화)하는 것
남 / 여를 추상화하여 공통부분을 찾아내 인간이라는 추상 개념을 만드는 것
이것또한 재사용성을 고려하여 설계된 개념이다.
추상 클래스
추상화한 개념을 실제 클래스로 만든 과정
단, 일반적으로 추상클래스는 인스턴스(객체)화하여 사용할 수 없다.
단지 개념만 적용한 클래스로 추상 클래스를 상속한 자식 클래스를 사용한다.
추상메서드
메서드를 추상화하여 메서드를 선언만 하고 실제 기능은 상속 받는 자식클래스에서 직접 구현하도록 하기위한 방법
즉, 동일한 메서드의 이름으로 강제화하여 상속받는 클래스는 무조건 추상메서드를 정의하고 구현 해야한다는 것을 의미함.
추상클래스 구조

추상 클래스 및 추상 메소드 정리
abstract 키워드를 앞에 쓰면 추상 메소드를 만들수 있다.
추상 메소드를 만들면 무조건 클래스는 추상 클래스로 만들어야 한다.
즉, 클래스에도 abstract를 앞에 써서 추상 클래스로 만든다.
추상 클래스는 객체화(인스턴스)할 수 없다(클래스를 객체로 생성 불가).
추상 메소드와 추상 클래스를 만드는 가장 큰 목적
클래스를 객체화하여 사용하지 않고 상속 받아 사용하도록 하기위한 것
즉, 건축을 예로 들어 참고할 기본 설계도를 미리 만들어 놓고 이것을 참조하여 실제 건축을 위한 설계도를 만들어 사용하는 방법
추상 메소드는 상속 받는 자식 클래스가 추상 메소드를 무조건 만들고 그 메소드의 내용은 각각의 자식 클래스에서 만들도록 하기위한 것
오버라이드(메소드 재정의)
자식 클래스에서 동일한 메소드를 재정의하여 사용하는 것
즉, 부모의 특정 메소드를 내 필요에따라 다시 정의하여 다른 기능으로 또는 다른 기능을 추가하여 사용하는 것.
재정의하면 부모 객체의 메소드를 자식 객체의 메소드로 대체해버린다
1) Practice
public abstract class Human { //추상 클래스
String type;
public Human() {
this.type = "남성";
}
public abstract void print();
}
//상속 받을 새로운 클래스파일 생성
public class Student extends Human {
public Student() {
super();
}
public void print() {
System.out.println("저는 인간입니다. 성별은 : "+this.type+"입니다.");
}
}
//상속 받을 새로운 클래스파일 생성
public class Teacher extends Human {
public Teacher(){
super();
}
public void print() {
System.out.println("저는 선생입니다. 성별은 : "+this.type+"입니다.");
}
}
//테스트 클래스파일 생성
public class Abstract_TestClass {
public static void main(String[] args) {
Student hu = new Student();
hu.print();
Teacher te = new Teacher();
te.print();
}
}
결과값

접근지정자
1) public : 모든 클래스에서 접근 가능
2) protected : 상속받은 자식 클래스만 접근 가능. 그 외 모든 곳에서 접근 불가
단, 예외적으로 동일한 패키지에서는 public 처럼 접근 허용. 하지만, 사용의 모호성으로 이와같이 사용하는 것은 비추천
3) private : 모든 클래스에서 접근 불가
4) default : 같은 패키지에서는 public 다른 패키지에서는 private. 즉, 상속과 관련이 없으며 패키지와 관련이 있다.


2) Practice
package Day12;
public abstract class AccessModifier {
//자신 이외에는 접근 불가
//다른 클래스에서 사용 불가하기 때문에 아래 gettype 메서드를 통해 사용한다.
private String type;
//상속받은 자식 클래스만 접근 가능
protected int age;
//모든 클래스에서 접근 가능
public String name;
//getter & setter 셋팅 필요
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public abstract void print(); //추상메서드
}
//테스트를 위한 새로운 상속받을 클래스파일 생성
public class ATestClass extends AccessModifier {
public ATestClass() {
super();
}
public void print() { //오버라이딩
System.out.println("저는 인간입니다. 성별은 : "+this.getType()+"입니다.");
System.out.println("저의 이름은 " + this.name + ", 저의 나이는 "+this.age);
}
}
//다른 패키지에서 테스트 클래스파일 생성
package review;
import Day12.ATestClass;
public class OtherClass {
public static void main(String[] args) {
ATestClass at = new ATestClass();
at.name = "홍길동"; //public는 접근 가능
// at.age = 30; //protected 접근 불가
at.setType("남자"); //private이지만 gettype을 통하여 사용
System.out.println(at.name);
at.print();
}
}
결과 값

절대 어제를 후회하지 마라. 인생은 오늘의 나 안에 있고, 내일은 스스로 만드는 것이다.
'IT Study > 따즈아 Java & Java 기초' 카테고리의 다른 글
Java - 인터페이스, static (0) | 2022.12.25 |
---|---|
Java - 형변환, 다형성 (0) | 2022.12.25 |
Java - 상속 (0) | 2022.12.25 |
Java - 오버로드/클래스 (0) | 2022.12.25 |
Java - 형변환/클래스/생성자 (0) | 2022.12.25 |
댓글