포스코 2023-10-26

Giho Kim·2023년 10월 26일
0

포스코

목록 보기
3/6
  1. 추상화

자식 개별로 함수쓸꺼같은데 부모에 공통된것만 미리 선언해서 할때 사용

package abstractpractice;

import java.util.Scanner;

public class abstractpractice {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.nextLine();
		String t = sc.nextLine();
		Select P;
		
		Tr Q;
		P = new Select(s,t);
		Q = P.check();
		System.out.println(Q.cmp());
	}
}

abstract class Tr {
	public String s;
	public String t;
	
	public Tr() {}
	
	public Tr(String s, String t) {
		this.s = s;
		this.t = t;
	}
	
	public abstract int cmp();
}

class Strcmp extends Tr {
	public Strcmp(String s, String t) {
		super(s, t);
	}
	
	public int cmp() {
		return this.s.compareTo(this.t);
	}
}

class Numcmp extends Tr {
	double a, b; int result;
	
	public Numcmp(String s, String t) {
		super(s, t);
	}

	public int cmp() {
		a = Double.parseDouble(this.s);
		b = Double.parseDouble(this.t);
		if (a > b) result = 1;
		else if (a < b) result = -1;
		else result = 0;
		return result;
	}
}

class Select {
	
	String s;
	String t;
	
	public Select(String s, String t) {
		this.s = s;
		this.t = t;
	}
	
	public Tr check () {
		char neg_sign = '-';
		char s_first_val = this.s.charAt(0);
		char t_first_val = this.t.charAt(0);
		int i = 0;
		int j = 0;
		
		if (s_first_val == neg_sign) {
			i = 1;
		}
		
		if (t_first_val == neg_sign) {
			j = 1;
		}
		
		for (int k = i; k < this.s.length(); k++) {
			char val = this.s.charAt(i);
			char point = '.';
			
			if ((val == point) | (Character.isDigit(val))) {
				continue;
			}
			
			else {
				return new Strcmp(this.s, this.t);
			}
		}
		
		for (int x = j; x < this.t.length(); x++) {
			char val = this.t.charAt(x);
			char point = '.';
			
			if ((val == point) | (Character.isDigit(val))) {
				continue;
			}
			
			else {
				return new Strcmp(this.s, this.t);
			}
		}
		
		return new Numcmp(this.s, this.t);
	}
}

보면 Tr class에 abstract cmp 함수 만들어놈 (근데 아무것도 안들어가있음)
그걸 자식노드에서 함수 정의함
Select는 개별 클래스임 --> 자식아님 --> 근데 check return value가 Tr의 자식임

P = new Select(s,t);
Tr Q = P.check();

이게 왜 업캐스팅이냐면 P는 select(개별 클래스)임 근데 check함수 return value가 Tr의 자식노드임
그러니깐 Tr Q로 업캐스팅 해준거임

다운 캐스팅은 무엇이냐 --> 다운 캐스팅은 부모에서 자식으로 접근하는거임
Tr P = new Select(s,t); > 부모 <= 자식 - 업캐스팅
Tr Q = ((Select)P).check(); 부모 <= ((자식)부모).자식함수()

내부 클래스는 무조건 static

profile
취준돌이 개발자 김기호

0개의 댓글