본문 바로가기
코딩 교육 기관/코드스쿼드 백엔드 레벨2

2018.10.11 (목)

by 성건희 2018. 11. 11.
반응형

코드스쿼드 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

댓글