JAVA

[JAVA] 공부 6일차! (2021-07-26)

HJ39 2021. 7. 28. 23:49

튜터링 6일 차!!

메서드 오버 라이딩 , 추상 메서드 , 인터페이스 

메서드 오버 라이딩

추상 메서드

추상 클래스

인터페이스

인터페이스 상속

인터페이스 와 추상클래스 비교

과제

 

 


 

 

  • 메서드 오버 라이딩

우선 오버 라이딩이란 상속관계에서만!! 나타난다.

자세한 내용은 https://hj39-develop.tistory.com/15?category=909926를 참조하면 된다.

오버 라이딩과 오버 로딩의 차이점이 작성되어있다.

오버 라이딩과 업 캐스팅의 우선순위를 정하자면 (오버 라이딩 > 업 캐스팅)으로 나타난다.

업 캐스팅된 레퍼런스라도 메서드가 오버 라이딩되어있는 경우 오버 라이딩된 결과값이 출력된다.

 

 

 


 

 

  • 추상 메서드

선언이 되어있지만 구현이 되어있지 않는 메서드를 말한다.

abstract를 붙여서 선언한다.

public abstract String getName();
public abstract void setName(String s);

  • 추상 클래스

추상 클래스가 되는 조건은 2가지가 있다.

  1. 추상 메서드가 1개 이상인 클래스(클래스에 abstract를 붙어야 한다)
  2. 추상 메서드가 클래스 내부에 존재하지 않지만 abstract로 선언된 클래스
abstract class Calculator {
public abstract int add(int a, int b);
public abstract int subtract(int a, int b);
public abstract double average(int[] a);
}

 

 

 


 

 

  • 인터페이스

자바에서 배우는 새로운 개념이 등장했다. 

인터페이스는 클래스가 구현해야 할 메서드들이 선언되는 추상 형이다.

interface로 선언되며 내부에는 필드 선언이 불가능하다.

interface PhoneInterface { // 인터페이스 선언
	final int TIMEOUT = 10000; // 상수 필드 선언
	void sendCall(); // 추상 메소드
	void receiveCall(); // 추상 메소드
	default void printLogo() { // default 메소드
		System.out.println("** Phone **");
	}

  • 인터페이스 상속

특이하게도 interface -> class를 상속할 경우에는 implements를 사용하여 상속한다.

그 외의 경우 interface->interface , class -> interface 인 경우에는 extends를 사용한다.

interface PhoneInterface { // 인터페이스 선언
	final int TIMEOUT = 10000; // 상수 필드 선언
	void sendCall(); // 추상 메소드
	void receiveCall(); // 추상 메소드
	default void printLogo() { // default 메소드
		System.out.println("** Phone **");
	}
}
class SamsungPhone implements PhoneInterface { // 인터페이스 구현
	// PhoneInterface의 모든 메소드 구현
	@Override
	public void sendCall() {
		System.out.println("띠리리리링");
	}
	@Override
	public void receiveCall() {
		System.out.println("전화가 왔습니다.");
	}

  • 인터페이스 와 추상클래스 비교

 

 


 

 

  • 과제
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;

class Shape {
	Shape next; // 다음연결된 객체를 나타낸다

	public void draw() {
	}
}

class S_Line extends Shape {
	public void draw() {
		System.out.println("Line"); // 상속의 경우 buffer이용????
	}
}

class S_Rect extends Shape {
	public void draw() {
		System.out.println("Rect");
	}
}

class S_Circle extends Shape {
	public void draw() {
		System.out.println("Circle");

	}
}

public class UsingOverride {
	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		// 객체 생성
		Shape start = new Shape();
		Shape last = new Shape();
		Shape obj = new Shape();

		// 입력숫자 저장 배열
		int[] input_Num = new int[5];

		// System.out.println("1.Line 2.Circle 3. Rect");
		bw.write("1.Line 2.Circle 3.Rect\n");
		bw.flush();

		// 입력순서

		for (int i = 0; i < 5; i++) { // 메뉴중 하나 선택

			// int N = sc.nextInt(); // 순서입력
			int N = Integer.parseInt(br.readLine());

			if (N > 0 && N <= 3)
				input_Num[i] = N;

			else { // 1~3 을 입력하지 않은경우 입력할 때 까지 반복
				while (true) {
					bw.write("잘못 입력하셨습니다.\n");
					bw.flush(); // 버퍼를 비운다 (안할경우 출력이 안됨)
					// System.out.println("잘못입력셨습니다.");
					// N = sc.nextInt();
					N = Integer.parseInt(br.readLine());

					if (N >= 1 && N <= 3) { // 1~3 입력시 탈출
						input_Num[i] = N;
						break;
					}
				}
			}
		}

		// 첫번째 입력숫자 링크 연결
		switch (input_Num[0]) {
		case 1:
			start = new S_Line(); // Line 객체 연결
			last = start;
			break;
		case 2:
			start = new S_Circle(); // Circle 객체 연결
			last = start;
			break;
		case 3:
			start = new S_Rect(); // Rect 객체 연결
			last = start;
			break;
		}

		// 두,세번째 입력숫자 링크 연결
		for (int i = 1; i < 5; i++) {
			switch (input_Num[i]) {
			case 1:
				obj = new S_Line();
				last.next = obj; // Line 객체 연결
				last = obj;
				break;
			case 2:
				obj = new S_Circle();
				last.next = obj; // Circle 객체 연결
				last = obj;
				break;
			case 3:
				obj = new S_Rect();
				last.next = obj; // Rect 객체 연결
				last = obj;
				break;
			}
		}

		// 모든 도형 출력
		Shape p = start;
		while (p != null) {
			p.draw();
			p = p.next;
		}

		br.close();
		bw.close();
		sc.close();
	}
}

이번 과제는 문제를 이해하는 것이 관건이였다.

이번 과제는 2학년 1학기에 배운 자료구조를 떠올리며 코드를 구성했다. 

상당히 복합적인 문제였는데 업캐스팅과 오버라이딩의 개념과 자료구조의 연결리스트를 응용한 문제였다.

 

맨 위로

'JAVA' 카테고리의 다른 글

[JAVA] 튜터링 8일차!!(2021-07-30)  (0) 2021.08.03
[JAVA] 공부 7일차! (2021-07-28)  (0) 2021.07.29
[JAVA] 공부 5일차! (2021-07-23)  (0) 2021.07.24
[JAVA] 공부 4일차! (2021-07-21)  (0) 2021.07.22
[JAVA] 공부 3일! (2021-07-16)  (0) 2021.07.17