객체가 가지는 속성을 가지고 객체와 관련된 기능을 구현할 수 있다.
클래스 내부에서 멤버 변수를 사용하여 클래스 기능을 구현한 것을 '멤버 함수(member function)' 또는 '메서드(method)'라고 한다.
함수 : 독립적으로 존재
클래스 : 클래스 내부에 종속
항상 표준 명명 규칙을 따라야 한다.
이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는 게 최우선
그다음 목표는 개발자 커뮤니티에서 널리 받아들여지는 이름 사용(긴 이름은 피하자!)
모든 메서드는 각각 자신의 소임을 다해야 한다.
메서드가 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다.
매개변수는 4개 이하가 좋다. 4개가 넘어가면 매개변수를 전부 기억하기가 쉽지 않다.
사용자가 매개변수 순서를 기억하기 어려울뿐더러, 실수로 순서를 바꿔 입력해도 그대로 컴파일되고 실행된다. 다만 오류가 날 수 있다.
enum을 쓰게되면 코드를 읽고 쓰는게 더 용이하다.
메서드를 같은 이름으로 파라미터 타입만 다르게 정의하는 것이 다중 정의다.
다중 정의가 혼동을 일으킬 우려가 있으니 메서드 이름을 다르게 지어주는 것으로 대체하는것이 좋다.
null을 반환해버리면 반환된 객체가 null인지 매번 체크를 해줘야 한다.
Optional은 특정 조건에서 반환할 값이 없을 때 null 대신 래퍼로 감싸는 래퍼클래스이다.
메서드의 결과를 알 수 없으며, 클라이언트가 이 상황을 특별하게 처리해야 할때 Optional를 반환하게 하면 된다.
래퍼 클래스란?
8개의 기본 타입에 해당하는 데이터를 객체로 표현하기 위해 포장해주는 클래스라고 한다.
Optional은 nullPointerException으로부터 조금 더 자유로워지기 위해서 나온 타입이다.
따라서 Optional을 반환하는 메서드를 만드려면 절대 null을 반환하는 Optional을 리턴해서는 안된다.
그리고 Optional은 아무래도 래퍼하고 그걸 다시 풀고, 값이 없을 때 대체하는 값을 넣고 하는 등의 오버헤드가 있으니 성능 저하는 반드시 동반한다.
컬렉션, 스트림, 배열, 옵셔널같은 어떤 객체를 담을 수 있는 컨테이너타입은 절대 optional로 감싸면 안된다.
그럴바엔 빈 컬렉션, 배열을 반환하는 것이 훨씬 좋다.
박싱된 기본 타입(Integer, Boolean, Double, ...)을 담은 옵셔널을 반환하지 말라
이미 OptionalInt, OptionalLong, OptionalDouble이 있다.
기본타입이 들어있는 것을 반환할 때는 위의 메서드를 사용하도록 하자. 그러면 성능저하가 덜하다.
Optional을 컬렉션의 key, value, 배열의 원소로 사용하는게 적절한 상황은 없다.