The Debugging Chronicles : "코드의 미학"

추상 클래스 본문

JAVA/자바 수업 내용

추상 클래스

sweetseonah1004 2024. 7. 29. 19:27

자바의 추상화

 

자바 웹 개발을 하다보면 JAVA가 아닌 언어를 사용할 확률이 점점 높아집니다.

JAVA를 기반으로한 회사마다의 새로운 언어 or 프레임워크가 많다

 

그 회사에서만 사용하는 언어 혹은 기술이 있다

만약 JAVA만 공부하면, 다른 언어를 만났을 떄 ….. 어 안배워서 모른다,… 라는 이야기가 나오면 개발자 인생 끝….

 

세상 모든 JAVA기반 언어들이 공통으로 하는 모토 혹은 기준 같은게 있는데,

 

 

그게 바로 “추상화”개념을 반드시 가지고 있다는 점

 

그래서 웹 개발 책이나 인강을 보면 잘안나올 수도 있다, 당장 안쓰긴함

 

>>> 세상 모든 언어들이 이 “추상화”개념을 바탕으로 뭔가 한다는 점….

 

———————————————————————————

 

 추상화의 역사

 

네모 클래스, 원 클래스, 세모 클래스가 있다.

하트 클래스를 만드려고 한다

 

네모는  줌심점, 가로길이 세로길이, 넓이가 있다.

원은 중심점, 원주율, 반지름, 넓이가 있다.

세모는 중심점, 변의 길이, 넓이

 

하트 클래스를 만드려면???

  1. 카피하려고 기존의 것들을 살펴본다.
  2. 하트도  중심점, 넓이가 있다 - 하지만 내가 만드려는 클래스가 기존 클래스들의 하위가 아니라, 기존 클래스 급이라서 그렇다
  3. 복사해도 되지만 만약 멤버변수가 수십만개라면 복사가 불가능하다. - >복사 불가능
  4. 기존 클래스들의 상위 개념이 있구나!! 라는 생각이 도출….

== 기존 클래스들의 상위 개념

== 기존 클래스들에게 공통점이 있구나!!

  1. 형체 없이, 기존 클래스들의 공통점을 뽑아냄

가장 상위 개념인 중심점과 넓이가 있다. 공통적인것들을 

==> 추상 클래스 (기존 클래스들의 상위 클래스)

==> 형체가 없어서 객체화가 불가능하다

==> 클래스들을 정의하는데에 활용함

 

클래스들의 틀(추상 클래스) ——> 클래스 ———> 객체를 뽑아내려고

 

 ———————————————————————————

 

초기 JAVA 는 여러개의 국가에서 동시에 개발

 

네모   세모     —> 어 공통점이 있네  = > 뽑아내자

=> 추상 클래스 “abstract “

객체화 x 클래스들을 정의 (클래스들의 틀)

 

ex) 포켓몬 포켓몬 = new 포켓몬 ();

피카츄 클래스에서 피카츄 여러마리 생성 가능

메타몽 여러마리

동물 돌물

 

 

 

 ———————————————————————————

 

추상 클래스에서 

자기 자식들 클래스에게 

특정 메서드를 오버라이딩 하라고 ‘강제’하고 싶은 상황

 

오버라이딩을 강제하는 문법이 필요하다

>> 강제하는 개발자에게 좋은 의미

>>  실수를 줄여주니까!!

abstract  

 

 

 ———————————————————————————

[추상화]

 

abstract 을 붙인 클래스를 추상 클래스

abstract 을 붙인 메서드를 추상 메서드라고 한다

 

추상 클래스는 객체화가 안 되고 클래스들의 틀

추상 메서드는 기능 구현 안됨 

오버라이딩을 강제하는 역할!

 

 

 

 

package class02;

abstract class Shape { // abstract 추상 클래스
   private String name;
   protected double area;
   Shape(String name){
      this.name=name;
      this.area=0.0;
   }

   // 메서드는 쓰라고 만드는거라서,
   // public 공개정책을 사용
   abstract public void draw();
   // abstract이 붙은 메서드를
   // "추상 메서드"라 부른다.
   // "오버라이딩 강제"하는 역할!!!!!★
   // 기능의 내용이 필요없기때문에,
   // {} 메서드 바디가 필요없음!

   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public double getArea() {
      return area;
   }
   public void setArea(double area) {
      this.area = area;
   }
   @Override
   public String toString() {
      return this.name+"의 넓이 : "+this.area;
   }
}

class Rect extends Shape {
   int x;
   int y;
   Rect(int x,int y){
      super("네모"); ////////
      this.x=x;
      this.y=y;
      this.area=this.x*this.y;
   }
   @Override
   public void draw() {
      System.out.println("네모 그리기"); ////////
   }
}

class Circle extends Shape {
   private int radius;
   static final double PI=3.14;
   Circle(int radius){
      super("원");
      this.radius=radius;
      this.area=this.radius*this.radius*Circle.PI;
   }


   @Override
   public void draw() {
      System.out.println("동그라미 그리기");
      // 개발자가 실수로라도 빠뜨리는 일없이 구현할수있다!!!!!
   }

   public int getRadius() {
      return radius;
   }
   public void setRadius(int radius) {
      this.radius = radius;
   }



}

public class Test01 {
   public static void main(String[] args) {

      //Shape s=new Shape("모양");
      // 추상 클래스로는 객체화(인스턴스화) 할 수 없음!!!
      // 객체를 생성하려고 존재하는게 아니라,
      // 클래스들을 정의하려고 존재하기때문에!!!!!
      //  == 클래스들의 틀

      Circle c=new Circle(10);
      System.out.println(c);

















   }
}

 

 

package class05;

// 설계★
// 속성: 이름,레벨,공격력,...
// 메서드: Q(),W(),E(),R(),귀환(),...
abstract class Champ {
   private String name; // private 멤버변수
   private int level; // 속성,필드,attribute,property
   Champ(String name){ // 생성자 == 멤버변수 초기화
      this.name=name;
      this.level=3;
   }
   abstract public void Q(); // 메서드
   abstract public void W(); // 하위 클래스들아, 잊지말고 재정의해! (강제)
   public void B() { // 귀환
      System.out.println("집으로 돌아가기");
   }
   public String getName() { // getter, setter
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getLevel() {
      return level;
   }
   public void setLevel(int level) {
      this.level = level;
   }
   @Override
   public String toString() { // toString()
      return "Champ [name=" + name + ", level=" + level + "]";
   }
}
// 티모,아리,...
class Teemo extends Champ {

   Teemo() {
      super("티모");
   }
   @Override
   public void Q() {
      System.out.println("독침");
   }
   @Override
   public void W() {
      System.out.println("빨리가기");
   }
   
}
class Ari extends Champ {

   Ari() {
      super("아리");
   }
   @Override
   public void Q() {
      // 추상 메서드의 오버라이딩 강제 덕분에
      // 쉽고 빠르게 잊지않고 메서드 재정의 가능!!!
      System.out.println("구슬");
   }
   @Override
   public void W() {
      System.out.println("불꽃");
   }
   
}



















public class Test01 {

}