코드스쿼드 10일차
내가 일을 하는 행위가 돈을 버는 주 축이 되는 회사에 가야 역량을 크게 키울 수 있다.
상속
자기 자신 클래스에 메서드가 구현이 되어있는지 보고 있다면 그 메서드를 실행
자기 자신 클래스에 메서드가 구현 되어있지 않다면 부모 메서드를 실행
상속을 쓰지 않고 중복 제거하는법? 조합 : composition ( = has a )
Ex)
Public class Coffee { Private CaffeineBeverage cb; Public Coffee(){ cb= new CaffeineBeverage(); } Void prepareRecipe(){ cb.boilWater(); } }
상속 ( is a) => 자식이 부모가 될 수 있는
포함 (has a)
상속이 좋을까? 조합이 좋을까?
- 상속이 좋긴 하지만, 잘못 사용하면 문제가 될 경우가 많이 생긴다.
- 현업에서는 상속보다 조합 방식으로 프로그래밍을 하는 추세다.
- 변경이 발생했을 때 유연하게 대처 가능
자바에서는 모든 클래스에서 기본적으로 Object 를 상속받고있다. (생략가능)
ex) super.toString();
-> 나는 toString 메서드를 만든적이 없는데?
-> Object에 구현되어있음
상속받은 클래스에서 생성자를 호출하면 super(); 가 자동으로 들어가 부모 생성자를 먼저 호출한다.
Override / Overloading
override : 부모클래스가 구현하고 있는 메서드를 재정의 하는 것
overloading : 메서드 이름이 같고, 인자가 다름
ex ) 생성자
- 참고 ) 내부적으로 실행되는 흐름을 보면 생성자도 메서드다.
하는 일이 비슷하고 인자가 똑같은데 반환값이 다른경우
ex)
void pourInCup (int no) { System.out.println(no + "컵 붓는다."); } int pourInCup (int no) { System.out.println(no + "컵 붓는다."); return no; }
-> void poutInCup 메서드를 삭제하고 int 반환 메서드를 사용하고 int 는 쓰지않는방법으로 사용
부모에서 자식 메서드를 호출할 수가 없어요...
- 추상클래스로 해결
- 더 많은 중복 제거 가능
- 디자인 패턴 중 하나
추상 클래스
상당 부분이 중복, 일부분만 중복이 아닌 경우 사용
ex)
// 부모 클래스
private int no;
자식클래스에서 super.no 로 접근하는 것은 상당히 안 좋은 습관이다.
해결법)
// 부모 클래스
private int no;
public Caffee(int no){
this.no = no;
}
또는
protected int getNo(){
return no;
}
상속은 기본적으로 하나밖에 안되지만 다중 상속을 하고싶다면
ex) My 클래스를 Coffee 클래스에서 쓰고 싶다.
class Coffee{ private My my; public Coffe(My my){ this.my = my; } void prepareRecipe(){ my.a(); } }
- 추상클래스를 제대로 쓰려면 인터페이스를 추출하는 연습을 해야한다.
에노테이션
- @Override : 나는 이 메서드를 오버라이드로 쓸거야
업 캐스팅(upcasting) VS 다운 캐스팅(downcasting)
부모 클래스 bumo = new 자식클래스();
자식클래스에서 만든 메서드를 호출할 수 없다.
부모클래스인 bumo 에는 자식 메서드가 없으므로.
단, ((자식) bumo).자식메서드 를 사용하면 호출 가능.
자식 클래스 jasic = new 부모클래스(); // 사용 불가
ArrayList<Object> values = new ArrayList<>();
values.add(1);
values.add("abc");
- 업캐스팅 : Integer 타입 인 "1" 과, String 타입 인 "abc"를 Object 타입으로 변경
- 다운캐스팅
Integer number = (Integer) values.get(0);
String number2 = (String) values.get(0); // 오류
// Integer를 다른 타입으로 캐스팅하면 오류
어느 타입인지 모를 때에는 아래와 같이 해결
for(Object value : values){
if(value instanceof Integer){
Integer number = (Integer) value;
}
}
캐스팅하는 부분이 없으면 없을수록 그 프로그래밍은 상속을 적재적소에 잘 쓴 것임.
만약 내가 자주 캐스팅을 하면 문제가 있다고 의심해봐야 한다.
팩토리 클래스 / 팩토리 메서드
팩토리 클래스
내가 아닌 다른 클래스 인스턴스를 생성해주는 로직을 가지는 클래스
인스턴스를 생성하는 로직이 복잡한 경우 사용
ex) LineFactory 클래스
도형에 따라서 달라지는 좌표계산기에서는 팩토리 클래스를 쓰는게 일반적
팩토리 메서드
생성자가 2개이상인 경우 많이 사용하고, 의도를 구분해주는 역할로 사용
ex) ofCommaSeparator(){}
if 문 (= switch case) 이 많을 경우는 어떻게 해결하나요?
- 다형성과 컬렉션으로 if문을 제거해보기
Continue / break / return 은 가능한 쓰지 마라
- Continue / break; / return; 를 쓰면 전체의 흐름을 파악을 해야 되므로 읽기가 어려운 코드가 된다.
- 다른 방식으로 깔끔한 코드가 나올 수 있지 않을까 고민해보기
'코딩 교육 기관 > 코드스쿼드 백엔드 레벨2' 카테고리의 다른 글
2018.10.17 (수) (0) | 2018.11.11 |
---|---|
2018.10.15 (월) (0) | 2018.11.11 |
2018.10.08 (월) (0) | 2018.11.11 |
2018.10.04 (목) (4) | 2018.10.25 |
2018.10.01 (월) (2) | 2018.10.25 |
댓글