Full Stack 교육 회고록

8/25 [자바 자료구조]- 트리 [자바]- 인터페이스

순두부 호랑이 2022. 8. 25. 13:58
728x90
SMALL

<오전수업>트리

package 트리;

public class Node {
	private int data; //실제 데이터 저장 공간
	private Node leftNode; // 왼쪽에 붙을 노드 참조값 저장
	private Node rightNode;// 오른쪽에 붙을 노드 참조값 저장
	
	//생성자 
	public Node(int data) {
		this.data = data;
		leftNode = null;
		rightNode = null;
	}
	
	//데이터부 값 가지고오기
	public int getData() {
		return data;
	}
	
	//왼쪽 연결 노드 설정
	public void setLeftNode(Node left) {
		this.leftNode = left;
	}
	
	//왼쪽 연결 노드 참조값 가지고오기
	public Node getLeftNode() {
		return leftNode;
	}
	
	//오른쪽 연결 노드 설정
	public void setRightNode(Node right) {
		this.rightNode = right;
	}
	
	//오른쪽 연결 노드 참조값 가지고오기
	public Node getRightNode() {
		return rightNode;
	}
}
package 트리;

public class Tree {
	private Node rootNode; // 근노드(root) 주소(참조)값 저장

	// 생성자
	public Tree() {
		rootNode = null;
	}
	
	//루트노드 구하는 메서드
	public Node getRootNode() {
		return rootNode;
	}

	// 이진탐색크리구성 메서드
	// 근노드값을 기준으로 새로운 값이 작으면 왼쪽, 크면 오른쪽
	public void addNode(int n) {
		if (rootNode == null) {// 루트가 비어있는 경우, 아무 노드도 없는 경우
			rootNode = new Node(n);
		} else {
			Node root = rootNode; // 최상위루트부터 시작~그 다음 비교해줘야는 노드 참조값 저장
			Node currentNode; // 포인터

			while (true) {
				currentNode = root;

				// 새로운 노드의 값이 비교하는(current)노드 값보다 작으면 -> 왼쪽
				if (n < root.getData()) {
					root = root.getLeftNode();

					// 왼쪽 자식노드가 비어있는 경우 -> 바로 새로운 노드 삽입
					if (root == null) {
						currentNode.setLeftNode(new Node(n));
						break; // 삽입끝 -> 반복문 종료
					}
				} else { // 새로운 노드의 값이 비교하는 (current)노드 값보다 큼 -> 오른쪽
					root = root.getRightNode();

					// 오른쪽 자식 노드가 비어있는 경우 -> 바로 새로운 노드 삽입
					if (root == null) {
						currentNode.setRightNode(new Node(n));
						break; // 삽입 끝 ->반복문 종료
					}
				}
			}
		}
	}

	public void print() { // 재귀함수 : 메서드 내에서 자기자신을 다시 호출
		System.out.println("출력!");
		print();
	}

	// 전위순회(root-left-right)
	public void preOrderTree(Node root) {
				//1.근노드 확인 - 그노드 data 출력
				//2.왼쪽노드주소확인(채워져있는지/null)
				//3-1 if 왼쪽 노드 주소가 null -> 더이상 왼쪽은 안봐도됨
				//3-2 if 왼쪽 노드 주소가 null이 아님
				// 	  왼쪽노드 data 출력
				//	  왼쪽노드주소화인(채워져있는지 / null)
		if(root!=null) {
			System.out.print(root.getData()+" "); //1.
			preOrderTree(root.getLeftNode());
			preOrderTree(root.getRightNode());
			}
	}
			//중위순회(left-root-right)
	public void inOrderTree(Node root) {
		if(root!=null) {
			inOrderTree(root.getLeftNode());
			System.out.println(root.getData()+" ");
			inOrderTree(root.getRightNode());
		}
	}
			//후위순회(left-right-root)
	public void postOrderTree(Node root) {
		if(root!=null) {
			postOrderTree(root.getLeftNode());
			inOrderTree(root.getRightNode());
			System.out.println(root.getData()+" "); // -> 4 2 1 3 6 8
		}
	}

		

	}
package 트리;

public class TreeMain {

	public static void main(String[] args) {
		
		Tree tree = new Tree();
		
		tree.addNode(4);
		tree.addNode(2);
		tree.addNode(3);
		tree.addNode(6);
		tree.addNode(1);
		tree.addNode(8);

		tree.preOrderTree(tree.getRootNode());
		tree.inOrderTree(tree.getRootNode());
		tree.postOrderTree(tree.getRootNode());
	}

}

<오후수업>

추상클래스 -월급 계산 프로그램

 

<parttimeemployee.java>

package Ex03;

public class Parttimeemployee extends Employee {
	
	private int workDay;
	
	public Parttimeemployee(String empno,String name,int pay, int workDay) {
		
		this.empno = empno;
		this.name = name;
		this.pay = pay;
		this.workDay = workDay;		
	}
	
	public int getMoneyPay() {
		return(pay*workDay);
	}
	
	public String print() {
		return empno + " : "+name + " : "+ pay;
	}

}

<RegualrEmployeeMain.java>

package Ex03;

public class RegularEmployeeMain {

	public static void main(String[] args) {
	 //객체를 생성하는 키워드 -> new
	 // new -> 키워드 사용과 동시에 생성자 메소드를 호출할 수 있는 기능!
	 RegularEmployee regular=new RegularEmployee("SMHRD001","홍길동",4000,400);
	 System.out.println(regular.print());
	 System.out.println(regular.getMoneyPay()+"만원");

	 TempEmployee temp = new TempEmployee("SMHRD002","채수민",3000);
	 System.out.println(temp.print());
	 System.out.println(temp.getMoneyPay()+"만원");
	 
	 Parttimeemployee part = new Parttimeemployee("SMHRD003", "김길동",10,100);
			 System.out.println(part.print());
	 System.out.println(part.getMoneyPay()+"만원");


	}

}

<RegularEmployee.java>

package Ex03;

public class RegularEmployee extends Employee{
	
	int bonus;
	
	public RegularEmployee(String empno, String name, int pay, int bonus) {
		this.empno = empno;
		this.name = name;
		this.pay = pay;
		this.bonus = bonus;
	}
	
	public int getMoneyPay() {
		return (pay+bonus)/12;
	}
	
}

<TempEmployee>

package Ex03;

public class TempEmployee extends Employee {
	
	public TempEmployee(String empno, String name, int pay) {
		//super(); -> 상속의 의미에서 부모가 되는 클래스를 지칭하는 키워드
		this.empno = empno;
		this.name = name;
		this.pay = pay;
	}
	
	
	public int getMoneyPay() {
		return pay/12;
	}
	

}

<Employee>

package Ex03;
//employee 추상클래스를 만드시오
public abstract class Employee {

	//모든 직급에 대하여 공통적인 내용을 관리할 수 있는 설계도!
	
	// protected로 지정된 필드들은 상속을 받은 관계에서만
	// 접급할 수 있는 필드가 된다!
	protected String empno;
	protected String name;
	protected int pay;
	
	// 급여 계산 할수 있는 메소드 -> 계급벼로 다른 계산식 사용!
	public abstract int getMoneyPay();
	
	//정보를 출력할 수 있는 메소드
	public String print() {
		return empno + " : "+name+ " : "+ pay;
	}

}

 

<<interface>>

 

interface(인터페이스)=사용설명서

- 클래스들이 구현해야 하는 공통되는 기능들을 미리 짖어

- 작업명세서 or 프로젝트 설계도

- 기능만 정의함으로써 구현 객체의 같은 동작 보장(구현강제)

- 인터페이스는 클래스가 아니다

 

public interface 인터페이스이름{

           public static final 자료형 변수명 =변수값;           ->final = 상수

           public abstract 반환자료형 메소드명(매개변수);

}

 

interface(인터페이스)구조

fimal인 인터페이스 안에서는 생략가능하다/ 일반적인 메소드를 만들기 위해서는 default가 필요하다


abstract class(추상클래스)

- 여러 클래스들 사이에 동일한 코드를 사용하고 싶은 경우(상속, 확장)

- 다양한 접근제어자를 사용하고 싶은 경우

- 객체의 상태를 저장하고 수정하고 싶은 경우(non-static, non-final)

 

interface(인터페이스)

- 특정 메소드(행위)를 구현하도록 하고 싶은 경우 - 강제구현, 규약

- 다중 구현상속을 사용하고 싶은 경우

- 관련 없는 클래스들이 특정 interface를 구현 받게 하고 싶은 경우

(cloneable,comparable,serializable)

 

<<계산 게임 프로그램>>

<OperatorGame.java>

package Ex01;

public interface OperatorGame {
	// 개발자가 원하는 대로 만드세요~ -> 추상 클래스
	// 개발자가 제공하는 방식대로 만드세요~ -> 인터페이스
	
	
	// 난수를 생성할 수 있는 기능
	public abstract int random();
	
	//문제를 제출할 수 있는 기능
	public abstract String getQuizMsg();
	
	// 정답을 체크할 수 있는 기능
	public abstract boolean checkAnswer(int ans);
	

}

<PlusGame.java>

package Ex01;

import java.util.Random;

public class PlusGame implements OperatorGame{
	
	int num1 =0;
	int num2 =0;

	@Override
	public int random() {
		Random rd = new Random();
		int num = rd.nextInt(10)+1;
		
		return num;
	}

	@Override
	public String getQuizMsg() {
		
		num1 = random(); //5
		num2 = random(); //3
	
		return num1+ " + " + num2 + " = ";//문제 출제
	}

	@Override
	public boolean checkAnswer(int ans) {
		
		if(ans == (num1 + num2)) {
			return true;
		}else {
			return false;	
		}
		
	}
	
	//extends -> 상속 받는 키워드
	//abstract -> 추상화에 대한 키워드
	//implements -> 인터페이스 구현에 대한 키워드
	
	//인터페이스가 가지고 있는 게임이라면 꼭 필요한 기능들을
	//만들고자 하는 게임 컨셉에 맞추어 완벽하게 구현!
	
	

}

<gameMain>

package Ex01;

import java.util.Scanner;

public class GameMain {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		// 1. PlusGame을 진행할 수 있도록 객체 생성하기
		PlusGame game1 = new PlusGame();
		PlusGame game2 = new PlusGame();
	
		int round = 1; // 게임라운드 체크를 위한 변수
		int cnt = 1; // 정답의 기회를 체크할 변수
		boolean check = true;
		
		System.out.println("----------사칙연산 게임 start!---------");
		// 문제를 제출할 수 있는 메소드를 호출하여 보여주고
		// 사용자는 답을 입력할 수 있도록 한다!
		while (round < 6) {
			String quiz = game1.getQuizMsg();
			System.out.print(round + "라운드 : " + quiz);
			int ans = sc.nextInt();
			check = game1.checkAnswer(ans);
			if (check == false) {
				while(cnt < 3) {
					
					System.out.println("틀렸습니다!");
					// 정답을 맞추지 못했을 경우
					// 3번의 기회를 주고, 문제는 틀린 문제 그대로 출제!
					System.out.print(round + "라운드 : " + quiz);
					ans = sc.nextInt();
					cnt++;
					
					check = game1.checkAnswer(ans);
					
					if(check == true) {
						break;
					}
				}
				
				System.out.println("다음으로 넘어갑니다!!");
				cnt = 1;
				
			} else {
				System.out.println("정답입니다!");
			}
			// 1라운드가 종료되면 다음 라운드로 증가!
			round++;
			System.out.println();
		} // while문 종료
	}
}

<SubGame>

package Ex01;

import java.util.Random;

public class SubGame implements OperatorGame{

	int num1 =0;
	int num2 =0;
	
	@Override
	public int random() {
		
		Random rd = new Random();
		int num =rd.nextInt(10)+1;
		return num;
	}

	@Override
	public String getQuizMsg() {
		
		num1 = random();
		num2 = random();
		
		// 더 큰 수를 판단하고 큰수에서 작은수를 뺄수 있도록 하자
		if(num2>num1) {
			int temp = num2;
			num2 = num1;
			num1 = temp;
		}
		
		return num1 + " - "+ num2 + " = ";
	}

	@Override
	public boolean checkAnswer(int ans) {
		
		if(ans == (num1-num2)) {
			return true;
		}else {
		return false;
	}

  }
}

 

 

<꼭 필요한 자격증>

정보처리기사 - 필기: cbt문제집만 돌려봐도 된다, 실기: 많이 어려움(자바+파이썬+c언어)

sqld, 빅데이터분석기사

728x90
LIST