Programming/JAVA

JAVA 5

우드의개발개발 2023. 2. 16. 09:36

 📖 연습문제 공학용 계산기 만들기 

public class Calculator {
  public int add(int a, int b) {
    return a + b;
  }

  public int minus(int a, int b) {
    return a - b;
  }

  public int multiply(int a, int b) {
    return a * b;
  }

  public double divide(int a, int b) {
    if (b == 0) {
      System.out.println("0은 입력할 수 없습니다.");
      return -1;
    }
    return (double)a/b;
  }
}

 

 📖 연습문제 공학용 계산기 만들기 V2 

public class ScientificCalculator extends Calculator {
  public int square(int a) {
    return (int)Math.pow(a, 2);
  }
}

 

 오버라이딩 

오버라이딩 의미

상속 시 특정 클래스의 구현부를 재정의 하는 것을 의미한다. 파라미터의 개수와 타입 그리고 리턴 타입은 변경할 수 없다. 오버라이딩을 하는 이유는 제공하는 기능을 사용자의 필요에 맞게 커스텀해서 구현하기 위함이다.

 

오버라이딩 사용 방법

public class Animal {
  public void makeSound() {
    System.out.println("The animal makes a sound");
  }
}

public class Dog extends Animal {
  @Override
  public void makeSound() {
    System.out.println("The dog barks");
  }
}

 

오버라이딩과 오버로딩의 차이

오버로딩은 같은 클래스 안에 메서드 이름은 같지만 파라미터 개수, 타입 그리고 리턴 타입 중 적어도 하나가 달라서 같은 이름의 함수이지만 다르게 사용할 수 있는 것을 의미한다.

public class Calculator {
  public int add(int a, int b) {
    return a + b;
  }

  public int add(int a, int b, int c) {
    return a + b + c;
  }

  public double add(double a, double b) {
    return a + b;
  }
}

 

 📖 연습문제 고양이 인형 만들기 

public class Cat {
  public void soundGenerally() {
    System.out.println("야옹");
  }

  public void soundCutely() {
    System.out.println("냥냥");
  }

  public void soundAngry() {
    System.out.println("크르릉");
  }
}

 

 📖 연습문제 고양이 인형 만들기 V2 

public class AngryCat extends Cat{
  public void soundAngry() {
    System.out.println("크르르르르르냐아아아앙");
  }
}

 

 📖 연습 문제) JSCODE 학교의 시험 채점기 

import java.util.Arrays;
import java.util.Scanner;

public class ExamProgram {

  private final int[] GradeTable = new int[3];
  public int index = -1;

  private int yearInput() {
    System.out.println("몇 기인지 입력해주세요.");
    Scanner sc = new Scanner(System.in);
    String num = sc.nextLine();
    int res = this.typeCheck(num);
    if (res == -1) {
      return gradeInput();
    }
    return res;
  }

  private int gradeInput() {
    Scanner sc = new Scanner(System.in);
    String num = sc.nextLine();
    int res = this.typeCheck(num);
    if (res == -1) {
      return gradeInput();
    }
    index += 1;
    GradeTable[index] = res;
    return res;
  }

  private void totalGradeInput() {
    System.out.println("HTML 과목 점수를 입력해주세요.");
    gradeInput();
    System.out.println("CSS 과목 점수를 입력해주세요.");
    gradeInput();
    System.out.println("Javascript 과목 점수를 입력해주세요.");
    gradeInput();
  }

  private int typeCheck(String num) {
    try {
      int flag = Integer.parseInt(num);
      if (flag < 0) {
        System.out.println("자연수를 입력해주세요.");
        return -1;
      }
      return flag;
    } catch (NumberFormatException e) {
      System.out.println("자연수를 입력해주세요.");
      return -1;
    }
  }

  private double getAverage() {
    int totalGrade = 0;
    for (int i = 0; i < index + 1; i++) {
      totalGrade += GradeTable[i];
    }
    return (double) totalGrade / (index + 1);
  }

  private int getMin(int[] gradeTable) {
    int min = Integer.MAX_VALUE;
    for (int grade : gradeTable) {
      if (min >= grade) {
        min = grade;
      }
    }
    return min;
  }

  private int getMid(int[] gradeTable) {
    Arrays.sort(gradeTable);
    int length = gradeTable.length;
    int midIndex = length / 2;
    return gradeTable[midIndex];
  }

  private int getMax(int[] gradeTable) {
    int max = Integer.MIN_VALUE;
    for (int grade : gradeTable) {
      if (max < grade) {
        max = grade;
      }
    }
    return max;
  }

  public void printPassOrFail(int number, int maxGrade, int midGrade, double averageScore) {
    if (maxGrade == 100 && midGrade == 100) {
      System.out.println("합격입니다.");
    } else if ((number == 1 || number == 2) && (averageScore >= 60)) {
      System.out.println("합격입니다.");
    } else if ((number == 3) && (averageScore >= 70)) {
      System.out.println("합격입니다.");
    } else {
      System.out.println("불합격입니다.");
    }
  }

  public void printMaxMinAverageGrade(int maxGrade, int minGrade, double average) {
    System.out.printf("전체 과목 중 최고점은 %d점입니다.\n", maxGrade);
    System.out.printf("전체 과목 중 최저점은 %d점입니다.\n", minGrade);
    if (average == (int) average) {
      System.out.printf("전체 과목의 평균은 %.1f입니다.", average);
    } else {
      System.out.printf("전체 과목의 평균은 %.13f입니다.", average);
    }
  }

  private void printFinalStatus(int number, double average) {
    int maxGrade = getMax(GradeTable);
    int midGrade = getMid(GradeTable);
    int minGrade = getMin(GradeTable);
    printPassOrFail(number, maxGrade, midGrade, average);
    printMaxMinAverageGrade(maxGrade, minGrade, average);
  }

  protected void execute() {
    int number = yearInput();
    totalGradeInput();
    double average = getAverage();
    printFinalStatus(number, average);
  }
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        ExamProgram ex = new ExamProgram();
        ex.execute();
    }
}

 

 📖 접근 제어자 

멤버변수에 한해서만 다루어 보기로 했다. 메서드까지 생각하면 머리 아프니까

private

가능

- 같은 클래스에서만 멤버 변수에 접근할 수 있다.

 

불가능

- 같은 패키지 안에 있는 다른 클래스는 접근할 수 없다.

- 같은 패키지 안에 있고 해당 패키지를 상속받는 클래스라도 멤버 변수에 접근할 수 없다.

 

default

가능

- 같은 패키지 내에 있는 클래스의 경우 멤버 변수에 접근할 수 있다.

- 같은 패키지 내 상속 받은 클래스도 멤버 변수에 접근할 수 있다.

 

불가능

- 다른 패키지에 있는 클래스는 멤버 변수가 선언된 클래스의 멤버 변수에 접근할 수 없다.

- 다른 패키지에 있고 멤버 변수가 선언된 클래스를 상속 받은 클래스라 할지라도 멤버 변수에 접근할 수 없다.

 

protected

가능

- 같은 패키지에 있는 다른 클래스에서 해당 멤버 변수에 접근할 수 있다.

- 다른 패키지에 있는 다른 클래스에서 해당 멤버 변수가 선언된 클래스를 상속 할 경우 사용할 수 있다.

 

불가능

- 다른 패키지에 있는 클래스에서 해당 멤버 변수에 접근할 경우에는 사용할 수 없다.

 

pubclic

가능

- 같은 프로젝트 안에서 모두 사용 가능

 

불가능

- 불가능은 없다.

 

접근제어자 참고

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

JAVA 6  (2) 2023.02.20
JAVA 4  (2) 2023.02.12
JAVA 3  (1) 2023.02.09
JAVA 2  (4) 2023.02.01
JAVA 1  (2) 2023.01.30