📖 연습문제 공학용 계산기 만들기
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
가능
- 같은 프로젝트 안에서 모두 사용 가능
불가능
- 불가능은 없다.