본문 바로가기
CLASS/JAVA

#9-2 / abstract(추상 클래스)

by hingu 2024. 5. 13.

abstract(추상 클래스) :코드 규격화를 위함(협업),가상 공간(메모리에 안잡힘)

- extends : 상속 클래스

- @Override : 상속된 메소드를 호출

- overloading : 상속받는 메소드 외에 추가로 메소드를 생성함(추상클래스에 선언하지 않은 메소드명 사용해야함)

 

로드방식

class b_class extends a_class{
@Override

메소드{}

}

 

👀 전체 정리 : https://dev-eunse.tistory.com/95

 

 

❗ 중요 주의사항 : 코드를 이미 진행시 해당 추상 메소드 이름 을 변경하면 상속받은 모든 클래스에 문제 발생!

⚡ abstract(추상 클래스) - 상속(협업시 주로 사용)
package oop2;
//외부 클래스 로드 및 abstract(추상 클래스)
public class oop_class2 {

	public static void main(String[] args) {
		oc2_box ob2 = new oc2_box(); //추상클래스 포함
		ob2.aaa();
		String result = ob2.bbb();
		System.out.println(result);
		ob2.ccc();
		
	}

}

//추상 클래스생성
abstract class ab_box1{
	public void aaa() {}; //추상 메소드
	public String bbb() {return null;}; //추상 메소드
	public void ccc() {}; //해당 추상 메소드는 사용하지 않음(꼭 사용하지 않아도 됨)
}

//일반 클래스
class oc2_box extends ab_box1{ //extends : 상속 클래스
	@Override //상속된 메소드를 호출
	public void aaa() {
		System.out.println("aaa");
		super.aaa();
	}
	
	@Override //상속된 메소드를 호출
	public String bbb() {
		String user = "강감찬";
		
		return user;
	}
	
	//overloading : 상속받는 메소드 외에 추가로 메소드를 생성함
	//추상클래스에 선언하지 않은 메소드명 사용해야함
	public void ccc() { 
		System.out.println("overloading 호출");
	}
}

 

예제2

package oop2;

import java.util.ArrayList;

public class oop_class3 {
	public static void main(String[] args) {
		new oc3_box().ab_method1("유관순"); //이 두개는 서로 다른 메소드
		new oc3_box().ab_method1(); //이 두개는 서로 다른 메소드
	}
}

class oc3_box extends ab1 {
	@Override
	public void ab_method1(String uid) {
		this.userid = uid;
		System.out.println(this.userid); //유관순 출력

		//scanner라이브러리 외부에서 가져옴 따로 선언x : 속도빨라짐
		System.out.println("사용자 이름을 입력하세요 : "); 
		String username = this.sc.next();
		System.out.println(username);
		this.sc.close();
		
		this.all = new ArrayList<String>();
		this.all.add("HTML");
		this.all.add("css");
		this.all.add("java");
		System.out.println(this.all); //[HTML, css, java]
	}
	
	@Override
	public void ab_method1() {
		System.out.println(this.level);//1 출력
	}
}


-외부 추상클래스 파일(프로젝트 초기 세팅 시 공용 파일로 주로 쓰임)

package oop2;

import java.util.List;
import java.util.Scanner;

//추상 클래스 선언 및 생성(공용)
public abstract class ab1 {
	String userid = null; //추상 클래스 전역변수
	Scanner sc = new Scanner(System.in); //추상 클래스에 라이브러리 호출
	List<String> all = null;
	final int level = 1; //전역변수 값이 고정으로 필요할 경우 선언 
	
	public void ab_method1() {};
	public void ab_method1(String uid) {};
	public void ab_method1(int level) {};
	
	/*
	 고정값으로 올려놓는 것들 : 사업자번호,회사명,회사정보..등 계속 나오는것(final)
	 */
}

 

⚡ 응용
package oop2;

import java.util.ArrayList;

//ab2.java 연계 = 추상클래스 응용편 
//추상 클래스를 이용하여 다음과 같이 결과가 나오도록 코드를 작성하시오
//사용자가 10개의 숫자를 입력합니다
//해당 숫자는 모두 클래스 배열에 저장되도록 합니다
//저장된 배열의 값을 모두 합한 결과값을 출력하시오
//단, 결과값 출력 내용은 , return 받아서 출력합니다.
public class oop_class4 {
	public static void main(String[] args) {
		new oc4_box().numSum();
	}
}

class oc4_box extends ab2 {
	@Override
	public void numSum() {
		int f;
		for(f=0; f<3; f++) {
			System.out.println("숫자를 입력하세요 : ");
			int no = this.sc.nextInt();
			this.numlist.add(no);
			this.sum += this.numlist.get(f);
		}
		this.sc.close();
		
		int dd = num();
		System.out.println(dd);
	}
	
	@Override
	public int num() {
		return super.num();
	}
}


-외부 추상클래스 파일

package oop2;
//응용편 - oop_class4.java 연계

import java.util.ArrayList;
import java.util.Scanner;

public abstract class ab2 {
	Scanner sc = new Scanner(System.in);
	ArrayList<Integer> numlist = new ArrayList<Integer>();

	int sum=0;
	public void numSum() {};
	public int num() {return sum;};
}

 

🔽 🔽 선생님

 super : 외부 class에서 로드하는 내용을 그대로 반영, abstract에 이미 제작되어있는 코드를 그대로 인식시킴

abstract 메소드 : 강제 사용 메소드

package oop2;

import java.util.ArrayList;
import java.util.List;

public class oop_class4 {
	public static void main(String[] args) {
		new oc4_box().numSum();
	}
}

class oc4_box extends ab2 {
        public oc4_box() {
            System.out.println("즉시실행 oc4_box");
        }

        @Override
        public void ab_box() {
            // abstract 메소드 : 필수 사용해야함,인자값 받아오는것도 가능
        }
	
	@Override
	public void numSum() {
		this.numlist = new ArrayList<Integer>();
		
		int f;
		for(f=0; f<3; f++) {
			System.out.println("숫자를 입력하세요 : ");
			this.user = this.sc.nextInt();
			this.numlist.add(this.user);
			this.sum += this.numlist.get(f); //총합계누적
		}
		this.sc.close();
		System.out.println(this.numlist);
		super.numSum(); //super란 abstract에 이미 제작되어있는 코드를 그대로 인식시킴
	}
	
	@Override
	public int cal() {
		return super.cal();
	}
	
	
}

 

package oop2;

import java.util.ArrayList;
import java.util.Scanner;
import java.util.List;

public abstract class ab2 {
	Scanner sc = new Scanner(System.in);
	List<Integer> numlist = null; //클래스 배열
	int sum=0; //총 합계
	int user; //sc에 변수 쓰라고 미리 등록
    
        public abstract void ab_box(); //필수사항 메소드
        //{}어디? 추가 필요한 메소드 있으면 이거 알아서 가져다 쓰세요 란 뜻
        //단점 : 적어놓은 이상 무조건 써야함
	
	//즉시실행:해당 메소드는 abstract 안에서만 작동(제일 우선 작동)
	public ab2() {System.out.println("즉시실행!");}; 
	
	public void numSum() {
		int result = this.cal(); //산술연산 작업 및 반복문..
		System.out.println(result);
	};
	
	public int cal() { //최종값 리턴
		return this.sum;
	};
}

 

date() 활용 , 실제 클래스 즉시실행~abstract 즉시실행 연결

extend는 하나의 추상클래스 또는 실제클래스를 로드 할 수 있다. 
실제class의 즉시실행(abstract 메소드와 형태 맞춰줘야함)
abstract 메소드 내용과 연결
package oop2;

public class oop_class6 {
	public static void main(String[] args) {
		oc6_box ob = new oc6_box(50);
		ob.abc();
	}
}

//extend는 하나의 추상클래스 또는 실제클래스를 로드 할 수 있다. 
class oc6_box extends ab3{
	//실제class의 즉시실행(abstract 메소드와 형태 맞춰줘야함)
	  //abstract 메소드 내용과 연결
	public oc6_box(int a) { 
		super(a); //(abstract 메소드 내용 : this.number = a;)
		//super : 외부 class에서 로드하는 내용을 그대로 반영
	}
	
	@Override
	public String product() {
		return null;
	}

	@Override
	public Integer basket() {
		return null;
	}

	
	
	public void abc() { //overloading 메소드
		System.out.println(number); //50출력
		
		//--현재시간 출력
		String to = this.today(); //abstract에 있는 return 메소드를 호출
		System.out.println(to); //return값 출력
	}
	
//	@Override //이미 abc에서 today 선언을 해서 굳이 들고올 필요 없음
//	public String today() {
//		return super.today();
//	}
}


// abstract 파일

package oop2;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public abstract class ab3 {
	int number = 0;
	public ab3(int a){ //즉시실행
		this.number = a;
	}
	public abstract String product();//필수 메소드(문자)
	public abstract Integer basket();//필수 메소드(숫자)
	public void pay() {
		
	};
	
	//--현재시간 출력
	public String today() {
		Date day = new Date(); //현 pc시간 로드
		
		//yyyy-MM-dd (yyyy : 연도, mm : 월, dd : 일)
		//HH(hh 12시간 기준,대문자는 24시간 기준) : 시간, mm : 분, ss : 초, 
		//a : AM,PM여부 / E : 요일
		
		//2024-05-13 출력
		SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
		
		//2024-05-13 03:38:36 오후 출력
		//SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a E요일");
		
		//Locale : 요일 어어셋 변경할 때 사용하는 라이브러리
		//SimpleDateFormat sim = new SimpleDateFormat("E",Locale.ENGLISH);
		
		//System.out.println(sim.format(day)); //2024-05-13
		
		return sim.format(day);
	}
}

 

'CLASS > JAVA' 카테고리의 다른 글

#10-1 / Interface  (0) 2024.05.14
#9-3 / class + class  (0) 2024.05.13
#9-1 / 배열에 해당 클래스를 로드하여 적용하는 방법(DTO),protected  (0) 2024.05.13
#8 / remind1  (0) 2024.05.10
#7-4 / foreach,List배열  (0) 2024.05.09