객체지향 프로그래밍이란
객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이며 복잡한 문제를 해결하기 위해 개발된 방법론입니다.
객체지향의 4가지 특징
캡슐화
객체의 정보를 외부에서 직접 접근하지 못하게 보호하는 개념입니다.
캡슐화를 통해 보안이 필요한 정보를 보호하고 필요한 경우에만 안전하게 접근할 수 있도록 합니다.
접근제어자와 Getter, Setter, 생성자를 적절히 사용하여 캡슐화를 할 수 있다. 물론 무분별하게 하는 것이 아닌 필요조건이 필요하다면 그 또한 설정해야 한다.
상속
부모(상위), 자식(하위) 로 바라보는 개념입니다.재사용성, 확장 이 가능합니다.extends 키워드를 사용해서 상속관계를 구현합니다.추상화
추상화란 불필요한 정보를 제거하고 본질적인 특징만 남기는 것을 의미합니다.다형성
다형성은 하나의 타입으로 여러 객체를 다룰 수 있는 객체지향의 특징입니다.
업캐스팅(자식 -> 부모), 다운캐스팅(부모 -> 자식), 다운캐스팅 사용 시에는 instanceof를 통해 휴먼에러를 줄일 수 있다.
+++ 오늘 특정 과제를 받았는데 제너릭을 사용하여 계산기를 만드는 코드작성이다. enum, generic, lambda, stream등 필수사용 조건이 좀 있는데 우선 제너릭을 사용한 코드를 작성하며 튜터님과 이야기한 부분과 처음 내가 작성한 코드와 비교를 해보겠다.
이부분이 내가 작성한 코드 중 일부분이다.
import java.util.ArrayList;
import java.util.List;
public class ArithmeticCalculator<T extends Number> {
private T firstNumber;
private T secondNumber;
...
public Number minus() {
if (this.firstNumber instanceof Double | this.secondNumber instanceof Double) {
return firstNumber.doubleValue() - secondNumber.doubleValue();
}
return (int) (firstNumber.doubleValue() - secondNumber.doubleValue());
}
...
위 코드와 같이 사칙연산 메서드가 총 4개 있었는데 그냥 calculate() 라는 함수로 내부 속성을 계산하는 형식으로 리팩토링을 하였다.
switch (this.sign) {
case '+' -> firstNumber.doubleValue() + secondNumber.doubleValue();
case '-' -> firstNumber.doubleValue() - secondNumber.doubleValue();
case '*' -> firstNumber.doubleValue() * secondNumber.doubleValue();
case '/' -> firstNumber.doubleValue() / secondNumber.doubleValue();
default -> throw new IllegalStateException("존재하지 않는 연산자입니다.");
};
핵심이라면 이 코드일텐데 Generic 타입 T를 직접 연산을 할 수는 없기 때문에 우선 doubleValue() 함수를 통해서 double Type으로 모두 계산 후 처음 입력받았던 수의 Type을 고려하여 추가적인 코드를 작성했다.
튜터님과 대화하다보니 입출력단과 기능을 분리하라고 하셨는데 생각해보니 저장 List 자체가 클래스의 내부 속성으로 있기 때문에 완전 분리는 하지 못했다.
(MVC 패턴을 고려하는 식으로 조금 더 리팩토링과 예외처리를 해야할 것 같다.)
+++ Enum
미리 정의된 상수들의 특별한 집합입니다. enum(enumeration) 의 뜻을 열거라는 뜻. 상수들을 열거한 것이 바로 enum입니다.
기본적으로는 상수와 비슷하지만 enum class 내부에 생성자 및 메서드를 만들 수 있기에 이를 활용하여 Enum에 포함되어 있는 값이 변한다 하더라도 외부 코드의 변경을 최소화 할 수 있기에 유지보수적인 측면에서 아주 좋다고 할 수 있을 것입니다.
public enum Operator {
PLUS('+'),
MINUS('-'),
MULTIPLY('*'),
DIVIDE('/');
private char sign;
Operator(char sign) {
this.sign = sign;
}
public char getSign() {
return this.sign;
}
public static boolean opContain(String str) {
for (Operator opt : Operator.values()) {
if (opt.name().equalsIgnoreCase(str)) {
return true;
}
}
return false;
}
}
오늘 작성했던 Enum 클래스는 위와 같습니다. 우선 열거 후 기존 클래스와 마찬가지로 생성자 및 getter가 있으며 opContain 메서드를 만들어서 외부에서 받을 String과 열거한 속성들의 name을 비교하여 true or false를 반환할 수 있게 하였습니다.