배운 것
1. getter 로 필드 통제권을 다른 객체한테 넘겨주지 말자.
아래와 같은 객체가 있다고 가정하자.
public class Person {
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
}
Person 이라는 객체의 age 가 25세 이상인지 판단하려면 어떻게 해야할까?
Person class 에 getAge 메서드를 만들고, Person을 사용하는 클래스에서 getAge 를 호출해서 사용해도 된다. 그러나 그렇게 사용하면
그렇게 된다면, private 으로 숨겨놓은 age 정보가 그대로 노출되는 것 과 다름없다. 그래서 getter로 모든 정보를 다른 객체에서 넘겨주는 것 보단 특정 값을 Person 객체에서 age 필드를 직접 관리하고 통제할 수 있도록 하는게 좋다.
public class Person {
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public boolean isOver25() {
return age >= 25;
}
}
2. 메서드 체이닝
여러 메소드를 이어서 호출하는 방식으로, 메소드 객체가 this를 반환하기때문에 여러 메소드를 순차적으로 선언하여 이용할 수 있다.
이런 문법 형식은, 코드가 간결해지는 장점이 있으나 메소드 체이닝이 길어지면 디버깅하기 어렵다는 단점이 있다.
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
public class MyCollection<T> {
private List<T> list;
public MyCollection(List<T> list) {
this.list = list;
}
//T타입으로부터 U타입으로 변환함.
//list를 function을 통해 U타입으로 변환시킨 후 모아진 newList만 리턴하는 함수
public <U> MyCollection<U> map(Function<T, U> function) {
List<U> newList = new ArrayList<>();
foreach(d -> newList.add(function.apply(d)));
return new MyCollection<>(newList);
}
public void foreach(Consumer<T> consumer) {
for(int i = 0; i < list.size(); i++) {
T data = list.get(i);
consumer.accept(data);
}
}
}
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
MyCollection <String> c1 = new MyCollection<>(Arrays.asList("A", "B", "C", "D", "E"));
//string 값이 들어오면 Integer로 바꿔주는 mapper역할
MyCollection <Integer> c2 = c1.map(String::length);
c2.foreach(System.out::println);
//위 코드를 메서드 체이닝을 이용하면 아래와 같이 나타낼 수 있다.
new MyCollection<>(Arrays.asList("A", "B", "C", "D", "E"))
.map(String::length)
.foreach(System.out::println);
}
}
Q. 메서드 체이닝이 간결하다는 장점이 있다고 하는데, 메서드 체이닝이 너무 길면 오히려 가독성이 떨어질 것 같다는 생각이 든다. 메서드 체이닝의 장점을 살릴 수 있는 메서드 개수(?)는 몇개가 적정선일까? (..물론 코드에 적정선같은건 없겠지만..그래도..)
3. null 대체 방법
- EMPTY 객체 사용
- Optional 사용
그 외 궁금증
1. 원시 타입과 참조 타입
처음 자바 배웠을 때에는 "원시 타입과 참조 타입을 구분해서 쓰네? 신기하다!" 라고 생각했는데.. 자바를 배우면 배울수록 "왜 원시타입과 참조타입을 나눠서 쓸까...어떤 이유에서 나누게 되었을까...?" 라는 생각이 계속든다...
원시타입은 실제 데이터를 저장하는 타입이고, 참조 타입은 메모리 번지 값을 통해 객체를 참조하는 타입인건 알겠으나, 자바 언어적 특성 자체(C++과 다르게 포인터를 제공하지않는 이유부터 시작해서..)를 몰라서 생기는 궁금증 같다는 생각이 든다. 찾아봐야겠다.
느낌 점
1. 자바를 여러번 깊게 파자!
그 동안 C++를 써왔고, 자바를 배운지는 얼마안됐다. 처음 자바를 배웠을 때에는 C++과 문법만 다를 뿐 많은 부분이 비슷하다고 느꼈다. 어제 / 오늘 자바 강의를 듣고 아주 큰 착각이었음을 깨닫게 되었다. 🥲 자바만의 언어적특성이 아주 다르다는걸 여실히 느꼈다. 자바 생태계를 잘 이해하고, 잘 활용하기위해서 자바 공부 시간을 더 투자해야겠다고 느꼈다. (아직까진 C++이 더 정겹다.)
'TIL > 2021' 카테고리의 다른 글
[TIL] 0811 Database 이것저것3 (0) | 2021.08.11 |
---|---|
[TIL] 0810 Database 이것저것2 (0) | 2021.08.10 |
[TIL] 0809 Database 이것저것1 (0) | 2021.08.09 |
[TIL] 0806 Java 이것저것 (0) | 2021.08.06 |
[TIL] 0802 Java command line 에서 컴파일 및 실행하기 (0) | 2021.08.02 |