본문 바로가기

프로젝트 & TIL/일별 공부 기록 (백엔드 스쿨)

4일차 - TDD와 자바의 기본(2)

테스트케이스와 TDD 방법론

1일차 : 가입 기능 제작 -> 가입 테스트

2일차 : 로그인 기능 제작 -> 가입 테스트 & 로그인 테스트

3일차 : 로그아웃 기능 제작 -> 가입 테스트 & 로그인 테스트 & 로그아웃 테스트

이런 식으로....

 

Test Driven Development

  1. Red 단계에서는 실패하는 테스트 코드를 먼저 작성한다.
  2. Green 단계에서는 테스트 코드를 성공시키기 위한 실제 코드를 작성한다. (최대한 빠르게, 꼼수 가능)
  3. Blue 단계에서는 중복 코드 제거, 일반화 등의 리팩토링을 수행한다.

위 과정을 반복하면서 구현해나간다.

 


테스트 케이스 작성하기

build.gradle 파일에 추가, 아이콘 뜨면 클릭해준다.

testImplementation 'org.assertj:assertj-core:3.11.1'

어노테이션 추가, 'assertThat' import하여 테스트 케이스를 작성한다.

(org.assertj.core.api.Assertions.assertThat)

@Test
@DisplayName("3, 4 => 12")
void t1(){
    assertThat(new Solution().solution(3, 4)).isEqualTo(12);
}

프로그래머스 알고리즘 풀이 업로드용 깃허브

https://github.com/yurrrrri/ct

 

GitHub - yurrrrri/ct

Contribute to yurrrrri/ct development by creating an account on GitHub.

github.com


** 깃에서 외부 프로젝트를 가져올 때

인텔리제이 웰컴 창에서 Get from VCS -> 외부 프로젝트 깃허브 url 붙여넣기 -> clone

기존의 원격 리포지터리 연결을 끊기 위해 'git remote remove origin' 입력

내 원격 리포지터리로 연결 'git remote add origin 깃허브_리포지터리_주소'

'git push origin main' (git add . 는 하지 않아도 됨)

 


Static

- 메서드 앞에 static 키워드를 붙이면 객체 생성없이 클래스를 통해 메서드를 직접 호출할 수 있다.

- 변수와 메서드에 static 키워드를 붙이면 각각의 객체가 아닌 클래스가 변수, 메서드를 가진다.

 

클래스를 생성하면

  1. 리모콘을 만들 수 있다.
  2. 변수를 만들 수 있다.
  3. 객체를 생성할 수 있다.

객체 지향

- 객체 지향은 중복 코드를 없애기 위해서 존재한다. 객체 지향적인 방식으로

- 객체 지향적인 구조를 위해서 일부러 중복 코드를 허용하는 경우도 있다.

 

상속

자바는 다중 상속을 허용하지 않는다. 메서드가 중복되는 등 애매한 경우를 방지하기 위해.

(문제점 : 복잡한 구조를 상속만으로 해결하려 하면, 중복 코드를 없애지 못할 수도 있다.)

public class Main {
    public static void main(String[] args) {
        사람 a사람 = new 사람();
        a사람.숨쉬다();
    }
}
class 동물 {
    void 숨쉬다() {
        System.out.println("숨쉬다.");
    }
}

class 사람 extends 동물{
}

 사람 extends 동물 ===> 사람 is 동물.


다형성

public class Main {
    public static void main(String[] args) {
        동물 a사람 = new 사람(); // 자동형변환
    }
}
class 동물 {
    void 숨쉬다() {
        System.out.println("숨쉬다.");
    }
}

class 사람 extends 동물{
}

 

사람을 조종하는 리모콘은 곧 동물을 조종하는 리모콘

===> '동물 a사람 = new 사람();' 이 가능하다.

 


public class Main {
    public static void main(String[] args) {
        무기 a무기 = new 칼();
        a무기.공격(); // 불가능!! 무기 class에는 공격 메서드가 없다.
}

class 무기{}

class 칼 extends 무기 {
    void 공격(){System.out.println("공격");}
}

무기 class에 'void 공격(){}'을 추가하면 실행이 된다.


매개변수와 인스턴스 변수 활용

public class Main {
    public static void main(String[] args) {
        전사 a전사 = new 전사();
        a전사.공격("브라이언", "칼");
        a전사.재공격();
    
    }
}

class 전사{
    String name;
    String weapon;
    
    void 공격(String name, String weapon){
        this.name = name;
        this.weapon = weapon;
        System.out.println(name+"(이)가 "+weapon+"(으)로 공격합니다.");
    }
    
    void 재공격(){
        System.out.println(name+"(이)가 "+weapon+"(으)로 공격합니다.");
    }
}

 

객체 형변환

public class Main {
    public static void main(String[] args) {
        자동차 a자동차 = new 페라리();
        페라리 a페라리 = (페라리)a자동차;
    }
}

class 자동차 {}
class 페라리 extends 자동차 {}

컴파일 타임과 런타임

문법 오류 등은 컴파일 에러(error), 실행을 해야 알 수 있으면 런타임 에러(Exception)