블로그

인프런 워밍업 스터디 클럽 2기 -백앤드 클린코드,테스트코드 2주차 발자국

https://www.inflearn.com/course/readable-code-%EC%9D%BD%EA%B8%B0%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EC%82%AC%EA%B3%A0%EB%B2%95/dashboard 2주는 너무 정신없이 호다닥 가버렸다 내 1주차 발자국때 미리 열심히 하자는 나의 다짐은... 흙그래도.. 또 나는 다음주는 열심히 하자는 꿈을 꾸지...적용하기에는 아직 버거웠다.. 숙제로 cafe machine 리팩토링해야했는데.. 일급클래스 나도 적용하고 싶었는데 할줄몰라서 슬펐다.. 그래도 같이 온보딩 스터디하시는 분이 리펙토링 숙제 코드 리뷰해주시면서 알려주셔서 이해가 가서 감사했당.. 강의는 허겁지겁 코드 따라쳐도 몬가 막상 내가 적용하기에는 너무 어렵더쿤...   4LS-회고법을 사용해보장!Liked (좋았던 점) 강의하면서 배우고 배웠던 것들을 적용할수있도록 리팩토링 숙제를 주셔서 유익했다.. 혼자서 해보는 실습 중요하지! 내가 잘 적용을 못했던것 뿐..Lacked (아쉬웠던 점)시간을 더 많이 투자해서 더 노력했어야하는데 아쉽다 ㅠ.ㅠ 다음주는 조금이라도 더 노력하는 내가 되었으면.. 햐그리고 까먹으니 계속 메모하면서 강의 듣기 ㅠㅠㅠㅠㅠLearned (배운 점)일급컬랙션 이름이 멋져보여서 다음에 내 프로젝트에 꼭 적용해보고 싶다 1- 상속과 조합상속 보다는 조합을 사용하자. 상속은 틀을 만들어 버려서 부모를 수정하면 자식들도 다 영향을 받는다. 부모와 자식과의 결합도가 높다. 2- Value Object, Entityvalue object 가 가져야하는 3가지- 불변성, 동등성,유효성 검증 entity는 식별자가 있고 valueObject는 식별자가 없지만 hashcode&equal을 사용해서 모든 필드들이 식별자 역할을 한다. Entitypublic class Member { private Long id; // 고유 식별자 private String name; }Value objectpublic class Address { private String city; private String street; private String zipcode; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Address address = (Address) o; return city.equals(address.city) && street.equals(address.street) && zipcode.equals(address.zipcode); } @Override public int hashCode() { return Objects.hash(city, street, zipcode); } } 3- 일급 컬랙션일급컬랙션은 list, set, map 이런 타입들의 추상화 도구로 사용한다 new로 2차 가공해서 해서 일급 컬랙션을 변경해도 이전의 컬래션에겐 영향이 없다.이번 리팩토링에선 실패했지만 다음에 리팩토링할때 꼭 적용해봐야지...Student 클래스public class Student { private final String name; private final int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Student{name='" + name + "', age=" + age + "}"; } }  StudentGroup 일급컬랙션 클래스import java.util.ArrayList; import java.util.Collections; import java.util.List; public class StudentGroup { private final List<Student> students; public StudentGroup(List<Student> students) { this.students = new ArrayList<>(students); // 불변성 유지 } public void addStudent(Student student) { this.students.add(student); // 학생 추가 } public List<Student> getStudents() { return Collections.unmodifiableList(students); // 불변 리스트 반환 } public double getAverageAge() { return students.stream() .mapToInt(Student::getAge) .average() .orElse(0.0); // 학생 나이의 평균 계산 } @Override public String toString() { return "StudentGroup{students=" + students + "}"; } } 4- Enum열거형 타입 상수의 직합- 상수에 대한 로직도 담을수있다. 여기에 설명도 넣을수 있다public enum Month { JANUARY("1월", 1), FEBRUARY("2월", 2), MARCH("3월", 3), APRIL("4월", 4), MAY("5월", 5), JUNE("6월", 6), JULY("7월", 7), AUGUST("8월", 8), SEPTEMBER("9월", 9), OCTOBER("10월", 10), NOVEMBER("11월", 11), DECEMBER("12월", 12); private final String description; // 월에 대한 설명 private final int order; // 월의 순서 Month(String description, int order) { this.description = description; this.order = order; } public String getDescription() { return description; } public int getOrder() { return order; // 월의 순서 반환 } // 주어진 숫자에 해당하는 월을 반환하는 메서드 public static Month valueOf(int order) { for (Month month : Month.values()) { if (month.getOrder() == order) { return month; } } throw new IllegalArgumentException("유효하지 않은 월 순서: " + order); } }이렇게 사용할수있다.. 신기한 코딩의 세계... io에서 1이 들어오면 if (input==1)이면 January 리턴하는게 아니라 이런식으로 하는게 아니라 return Month.valueOf(input)하면 January를 리턴한다!  5- 세션 6좋은 주석은 주석없이 설명이 가능한게 좋지만 어떤 이유로 방식을 결정하거나 그런 코드로는 알수없었던 필요한 디테일들은 주석으로 잘설명해두고 필요없는 주석은.. 지우기 (뜨끔)메서드 순서 -상태변경, 판별, 조회 순으로 메서드를 배치하고 public 은 위에 private은 밑에 배치한다.Longed for (앞으로 바라는 점)다음주 테스트코드 스터디가 아주 기대됩니당!! 

인프런온보딩리더블코드

인프런 워밍업 스터디 클럽 2기 -백앤드 클린코드,테스트코드 1주차 발자국

https://www.inflearn.com/course/readable-code-%EC%9D%BD%EA%B8%B0%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EC%82%AC%EA%B3%A0%EB%B2%951주차 진도는 readable 강의 세션 1~ 세션 4까지 였다.취직하면 유용할 리더블코드랑 테스트 코드 강의를 쿠폰 사용해서 할인받아서 살수있어서 쵝오! (뿌듯) 이 강의 를 들으면서 스터디에 참여할수있고 일석이조! 무엇보다 테스트코드 짜기 힘들어서 고민하고 있던 찰라여서 리더블코드 뒤에 배우는 테스트 코드 강의도 매우 기대된당! 실무에선 테스트 코드 짜는데 시간을 매우 많이 쓴다고 들었당.. 개발자 사회에 나가기 무서워 바들거리는 나약한 늙은 취준생..에겐 암튼 찰떡이당. 숙제도 화, 목 이렇게 두개 있어서 부지런히 해야했다! (하지만 부지런하지 못해 last minute에 허겁지겁 했지..)게으르고 가련한 취준생 에게 이렇게 숙제도 있어서 주워진 시간에 맞춰야하는 강의를 들어야 하는 스터디는 너무 좋은거 같아서 기쁘당! >_< 알려주신 분들께 감사!   4LS-회고법을 사용해보장!Liked (좋았던 점) 강사 선생님이 내어 주신 숙제를 통해 강의에서 배운거를 한번 적용하거나 정리할수 있고 또 함께 스터디 하는 분이랑 같이 배운거에 대해서 이야기할수있고 모르는건 물어볼수 있어서 좋았다. 개발자 친구들 생긴 기분 >_<v기간 내에 진도를 나가야지 숙제도 할수있고 또 스터디니 모르는건 같이 공부하는 사람들이랑 이야기하니 좋았당.스프링 오픈톡에서 추천받아서 참여한거라서 같이 스터디에 참여하신 분도 계시고 그래서 이번에 코드리뷰도 해주셔서 더 많이 배웠당! 유익한 시간!모르는 미지의 세계에 대한 격한 두려움이 있는 비전공자지만 이번 강의에 내가 좋아하는 뇌과학이랑 시도 나오고 추상화에 대해서 생각해보면서 추상화와 시랑 비교해볼수있어서 조금은 그 두려움이 사라진거 같기도 하다! Lacked (아쉬웠던 점)생각보다 양이 많고 나는 코드까지 따라치니 시간이 많이 걸려서 이제 부터는 더 부지런히 준비해야한다. ☹ 이건 내가 좀 더 노력하면 되는 문제! 하지만 현직 개발자분들에겐 초큼 양이 많지 않을까 싶지만 난 좋음!Learned (배운 점)지겹게 배운 SOLID 한번 더 배우니 조금 더 머리에 잘 정리된거 같고 좋다 이제 조금 워드보단 원리로 더 친숙해진거 같아서 굳.. 리더블 코드라는 강의 주제 답게 실무에서 리더블 코드의 중요성에 대해서 다시 생각하게 되었다. 1- 이름 짓기의 중요성 개발자들은 실무에서 찰떡같은 이름을 짓기위해서 많은 생각하는 시간을 보낸다고 한다. 협업하는 프로젝트일수록 진짜 이름 짓기가 중요하다. 내 시간도 절약되지만 타인의 시간도 절약시켜주니. 관용어처럼 줄이는 단어가 아니면 짧게 줄이는 이름보다 직관적으로 바로 이해할수있게 풀네임으로 짓는게 좋다고 한다. 메서드 이름과 함께 param을 연결 시켜서 문장 만들면 더 직관적인 코드가 된다. 이건 진짜 센스가 필요할거같다.. 연습해봐야지!  2- 뇌 메모리 적게 사용하기코테도 프로젝트도 겨우 겨우 구현하기 바빠서 한번도 생각 못해본건데 똑똑한 방법 같다. 너무 하나 하나 메서드로 만드는거 아닌가 했지만 깔끔해지긴 했다. 상황에 따라서 어떤게 더 직관적일지 판단해서 사용하는게 좋을거같다.if()문 안에 들어간 계산 법까지 메서드로 만드는 방법. 😮 3- Optional 사용 최소화하기 원래도 옵션널에서 꺼낼때 .get().getId() 이런 방식으로 코드가 짜여지는게 싫어서 .orElseThrow 사용해서 exception을 받아오긴 했는데 optional로 들어간 객체는 클래스안에서 반환할때 그냥 객체보다 무겁다고 한다. 이거 몰랐당!! .orElse랑 .orElseGet 이 두개가 조금 차이가 있으니 사용할때 조심하장.orElse()는 들어가보면 삼항?연산자( (number==7) ? true : false)를 사용하기 때문에 확정된 값만 사용한다.(null이 아닐때도 실행된다고 한다).orElseGet - null인 경우만 실행된다. 4- abstract 와 interface의 차이점 Abstract Class상속: 단 하나의 클래스만 상속받을 수 있다 (단일 상속).특징: 공통된 속성과 메서드를 포함하고, 자손 클래스에서 반드시 구현해야 할 추상 메서드를 가질 수 있다.용도: 관련된 클래스들 사이의 기본적인 구조와 행동을 정의하는 데 유용하다.예시: 기본 클래스에서 공통 기능을 구현하고, 자식 클래스에서 이를 확장할 수 있다.Interface상속: 여러 개의 인터페이스를 구현할 수 있으며, 인터페이스 간의 다중 상속이 가능하다.특징: 메서드 선언만 포함되며, 구현은 제공하지 않는다. 각 클래스가 필요에 따라 메서드를 구현해야 한다.용도: 특정 기능이나 역할을 정의하고, 서로 다른 클래스들이 이 기능을 공유하도록 한다.조합: 인터페이스를 잘게 나눠서 여러 개로 만들 수 있어, 불필요한 메서드를 피하고 필요한 기능만 구현하도록 할 수 있다. 예시: 자동차 만들기Abstract Class (차)자동차의 기본적인 구조와 공통 속성을 정의합니다. 예를 들어, Car라는 추상 클래스가 있을 수 있습니다. 이 클래스는 모든 자동차가 공통적으로 가지는 속성(예: 브랜드, 모델, 연료 종류 등)과 메서드(예: startEngine(), stopEngine())를 포함할 수 있습니다. Interface (기능들)인터페이스는 자동차가 수행할 수 있는 다양한 기능을 정의합니다. 예를 들어, Driveable, Flyable, Electric 같은 인터페이스가 있을 수 있습니다. 각 인터페이스는 특정 기능을 나타내며, 이를 구현하는 클래스는 해당 기능을 실제로 수행하는 메서드를 구현해야 합니다. 예시: abstract class Car { String brand; String model; abstract void startEngine(); abstract void stopEngine(); } interface Driveable { void drive(); } interface Flyable { void fly(); } interface Electric { void charge(); } 차 (Abstract Class): 자동차의 기본 구조와 공통 기능을 정의.기능들 (Interfaces): 자동차가 가질 수 있는 다양한 기능을 정의하여, 여러 클래스가 이를 구현할 수 있도록 함. Longed for (앞으로 바라는 점)미리 미리 열심히 해서 조금 더 깊이 있게 공부 하고 싶당.. 이건 나만 부지런해 노력하면 되는 일.. ☹ 다음에는 cs도 들어보곱.. 햐..  

인프런워밍업그터디클럽리더블코드클린코드인프런스터디

채널톡 아이콘