앱A 의 기능
테스트 진행과정
day1 - 가입기능 개발 -> 가입테스트
day2 - 이메일인증 개발 -> 가입테스트, 이메일 인증 테스트
day3 - 로그인 기능 개발 -> 가입 테스트, 이메일 인증, 테스트, 로그인 테스트
..................
이런식으로 기능이 추가될 때마다 Test를 해나가야 한다.
그래서 테스트 케이스가 등장했다. → 사람이 아니라 기계가 테스트한다. (테스트 자동화)
TDD(Test Driven Development)
기본 자료형 → 변수에 값이 담긴다. stack에 생긴다.
객체 자료형 → 레퍼런스(리모콘 or 주소)에 의해서 참조된다. stack 메모리에는 객체의 주소값을 담을 변수가 생성된다. heap 메모리에는 객체의 정보가 있다.
객체가 왜 필요한가? → 뭔가를 묶을 수 있는 수단이다. 이렇게 묶음으로써 프로그래밍의 난도가 조금 더 편해진다.
기본 자료형 vs 객체 자료형
int person1_0 = 1; // 사람 1의 번호
int person1_1 = 20; // 사람 1의 나이
int person1_2 = 170; // 사람 1의 키
int person2_0 = 2; // 사람 2의 번호
int person2_1 = 30; // 사람 2의 나이
int person2_2 = 180; // 사람 2의 키
=====================================
int[] person1 = new int[3];
person1[0] = 1;
person1[1] = 20;
person1[2] = 170;
int[] person2 = new int[3];
person2[0] = 2;
person2[1] = 23;
person2[2] = 179;
1번 방식은 stack에 변수가 6개 생긴다.
2번 방식은 stack에 변수가 2개 생긴다. 그리고 객체(=new int[3])가 heap 생긴다.
person1의 정보를 넘기려면 3가지 정보를 넘겨야한다. but 객체로 넘기면 person1이라는 변수 1개만 넘기면 된다.
static 키워드란?
→ 클래스내에서 공유하는 변수이다.
class Car{
static int maxSpeed = 10;
}
Car a = new Car();
Car b = new Car();
Car c = new Car();
class Car{
void 엑셀(){
}
void 브레이크(){
};
void 클락션(){
};
}
// 이 변수를 선언하게 되면 Car객체가 heap 메모리에 생성
// stack 메모리에 생긴 aCar 변수가 heap 생성된 Car객체를 가르킨다.
// aCar라는 리모컨에는 3가지 버튼이 있다(엑셀, 브레이크, 클락션)
Car aCar = new Car();
상속
class 고양이{
void 숨쉬다(){}
void 야옹(){}
}
//상속X
class 검은고양이{
void 숨쉬다(){}
void 야옹(){}
void 미래예지(){}
}
//상속O -> 검은 고양이의 기능은 총 3가지(숨쉬다, 야옹, 미래예지)
class 검은고양이 extends 고양이{
void 미래예지(){}
}
//상속O -> 흰고양이의 기능은 총 3가지(숨쉬다, 야옹, 냥펀치)
class 흰고양이 extends 고양이{
void 냥편치();
}
흰고양이 a = new 흰고양이();
a.숨쉬다();
a.야옹();
검은고양이 a = new 검은고양이();
a.숨쉬다();
a.야옹();
전세계의 고양이가 3종만 존재한다고 하면 클래스를 만들어서 각각의 기능을 정의하면 된다. 근데 고양이의 종이 엄청 많다.
그래서 흰고양이, 검은고양이, 파란고양이의 특징을 모두 가질 수 있는 추상적인 클래스를 만들어야한다.
객체지향은 중복코드를 없애기 위해서 존재한다.
But 상속만으로는 모두를 만족시킬 수 없다. 즉, 중복을 모두 해결할 수 없다.
//칼을 조종하는 리모콘은 무기를 조종하는 리모콘이라고 볼수있는가?? -> 거짓
//무기를 조종하는 리모콘은 칼을 조종하는 리모콘이다. -> 참
class Main {
public static void main(String[] args) {
//무기를 조종하는 리모콘(a무기)는 칼을 조종하는 리모콘이다( new 칼() )
무기 a무기 = new 칼();
칼 a칼 = new 무기(); // -> 이거는 안된다.
}
}
class 무기{
}
class 칼 extends 무기{
}
무기 a무기 = new 칼();
을 하면 칼이 무기 형태로 자동 형변환이 돼서 들어간다.//무기의 리모콘에는 기능이 X -> 버튼이 0개
class 무기{
}
//칼 리모콘에는 기능이 1개 -> 버튼이 1개
class 칼 extends 무기{
void 공격(){
System.out.println("칼로 공격");
}
}
TV tv1 = new LgTv();
TV tv2 = new 샤오미Tv();
TV tv3 = new 삼성Tv();
TV tv4 = new 독일Tv();
TV[] tvs = new TV[4];
tvs[0] = tv1;
tvs[1] = tv1;
tvs[2] = tv1;
tvs[3] = tv1;
//for-each 문
for(Tv tv : tv2){
tv.끄기();
}
Java에서 다중상속이 안되는 이유
→ 메서드 중복이 일어날수있기 때문에
에러의 종류
자동차 a자동차 = new 스파크(); // -> 자동차 리모컨으로는 스파크 조종 가능하다.
페라리 a페라리 = a자동차; // -> 상황은 페라리 리모컨으로 스파크를 조종하겠다라는 뜻이다.
class 자동차{}
class 스파크 extends 자동차{}
class 페라리 extends 자동차{}
페라리 a페라리 = a자동차; 가 빨간줄이 뜨는 이유
a페라리 = a자동차;
는 a페라리 라는 리모컨이 a자동차가 가리키는 것이 무엇인지도 모르고 같은 것을 가리키자고 하는 것이다.