티스토리 뷰
Done
- 미션4 일부
- 자바의정석 7 복습 (연습문제 못함)
Learned
1. void 메서드는 안좋을까?
(1-1) 왜 학습? 코드리뷰를 받았을 때, 앞으로 void 메서드 활용할 때 꼭 void가 필요할지, 구조를 다르게해서 return을 반환하면 어떨지 고민해 보시라고 하셨다.
- void 메서드의 사용을 지양해야 하나? 의 물음에서 시작되었다.
(1-2) 학습내용
- 아직 이 부분에 대해 명확히 이해하지 못했다.
- 다만 감으로 이해한 바를 적어보자면,
- void 메서드는 side effect ( 부작용이라고 읽고 부수효과라 적는다 https://bong-f.tistory.com/103 ) 를 가한다.
- 생각해보니 함수는 그 안에 무엇을 하는지 알고 싶지 않고 어떤 요청이 있으면 거기에 응답을 해야 하는데 명확하게 응답하지 않고 외부에 영향만 끼치는 느낌과 같았다.
- 그러다보니 해당 메서드를 잘못 사용할 가능성도 높아지는 것 같다.
public class Adder {
private int cumulativeValue;
public void add(int value) {
cumulativeValue += value;
}
public void reset() {
cumulativeValue = 0;
}
public static void main(final String[] args) {
final Adder adder = new Adder();
for (int i = 0; i < 10; i++) { adder.add(i); }
System.out.println("Sum of all numbers from 0 to 9 is " + adder.cumulativeValue);
// Output : 45
adder.reset();
for (int i = 0; i < 10; i++) { adder.add(i); }
System.out.println("Sum of all numbers from 0 to 9 is " + adder.cumulativeValue);
// Output : 45
for (int i = 0; i < 10; i++) { adder.add(i); }
System.out.println("Sum of all numbers from 0 to 9 is " + adder.cumulativeValue);
// Output : 90 (Oops!)
}
}
- 출처 1) https://towardsdatascience.com/are-void-methods-bad-6d67dedc6600
- 출처 2) https://www.quora.com/In-Object-Oriented-design-are-void-methods-bad
(1-3) 공부하다가 유용했던 자료들
void 메서드 안에 return을 쓰는 것은 나쁠까?
출처 https://stackoverflow.com/questions/1283325/is-it-bad-practice-to-use-return-inside-a-void-method
if(!a) return; dosomething();
if(a) { dosomething() }
두 코드 중 어떤 것이 나을까?
위의 코드가 더 낫다고 한다. 중첩(nesting)을 줄일 수 있어서
또 다른 프로그래머가 코드를 추가한다고 생각했을 때도, { } 안에 추가 보다, 그 밖에 추가하는 것이 더 낫다.Guard Clauses
출처 https://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html
가독성이 훨씬 좋다
하는 작업은 똑같다. ; 중첩된 if else문 대신 이렇게 쓰라는 말이군. 사실 그럼 조건을 여러 번 확인하게 되니까 더 안좋은 거 아니야? 라고 단순하게 생각했는데 if else문에서도 어차피 아래 조건까지 내려오게 되면 확인하게 되어있다. 수정된 코드는 return문이 있기 때문에 어쨌든 위의 조건에서 return되면 아래 조건을 확인안하니 성능은 결국 같다
2. 팩토리 메서드 패턴 ( #todo)
객체 생성코드를 별도의 클래스 / 메서드로 분리
그에 따라 객체 생성의 변화에 대비하는데 유용하다.
출처 https://gmlwjd9405.github.io/2018/08/07/factory-method-pattern.html
보충설명 : https://jdm.kr/blog/180
- 팩토리 == 공장, 팩토리 메서드 패턴은 객체를 만들어내는 공장을 만드는 패턴
- 목적 : 클래스의 결합도를 낮추기 위한 것
- 결합도 == 클래스의 변경점이 생겼을 때 얼마다 다른 클래스에도 영향을 주는가
아직 잘 모르겠지만 아래의 코드로 이해했다. (출처 위키피디아)
# Our Pizza
class Pizza:
HAM\_MUSHROOM\_PIZZA\_TYPE = 0
DELUXE\_PIZZA\_TYPE = 1
SEAFOOD\_PIZZA\_TYPE= 2
def __init__(self):
self.__price = None
def getPrice(self):
return self.__price
class HamAndMushroomPizza(Pizza):
def **init**(self):
self.\_\_price = 8.50
class DeluxePizza(Pizza):
def **init**(self):
self.\_\_price = 10.50
class SeafoodPizza(Pizza):
def **init**(self):
self.\_\_price = 11.50
class PizzaFactory:
def createPizza(self, pizzaType):
if pizzaType == Pizza.HAM\_MUSHROOM\_PIZZA\_TYPE:
return HamAndMushroomPizza()
elif pizzaType == Pizza.DELUXE\_PIZZA\_TYPE:
return DeluxePizza()
elif pizzaType == Pizza.SEAFOOD\_PIZZA\_TYPE:
return SeafoodPizza()
else:
return DeluxePizza()
# Usage
pizzaPrice = PizzaFactory().createPizza(Pizza.HAM\_MUSHROOM\_PIZZA\_TYPE).getPrice()
print "$%.02f" % pizzaPrice
- 보면, 여러종류의 피자가 있다. 피자 공장에서 createPizza는 pizzaType에 따라서 다른 피자(각각 다른 클래스) 들을 생성해주고 있다
- 보통 메서드로 분리하는 것 보다는 다른 클래스로 분리하던데.. 팩토리 메서드 패턴의 의미와 활용에 대해서 더 공부해봐야겠다
3. System.getProperty()
- 출처 https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html
- OS 종속적인 값들을 반환한다. 현재 실행되는 환경에 맞게.
- 예를 들어 위의 System.getProperty("line.seperator") 를 맥에서 실행했을 때와 윈도우에서 실행했을 때 다르게 나올 것이다.
- 이것을 활용해서 프로그램을 짜면, 개행문자가 환경마다 다르더라도 똑같은 개행 기능을 실행할 수 있을 것이다.
System.getProperty("line.seperator")
- OS 마다 개행 표기법이 다르다.
- System.getProperty("line.seperator") 사용하면 각 OS에 맞는 개행을 제공한다.
- System.getProperty("line.seperator") 을 윈도우에 쓰면 "\r\n"을, 유닉스를 쓰면 "\n"을 반환한다.
- 출처 https://stackoverflow.com/questions/36796136/difference-between-system-getpropertyline-separator-and-n
- 실습
- 이런식
기타
인텔리제이
- ctrl shift f 프로젝트 내 단어 전체 검색
- ctrl shift r 프로젝트 내 단어 일괄적 수정 가능
(복습) static import
- static import를 사용하면 클래스명을 붙이지 않아도 사용가능하다.
- A클래스의 a메소드가 있다고 하면 원래 단순 import 사용시 A.a 이런식으로 사용해야 했는데 static import를 하면 a 이렇게만 해도 사용 가능하다.
Good
- 오늘은 집중이 잘 안되었는데 나름의 방법으로 잘했다.
Bad
- 자바 복습에 시간이 너무 많이 걸려서 다른 것을 못했는데 이 기본서 복습의 비중을 이렇게 높게 잡는 것이 과연 현명한가? 하는 의문이 든다. 기본서 개념도 중요하지만 코드를 직접 짜면서 훨씬 더 많이 느는 것 같다.
Feeling
- 그래도 주말이 코앞이다. 쉴 건 좀 쉬고, 욕심은 났지만 못했던 분들을 해내고 싶다. 과연 48시간 후에 나는 어떤 리뷰를 쓰고 있을지.. ㅎ
'기타 > TIL' 카테고리의 다른 글
210218 목 TIL (0) | 2021.02.18 |
---|---|
210217 수 TIL (0) | 2021.02.17 |
210216 화 TIL (0) | 2021.02.16 |
210215 월 TIL (0) | 2021.02.15 |
210214 일 TIL (0) | 2021.02.14 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 예외
- 프로그래머스lev2
- 우선순위큐
- Stack
- 백준
- 힙
- Queue
- SQL코딩테스트
- Gitignore
- array
- 최단경로
- Sort
- arraylist
- 동빈북
- FLASK
- 프로그래머스lev3
- thread
- JdbcTemplate
- 순열조합
- Stream
- 프로그래멋lev2
- spring-boot-qna
- 그래프이론
- 프로그래머스lev1
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함