코드스쿼드 6일차
원래 월요일에 수업을 진행하여야 했지만, 아쉽게도 추석 시즌이라 오늘 수업을 진행하였다.
추석을 보내고 잠시 헤이해졌던 정신을 차리고 다시 공부에 집중해보자!
실력 늘리기
새로운 API 기능을 알고 싶으면 심심할 때마다 하나씩 테스트 케이스를 작성해서 연습해라!
그래야 자바 프로그래밍에 익숙해진다.
회사에서 물어보는 단골 면접 질문
"문자열 뒤집기"
난의도 최하.
하지만 많은 개발자들이 이 질문에 답을 하지 못함.
String name = “성건희”;
char[] original = name.toCharArray();
char[] target = new char[original.length];
for(int i = 0; i < original.length; i++){
target[i] = original[original.length – i -1];
}
문자열이 짧을 때는 성능의 효과가 거의 없으므로 String을 사용하고,
문자열이 길고 자주 호출되는 경우는 StringBuilder를 사용하는것이 좋다.
String + String VS StringBuilder
String은 불변 (immutable) 이기 때문에 String과 String을 더하면 새로운 String 객체를 생성한다.
따라서 String과 String을 더하는 시점에 메모리 할당과 메모리 해제가 계속 발생한다.
StringBuilder는 String과 다르게 기존 데이터에 새로운 데이터를 더하는 방식을 취하기 때문에 속도가 더 빠르다.
따라서 긴 문자열을 더하는 상황이 발생하는 경우 StringBuilder를 활용해 구현한다.
StringBuilder VS StringBuffer
현업에서는 StringBuilder를 더 많이 쓰는 추세이다.
둘의 기능은 동일하지만 StringBuffer는 멀티쓰레드에 안전하도록 Synchronized (동기화) 되어 있다.
-> 한 명의 사용자가 서비스 하는 동안에는 다른 메서드가 침범하지 못함. 즉, 동시 접근이 불가능.
안전하지만 동기화로 성능이 떨어진다.
배열은 쓰지 마라
배열은 길이, 값 할당, 값 읽음만 가능하다.
하지만 List 를 사용하면 동적으로 데이터를 추가하는 것이 가능해진다.
앞으로 코딩하면서 배열을 쓰지 않는 연습을 하는 것이 좋다.
ArrayList VS LinkedList
둘은 기능과 사용법이 동일하다.
메모리는 LinkedList 가 더 많이 사용하지만, 값을 추가할 때는 LinkedList 가 더 빠르다.
Why? ) ArrayList는 중간에 값을 추가하면 그 뒤에 값들이 다 한칸씩 뒤로 밀려나지만,
LinkedList는 추가한 값만 다시 연결해주면 되므로
접근 제어자
- private < default (+ package) < protected (+ 상속) < public
- 가능한 클래스 내에서만 쓰는 부분은 private 으로 써라
- 인스턴스 변수는 진짜 필요한 경우 아니면 private 으로 써라
- 무조건 public 을 쓰는 것은 상당히 안좋은 습관이다.
질문 Time
인스턴스 변수는 언제 만들어야 하나요?
- 상태가 있는 객체의 경우
- 메서드들이 고루고루 인스턴스 변수를 이용해서 뭔가를 처리하는 경우
- ex) 자동차 경주 게임의 InputView 클래스처럼 단순히 값을 입력 받고 처리하는 부분을 다른 객체에 역할을 위임하는 경우는 굳이 인스턴스 변수로 만들 필요가 없음
- 인스턴스 변수는 가능한 적게 만드는 것이 좋다.
- 줄일 수 있으면 최대한 줄여라.
- 인스턴스 변수는 3개이상은 가능한 만들지 마라
- 인스턴스 변수가 많으면 객체에 너무 많은 역할을 부여했다는 생각을 가지고 새로운 객체를 도출해보는 방법을 쓰자
- 인스턴스 변수에 접근하지 않는 메서드는 클래스 메서드로 만드는 게 좋다
- 클래스 메서드로 만들었을 때 단점: 메서드 인자가 늘어남
- 클래스 메서드는 쓰일 때 메모리에 상주하고 다 쓰면 메모리에서 내려감
- 인스턴스 메서드로 만들면 클래스메서드보다 테스트하기가 힘듬
- 하나의 메서드만 인스턴스 변수를 쓴다면 인스턴스 변수를 쓰지 않고 그냥 인자 값으로 전달하는게 좋다
테스트를 위해서 생성자를 추가로 만들어도 되나요?
테스트를 위해서 생성자를 만드는 것은 문제가 없다.
Car(String name){ this(name, 0); }
Car(String name, int pos){ this.name = name.trim(); this.pos = pos; }
나는 인스턴스 변수를 각각의 메서드가 얼마나 쓰는지 신경쓰지 않고 무작정 인스턴스 변수로 선언 했는데,
내가 얼마나 무지했는지 반성하는 시간이 되어서 너무 유익한 시간이었다.
앞으로 많은 코딩 연습을 통해 인스턴스 변수로 만들지, 인자값으로 뺄지 고민하면서 효율적인 방식으로 사용하도록 노력해야겠다.
'코딩 교육 기관 > 코드스쿼드 백엔드 레벨2' 카테고리의 다른 글
2018.10.04 (목) (4) | 2018.10.25 |
---|---|
2018.10.01 (월) (2) | 2018.10.25 |
2018.09.20 (목) (0) | 2018.10.22 |
2018.09.17 (월) (5) | 2018.10.17 |
2018.09.13 (목) (3) | 2018.10.16 |
댓글