public class Ex3 {
public static void main(String[] args) {
/*
* 생성자 오버로딩
* - 메서드 오버로딩과 동일
* - 생성자 호출 시 다양한 형태의 파라미터를 전달하여
* 객체를 다양하게 초기화하는 목적
* */
// 파라미터 생성자를 하나라도 정의할 경우
// 컴파일러에 의해 기본 생성자가 자동적으로 생성되지 않음
// 따라서, 기본 생성자를 호출해야 하는 경우 직접 기본 생성자를 정의!
Person2 p = new Person2();
p.showPersonInfo();
System.out.println("------------------------------------");
Person2 p2 = new Person2("홍길동", "901010-1234567");
p2.showPersonInfo();
System.out.println("-------------------------------------");
Person2 p3 = new Person2("한국", "홍길동", "901010-1234567");
p3.showPersonInfo();
}
}
class Person2 {
String nation;
String name;
String jumin;
public Person2() {
System.out.println("Person2() 생성자 호출됨!");
}
// 국가는 자동으로 "대한민국"으로 초기화하고
// 파라미터 2개(name, jumin)를 전달받아 초기화하는 생성자 정의
public Person2(String newName, String newJumin) {
System.out.println("Person2(String, String) 생성자 호출됨!");
nation = "대한민국";
name = newName;
jumin = newJumin;
}
// 파라미터 3개(nation, name, jumin)를 전달받아 초기화하는 생성자 정의
public Person2(String newNation, String newName, String newJumin) {
System.out.println("Person2(String, String, String) 생성자 호출됨!");
nation = newNation;
name = newName;
jumin = newJumin;
}
// 국가명, 이름, 주민번호를 출력하는 showPersonInfo() 메서드 정의
public void showPersonInfo() {
System.out.println("국가 : " + nation);
System.out.println("이름 : " + name);
System.out.println("주민번호 : " + jumin);
}
}
public class Ex2 {
public static void main(String[] args) {
/*
* 메서드 오버로딩(Method Overloading) = 메서드 다중 정의
* - 동일한 이름의 파라미터가 다른 메서드를 여러번 정의하는 것
* - 비슷한 기능을 수행하지만, 전달받은 데이터의 타입이 다른 경우
* 메서드 이름을 각각 따로 정의하지 않고, 동일한 이름으로
* 파라미터만으로 구분되는 메서드를 여러개 정의하는 것
* - 주의사항! 메서드 시그니쳐(이름, 리턴타입, 파라미터, 접근제한자) 중
* 파라미터를 제외한 나머지는 동일하게 정의함
*
* < 메서드 오버로딩 규칙(택 1) >
* 1. 메서드 파라미터의 데이터타입이 달라야 함
* 2. 메서드 파라미터의 갯수가 달라야 함
* */
NormalMethod nm = new NormalMethod();
nm.add(10,20);
// nm.add(1.0, 3.14); // double, double타입은 전달 불가
nm.addDouble(1.0, 3.14);
System.out.println("-----------------------------");
// 오버로딩이 적용된 메서드를 정의한 OverloadingMethod 인스턴스 생성
OverloadingMethod om = new OverloadingMethod();
om.add(20, 30); // add(int, int) 호출됨
om.add(1.23, 3.456); // add(double, double) 호출됨
om.add(1, 2, 3);
}
}
class OverloadingMethod {
// 오버로딩 기능을 활용하여 두 수를 전달받아 덧셈 결과를 출력하는 메서드 정의
// => 동일한 이름의 파라미터 타입만 서로 다른 메서드를 여러번 정의
// 1. 정수 2개를 전달받아 덧셈 수행
public void add(int num1, int num2) {
System.out.println("add(int, int) 호출됨");
System.out.println(num1 + num2);
}
// 2. 실수 2개를 전달받아 덧셈 수행
public void add(double num1, double num2) {
System.out.println("add(double, double) 호출됨");
System.out.println(num1 + num2);
}
// 주의! 파라미터의 변수명만 다를 경우 오버로딩 성립되지 않음! => 오류 발생
// public void add(int a, int b) {
// System.out.println("add(int, int) 호출됨");
// System.out.println(num1 + num2);
// }
// 주의! 리턴타입만 다를 경우 오버로딩 성립되지 않음! => 오류 발생
// public int add(int num1, int num2) {
// System.out.println("add(int, int) 호출됨!");
// return num1 + num2;
// }
// => 동일한 이름의 파라미터 타입만 서로 다른 메서드를 여러번 정의
// 3. 정수 3개를 전달받아 덧셈을 수행
public void add(int num1, int num2, int num3) {
System.out.println("add(int, int, int) 호출됨");
System.out.println(num1 + num2+ num3);
}
}
class NormalMethod{
// 두 수를 전달받아 덧셈 결과를 출력하는 메서드 정의
// 1. int형 정수 2개를 전달받을 경우
public void add(int num1, int num2) {
System.out.println(num1 + num2);
}
// 2. double형 실수 2개를 전달받을 경우
public void addDouble(double num1, double num2) {
System.out.println(num1 + num2);
}
// 일반적으로 메서드명도 식별자에 해당하므로 중복이 불가능함
// 따라서, add()와 addDouble() 메서드는 하는 일이 같지만
// 서로 다른 파라미터를 전달받으므로 다른 이름으로 정의했음
// => 메서드 정의 시 메서드명을 달리해야 하므로 호출 시 구분이 불편할 수 있음!
public void printInt(int num) {
System.out.println(num);
}
public void printString(String str) {
System.out.println(str);
}
}
public abstract class Figure {
protected int dot;
protected int area;
public Figure(final int dot, final int area) {
this.dot = dot;
this.area = area;
}
public abstract void display();
// getter
}
public class Triangle extends Figure {
public Triangle(final int dot, final int area) {
super(dot, area);
}
@Override
public void display() {
System.out.printf("넓이가 %d인 삼각형입니다.", area);
}
}
public enum Operator {
PLUS("+", (a, b) -> a + b),
MINUS("-", (a, b) -> a - b),
MULTIPLY("*", (a, b) -> a * b),
DIVIDE("/", (a, b) -> a / b);
private final String sign;
private final BiFunction<Long, Long, Long> bi;
Operator(String sign, BiFunction<Long, Long, Long> bi) {
this.sign = sign;
this.bi = bi;
}
public static long calculate(long a, long b, String sign) {
Operator operator = Arrays.stream(values())
.filter(v -> v.sign.equals(sign))
.findFirst()
.orElseThrow(IllegalArgumentException::new);
return operator.bi.apply(a, b);
}
}
public static void main(String[] args) {
String question = "4*7";
String[] values = question.split("");
long a = Long.parseLong(values[0]);
long b = Long.parseLong(values[2]);
long result = Operator.calculate(a, b, values[1]);
System.out.println(result); //28
}
참고자료
도서: 혼자 공부하는 자바 - 신용권
수업 예시 코드
블로그: https://blog.itcode.dev/posts/2021/08/08/encapulation
https://velog.io/@ljinsk3/%EB%8B%A4%ED%98%95%EC%84%B1