[Java] 기초2

김민우·2023년 2월 23일
0

테스트 케이스

앱A 의 기능

  • 회원(가입, 이메일 인증, 로그인, 로그아웃, 정보수정)
  • 커뮤니티(글CRUD, 댓글CRUD, 좋아요, 알림)
  • 관리자 페이지

테스트 진행과정
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();
  • Car 객체 a, b, c는 maxSpeed 값을 공유해서 사용한다. 즉, 1개만 존재한다.
  • 만약 static 키워드가 붙지 않았다면 Car 객체 1개당 maxSpeed 변수 1개씩 존재했을 것이다.

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 무기{
}

classextends 무기{

}
  • double d = 1; 을 하면 d = 1.0 이렇게 자동 형변환이 돼서 들어간다.
  • 마찬가지로 무기 a무기 = new 칼(); 을 하면 칼이 무기 형태로 자동 형변환이 돼서 들어간다.
    • 칼이 무기를 상속했기 때문이다.
//무기의 리모콘에는 기능이 X -> 버튼이 0개
class 무기{
}

//칼 리모콘에는 기능이 1개 -> 버튼이 1개
classextends 무기{
	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.끄기();
}
  • 통합리모컨으로 모든 TV를 조종할 순 있다. but 각 TV가 가지는 특별한 기능들 같은 것들은 사용하지 못한다.
  • 그렇지만 통합 리모컨 1개로 조종하는 것은 편해진다.
  • 기본적으로 많이 사용하는 기능은 거의 동일하기 때문이다.

Java에서 다중상속이 안되는 이유
→ 메서드 중복이 일어날수있기 때문에

에러의 종류

  1. 컴파일 에러
  • 컴파일은 실행을 위한 중간과정이다.
  • 소스코드를 실행파일로 만드는 과정
  • 컴파일 에러가 세상에서 제일 친절한 오류이다.

  1. 런타임 에러
  • 런타임은 소스코드 실행시간을 의미한다.
자동차 a자동차 = new 스파크(); // -> 자동차 리모컨으로는 스파크 조종 가능하다.
페라리 a페라리 = a자동차; // -> 상황은 페라리 리모컨으로 스파크를 조종하겠다라는 뜻이다.

class 자동차{}
class 스파크 extends 자동차{}
class 페라리 extends 자동차{}

페라리 a페라리 = a자동차; 가 빨간줄이 뜨는 이유

  • a자동차라는 리모컨은 “스파크” 객체를 가르킨다.
  • a페라리 = a자동차; 는 a페라리 라는 리모컨이 a자동차가 가리키는 것이 무엇인지도 모르고 같은 것을 가리키자고 하는 것이다.
  • 즉, 페라리 리모컨은 페라리 객체만을 가르켜야되는데 a자동차가 페라리를 가리키는지 다른 자동차를 가리키는지 모르는 것이다. → 빨간줄이 나는 핵심이유

0개의 댓글