콘텐츠로 이동

2021 02 09

2021-02-09

자동차 경주 피드백

  • 변수명은 객체 입장에서 생각해보자 - number(int randomNumber) 파라미터가 randomNumber로 표시되야 하는가?
  • JAVA는 기본 가변, final 넣어줘야 불변
  • 클래스 변수의 장/단점은? - 장점: 메모리의 효율적 사용, 빠르다 - 단점: 프로그램 종료 시점까지 메모리에 할당되어 있음, 디버깅 힘듦, 덜 객체지향 적임
  • 언제 static을 써야하지? - 보통 Utils, Helper 클래스 만드는데 사용 - 내 생각: 객체로 관리할 필요가 없다면, 즉 객체 내부에서 관리할 "상태"가 없다면 static을 사용해도 되지 않을까?
  • 인스턴스 변수의 수는 최소화 - 최대한 기존의 인스턴스 변수로 도출해보자
  • JAVA API를 찾아보는 습관을 갖자
  • Test fixture로 테스트 시나리오를 작성해보자

제이슨의 라이브 코딩

  • 생성자 vs 메서드 - 클래스에서 메서드 많아지는 것 X - 클래스에서 생성자 많아지는 것 O - 사용자에게 사용성을 증대시켜 주는 장치로 해석 가능
  • 원시값과 문자열을 포장하라 - Car 객체의 인스턴스 변수 중 하나인 name을 포장 - 포장한다는 것은 Name 클래스를 따로 빼서, 해당 클래스에서 Name에 관한 상태와 행동을 관리 - Name에 대한 validation을 Name 클래스에서 할 수 있음 - Name에 대한 test 코드를 쉽게 작성할 수 있음 - Name에 대한 책임을 Car에서 분리시킴 - 값 객체를 만들어 관리하자!
  • 불변 객체란? - [참고] - https://velog.io/@conatuseus/Java-Immutable-Object%EB%B6%88%EB%B3%80%EA%B0%9D%EC%B2%B4 - https://velog.io/@kyle/%EB%B6%88%EB%B3%80-%EA%B0%9D%EC%B2%B4%EB%9E%80-Java-Immutable-Object - https://sup2is.github.io/2020/01/29/java-immutable-object-with-string.html - [정의] - heap 영역에서 해당 객체가 가리키고 있는 데이터 자체의 변화가 불가능한 것 - 가리키고 있는 주소값 혹은 불변 객체를 통해 얻을 수 있는 값들의 힙 영역에 있는 데이터 그 자체가 변경되지 않는 것 - [정의 방법] 1. 원시 타입만 있는 경우 - final을 사용하고, setter를 작성하지 않는 것 2. 참조 변수가 일반 객체인 경우 - 참조 변수 역시 불변 객체로 만들 것 3. 참조 변수가 Array인 경우 - 생성자에서 배열의 복사본을 저장 - getter에서도 배열의 복사본을 반환 - 복사본을 저장/반환 하면서 외부와의 연결고리 단절 - 배열 복사는 깊은 복사로, 자바에서는 Object.clone(), Arrays.copyOf()를 사용할 수 있다 4. 참조 변수가 List인 경우 - 생성자에서 List의 복사본을 저장 - getter에서 값 추가/삭제가 불가능하도록 Collection의 unmodifiableList 반환 - 넘겨받은 로직 자체에서 추가/삭제를 지원하도록 List의 복사본을 반환하는 것도 가능 - 1급 객체의 개념을 적용하면 행동의 범위를 지정해 줄 수 있을 듯 - [TIP] - ORACLE 공식 문서: 메모리 걱정 보다 불변 객체가 주는 이점이 많다 - equals && hashcode 오버라이딩하여 내용이 같다면 같은 값을 반환하도록 하자 - Java의 final은 불변을 만드는 게 아니라, 재할당을 금지하는 것 - 자주 사용되는 불변 객체는 캐싱 가능! - 기존에 사용된 정보를 메모리에 저장해두었다가 다시 참조될 때 사용하는 기술 - 참고: https://woowacourse.github.io/javable/post/2020-06-24-caching-instance/
  • 1급 Collection이란? - [참고] - https://jojoldu.tistory.com/412 - [정의] - Collection을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다. - [장점] - 비즈니스에 종속적인 자료구조 - 필요한 조건으로만 생성할 수 있는 자료구조 생성 - 검증 로직 해당 클래스에서 해결 가능 - Collection의 불변성을 보장 - final은 오로지 재할당만을 금지, 자료구조의 데이터 추가/삭제는 못막음 - Collection의 값을 변경할 수 있는 메서드를 없앤 Collection을 만들어 주자 - 상태와 행위를 한 곳에서 관리 - 그저 자료구조가 List라면... - 같은 기능을 하는 메서드를 중복해서 생성할 수 있다 - 어플리케이션이 복잡하고 커질수록 관리가 힘들다 - 이름이 있는 Collection - 그저 변수명이 달랐던 List들에게 이젠 이름을 부여해 주자! - 이름이 생기면, 용어 사용과 검색이 용이해진다!

브라운의 개더타운

  • final List winners = new ArrayList<>(); - 인터페이스를 자료형으로 쓰면 프로그램은 유연해진다 - 객체의 실제 구현을 다른 것으로 바꾸고 싶으면 생성자 이름만 다른 클래스로 바꾸도록 지원
  • 일급 객체란? - [참고] - https://isooo.github.io/etc/2019/11/13/%EC%9D%BC%EA%B8%89%EA%B0%9D%EC%B2%B4.html - 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체 - 보통 함수에 매개변수로 넘기기, 수정하기, 변수에 대입하기와 같은 연산 지원시 일급 객체라 한다 - Java 8 부터는 함수를 일급 객체로 사용 가능 - 함수형 프로그래밍 도입으로 함수를 매개변수로 넘겨줄 수 있다!
public class HelloWorld{
    public static void main(String []args){
        final FpCalculatorService fpCalculatorService = new FpCalculatorService();
        System.out.println(fpCalculatorService.calculator((x, y) -> x - y, 10, 20));
        // -10 반환
    }
}

interface Calculation {
    int calculate(int x, int y);
}

class FpCalculatorService {
    public int calculator(final Calculation calculation, final int x, final int y) {
        return calculation.calculate(x, y);
    }
}
  • Main 메서드는 어디에? - Application을 만들어서 Main 메서드를 호출 - 이후 Controller에서 제어를 넘겨 수행 - Controller에서 Main 메서드를 쓰는 것은 오히려 Controller의 역할에 위배될 수도
  • Controller의 역할은? - 클라이언트의 요청 받을 시, 그 요청에 대해 실제 업무를 수행하는 모델 컴포넌트 호출 - 모델이 업무를 마치면, 그 결과를 뷰에게 전달 - 모델이나 뷰는 서로의 존재를 모르고, 변경을 외부로 알리고 수신하는 방법만 가진다. 컨트롤러가 이를 중재 - 모델이나 뷰의 변경을 모니터링 해야 한다.