프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론
크게 선언형,명령형으로 나누며, 선언형은 함수형이라는 하위 집합을 갖는다
또한 명령형은 다시 객체지향,절차지향으로 나눈다
예시 코드
public class Calc {
public int getMax(List<int> nums) {
int result = 0;
for (int num : nums) {
result = Math.max(result, num);
}
return result;
}
}
위 코드에서 getMax
는 '숫자 리스트'만 받아서, 리스트 내의 정수 최댓값을 리턴한다
함수형 프로그래밍은 이와 같은 작은 ‘순수 함수’들을 블록처럼 쌓아 로직을 구현하고 ‘고차 함수’를 통해 재사용성을 높인 프로그래밍 패러다임이다
자바의 경우 jdk 1.8부터 함수형 프로그래밍 패러다임을 지원하기 위해 람다식, 생성자 레퍼런스, 메서드 레퍼런스를 도입했고 선언형 프로그래밍을 위해 스트림(stream) 같은 표준 API 등도 추가되었다.
getMax()
메소드가 순수 함수이다public interface Vehicle {
public void time();
}
public class Car implements Vehicle {
private String color;
@Override
public void time(){
//얼마나 걸리는지 시간에 대한 메서드
}
}
public class Ship implements Vehicle {
private String color;
@Override
public void time(){
//얼마나 걸리는지 시간에 대한 메서드
}
}
public class Vehicle{
private String door;
public void setDoor(String door){
this.door=door;
}
}
public class Car extends Vehicle{
private String wheel;
private String audio;
//--getter...setter...
}
Vehicle
에는 모든 탈것의 기본 사항만 포함Car
에게만 있는 내용은 바퀴와,음향장치 라고 가정한다Car
클래스는 Vehicle
클래스에는 없는 변수와 메소드를 가진다Car
클래스는 Vehicle
의 door
의 get,set 메소드를 사용할 수 있다오버로딩
& 오버라이딩
이 있다class Person {
public void eat(String a) {
System.out.println("I eat " + a);
}
public void eat(String a, String b) {
System.out.println("I eat " + a + " and " + b);
}
}
public class CalculateArea {
public static void main(String[] args) {
Person a = new Person();
a.eat("apple");
a.eat("tomato", "phodo");
}
}
/*
I eat apple
I eat tomato and phodo
*/
매개변수의 개수에 따라 다른 함수가 호출되는 것을 알 수 있다
class Animal {
public void bark() {
System.out.println("멍멍");
}
}
class Dog extends Animal {
@Override
public void bark() {
System.out.println("왈왈");
}
}
public class Main {
public static void main(String[] args) {
Dog d = new Dog();
d.bark();
}
}
/*
왈왈
*/
- 부모 클래스는 "멍멍"으로 짖게 해두었지만, 자식 클래스에서 "왈왈"로 짖게 바꾸었다
- 자식 클래스 기반으로 부모의 메서드가 재정의됨을 알 수 있다
참고 자료
객체지향 프로그래밍을 설계할 때는 SOLID 원칙. 즉 지켜야 하는 5가지 원칙이 있다
- "고차원 모듈은 저차원 모듈에 의존하면 안된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."
- "추상화된 것은 구체적인 것에 의존하면 안된다. 구체적인 것이 추상화된 것에 의존해야 한다."
- "자주 변경되는 구체(Concrete) 클래스에 의존하지 마라"
- "자신보다 변하기 쉬운 것에 의존하지 마라"
- 로버트 C 마틴