예외처리
튜터님 자바 강의 3일차
▶️ 테스트 코드
시간 들여서 파일을 실행시키지 않아도 확인 가능❗
✅ 의도된 대로 정확히 작동하는지 검증까지 가능❗
🔑 장점
- 개발 과정 중 예상치 못한 문제를 미리 발견할 수 있다.
- 작성한 코드가 의도한 대로 작동하는지 검증할 수 있다.
- 코드의 변경, 추가, 삭제 시 사이드 이펙트를 줄일 수있다. → 마음편한 변경, 추가, 삭제 가능 → 마음편한 리팩터링 가능! “돌아가는 코드 건들지마라!!” ❌
✅ .java로 만들어진 파일을 [Ctrl] + [Shift] + [T] 로 Test 클래스 생성
✅ 생성된 Test 클래스의 위치 확인.
✅ 자동으로 생성된 테스트 클래스의 이름은 “테스트 대상 클래스+Test”로 자동 생성
🔑 Annotation
- @Test : 테스트 메서드임을 나타냄. 실행 가능
- @BeforeEach : 각 메서드 전에 실행됨을 나타냄.
- @BeforeAll : 현재 클래스의 모든 메서드보다 먼저 실행되어야하는 메서드 표시.
- @AfterAll : 현재 클래스의 모든 메서드보다 나중에 실행되어야하는 메서드 표시.
- @RepeatedTest : 메서드 반복 호출을 함을 표시.
- @DisplayName : 사용자 지정 표시 이름을 선언.
- 등등 …
→ 테스트 메서드 및 Life Cycle을 잘 이해하고 있어야 활용도 잘 할 수 있다.
⚠️ 좋은 테스트 코드는 새로운 기능을 구현, 코드를 리팩터링 하는 데에 자신감과 안정감을 주지만, 의미 없는 테스트 코드를 작성하면, 테스트 코드 작성에 들이는 에너지가 낭비가 되고, 테스트 코드를 수정 유지 관리하는 데에 많은 비용이 들어서다. 안하느니만 못하다.
좋은 테스트 코드를 작성하는 방법
1.간단하게 작성
- 테스트에서 복잡한 논리를 피해라. 프로젝트가 복잡해짐에 따라 테스트의 시나리오가 꼬이고 테스트 코드의 복잡도가 더 높아질 수 있다.
2. 엣지 케이스 테스트
- 자주 발생하지 않는 항목(오류가 발생되는 부분, 예외 처리가 필요한 부분 등)을 테스트해라.
예를 들어 1. 잘못된 입력 2. 누락된 인수 3. 빈 데이터 4. 호출된 함수의 예외
3.버그를 수정하기 전에 테스트 작성
- 버그가 발생했다면 버그를 재현하는 테스트 작성을 고려해야만 한다. 나중이 이 버그를 발견하기위한 좋은 회귀 테스트로 남는다.
4. 설명이 포함된 이름 사용
-테스트가 실패했을 때 가장 먼저 보게 되는 것이 이름이다. 길고 설명적인 이름을 두려워하지 말자.
5. 한 번에 하나의 요구 사항
- 테스트 요구사항에 맞는 구체적인 이름을 선택할 수 있고 테스트가 덜 부풀어 오르고 읽기 쉽고 유지 관리가 쉬워진다.
▶️ 스레드
👉 JVM 구조 복습
👉 JVM Call Stack
main stack frame에서 일어나는 일들.
...
int main(void){
func1(); // func1() 호출
return 0;
}
void func1(){
func2(); // func2() 호출
}
void func2(){
}
...
함수 호출에 의한 스택 프레임의 변화.
실행 단계 살펴보기
- 프로그램이 실행되면, 가장 먼저 main() 함수가 호출되어 main() 함수의 스택 프레임이 스택에 저장.
- func1() 함수를 호출하면 해당 함수의 매개변수, 반환 주소값, 지역 변수 등의 스택 프레임이 스택에 저장.
- func2() 함수를 호출하면 해당 함수의 스택 프레임이 추가로 스택에 저장.
- func2() 함수의 모든 작업이 완료되어 반환되면, func2() 함수의 스택 프레임만이 스택에서 제거.
- func1() 함수의 호출이 종료되면, func1() 함수의 스택 프레임이 스택에서 제거.
- main() 함수의 모든 작업이 완료되면, main() 함수의 스택 프레임이 스택에서 제거되면서 프로그램이 종료.
→ Stack 자료구조! Last-In, First-Out
👉Thread와 Multi Thread 프로그래밍
- Main Threadmain 스레드는 작업 스레드들을 만들어 병렬로 코드들을 실행.
- 모든 자바 프로그램은 메인 스레드가 psvm을 실행하며 시작.
- 프로세스의 종료
- 싱글 쓰레드 : 메인 쓰레드가 종료하면 프로세스도 종료.
- 멀티 쓰레드 : 실행 중인 쓰레드가 하나라도 있다면, 프로세스 미종료. → 잘못된 처리로, 계속 돌고있는 쓰레드가 하나라도 있다면…? ☠️
▶️ 동기화
수업 중 테스트코드 단축키 이야기 나와서 찾아본 인텔리 제이 단축키!
1. 코드 편집
[Ctrl] + [Space] : 기본 코드 자동완성 기능입니다.
[Ctrl] + [Shift] + [Space] : 소스코드를 분석해서 적합한 자동완성 코드를 추천해줍니다.
[Alt] + [Insert] : 코드를 생성합니다. 생성자나 Getter/Setter, 메서드 오버라이드 등의 코드를 자동생성할때 유용합니다.
[Ctrl] + [O] : Override 가능한 메서드 목록을 확인하여 구현하기 위한 코드를 자동 생성해 줍니다.
[Ctrl] + [I] : Implement 가능한 메서드 목록을 확인하여 구현하기 위한 코드를 자동 생성해 줍니다.
[Ctrl] + [P] : 현재 위치한 메서드의 파라미터 정보를 조회합니다.
[Ctrl] + [Q] : 도큐멘트를 조회합니다.
[Ctrl] + [Shift] + [i] : 구현된 코드를 조회합니다.
[Ctrl] + [Shift] + [j] : 문자열 라인 합치기
[Ctrl] + [B] : 해당 코드의 선언부로 이동.
[Ctrl] + [Alt] + [B] : 해당 코드의 구현부로 이동.
[Ctrl] + [Alt] + [V] : 해당 식에 맞는 변수 자동 추출
[Ctrl] + [Alt] + [C] : 변수를 한 라인으로 합칠 때 식에 맞게 자동 추출
[Alt] + [F7] : 해당 항목이 사용된 위치 검색
[Alt] + [Enter] : 퀵픽스 제안
[Ctrl] +[D] : 라인 복제
[Ctrl] + [Y] : 라인 삭제
[Ctrl] + [W], [Shift] + [Ctrl] + [W] : 커서 근처의 코드 선택 영역을 확대하거나 축소합니다.
2. 주석
[Ctrl] + [/] : 라인단위로 주석처리 합니다.
[Ctrl] + [Shift] + [/] : 블럭단위로 주석처리 합니다.
[Ctrl] + [Alt] + [L] : 해당 프로젝트의 표준 서식에 맞도록 정렬합니다.
3. 포커스
[Ctrl] + [←], [Ctrl] + [→] : 단어별 포커스 이동
[Ctrl] + [Shift] + [←], [Ctrl] + [Shift] + [→] : 단어별 선택
[Home], [End] : 라인 시작/끝으로 이동
[Shift] + [Home], [Shift] + [End] : 라인 전체 선택
[PageUp] : 페이지 업(Page Up)
[PageDown] : 페이지 다운(Page Down)
[Ctrl] + [w] : 포커스 범위 위로 한 단계씩 늘리기
[Ctrl] + [Shift] + [w] : 포커스 범위 아래로 한 단계씩 늘리기
[Ctrl] + [Alt] + [←], [Ctrl] + [Alt] + [→]: 포커스 뒤로/앞으로 가기 (Navigate -> Back/Forward)
[Ctrl] + [Alt] + [↓] (Ctrl 누른 상태) : 멀티 포커스 (Clone Caret Below)
[Alt] + [J] : 똑같은 키워드 선택
[Ctrl] + [Alt] + [Shift] + [J]: [Alt] + [J]로 누른 키워드 전부 선
[F2] : 오류, 경고 영역으로 점프
4. 컴파일 및 실행
[Ctrl] + [F9] : 프로젝트 빌드
[Shift] + [F10] : 실행
[Shift] + [F1] : API 문서 자료 사이트 실행
(설정은 file - project structure - SDKs - Documention - 지구본 + 클릭 + OK 설정을 해야 키가 작동)
[Shift] + [F9] : 디버그 모드 실행
[Ctrl] + [F8] : Break Point 걸기
[Ctrl] + [Shift] + [F8] : Break Point 모두 보기
[F7] : 해당 라인 안으로 들어가기
[F8] : 다음 라인으로 넘어가기
[F9] : 다음 Break Point로 넘어가기
5. 코드 리펙토링
[Ctrl] + [Alt] + [Shift] + [T] : 리팩토링 관련 전체 항목을 조회합니다.
[F5] : 복사(Copy)
[F6] : 이동(Move)
[Ctrl] + [Shift] + [F6] : 변수 타입 변경
[Shift] + [F6] : 이름 변경
[Ctrl] + [F6] : 접근제어자, 반환 타입, 이름 등 주요 정보를 변경합니다.
6. 검색
[Ctrl] + [f] : 현재 파일에서 검색 (Find)
[Ctrl] + [r] : 현재 파일에서 교체 (Replace)
[Ctrl] + [Shift] + [f] : 전체에서 검색 (Find in Path)
[Ctrl] + [Shift] + [r] : 전체에서 교체 (Replace in Path)
[Ctrl] + [Shift] + [n] : 파일 검색 (Navigate -> File)
[Ctrl] + [Shift] + [Alt] + [n] : 메서드 검색 (Navigate -> Symbol)
[Ctrl] + [Shift] + [a] : Action 검색 (Find Action: Enter action or option name)
[Ctrl] + [e] : 최근 열었던 파일 목록 보기 (Recent Files)
[Ctrl] + [Shift] + [e] : 최근 수정한 파일 목록 보기 (Recently Changed Files)
7. 공통 단축키
[Alt] + #[0-9] : 각 단축키에 해당하는 도구창을 엽니다.
[Ctrl] + [Shift] + [F12] : 편집기(Editor) 영역을 최대로 크기로 토글합니다.
[Ctrl] + [Alt] + [S] : 설정(Preferences) 창을 엽니다.
[Ctrl] + [Alt] + [Shift] + [S] : 프로젝트 구조를 확인 및 변경 할 수 있는 창을 엽니다. 해당 메뉴에서 Modules, Libraries, Facets, Artifacts, SDK,Project compiler output 등을 확인 및 변경 할 수 있습니다.
[Ctrl] + [E] : 최근 사용한 파일 목록을 조회합니다.
[Ctrl] + [Shift] + [A] : 액션을 검색하여 실행합니다.
[Alt] + [`] : GIT 실행
8. 테스트 코드
[Ctrl] + [Shift] + [T] : 테스트 코드 생성
[Ctrl] + [Shift] + [F10] : 선택된 테스트 실행
[Ctrl] + [Shift] + [F2] : 실행 중인 테스트 코드 중지
참고 링크
https://dncjf64.tistory.com/308
https://blog.naver.com/seek316/222262335280
https://blog.naver.com/ouioooho/222943401971
https://computer-science-student.tistory.com/298
스트림
▶️ range vs rangeClosed
IntStream stream1 = IntStream.range(1, 4);
stream1.forEach(e -> System.out.print(e + " ")); // 1 2 3
System.out.println();
IntStream stream2 = IntStream.rangeClosed(1, 4);
stream2.forEach(e -> System.out.print(e + " ")); // 1 2 3 4
Stream을 알아보기 위해 내가 참고했던 블로그들
https://blog.naver.com/seosum_/222878821076
https://blog.naver.com/slykid/222289664941
https://mine-it-record.tistory.com/477
필드
필드(field)란 클래스를 구성하는 요소 중 하나로 클래스 내부 멤버이다. 어떠한 데이터를 저장하기 위한 역할을 담당하며 클래스 내부의 생성자와 메소드 밖에 정의가 된다. 필드는 클래스에서 내부 멤버이기 때문에 멤버변수(member variable)라고도 불리며, 클래스 내 전역에서 사용하기 때문에 전역 변수라고도 불리며 데이터를 저장하기 위한 역할을 담당하며 생성자와 메소드 밖에서 사용한다. 즉 필드란 클래스 안에서 독립적으로 선언되는 변수를 뜻한다.
public class 클래스이름 {
//필드선언
int a;
//메소드
public void method(){
//지역변수
int a;
}
}
▶️ 목적에 따른추가 방법
public class 클래스이름 {
public static int a; // 접근제한자 + 정적 + 자료형 + 변수명 + ;필드선언
}
▶️ 초기 값을 주지 않는 경우
public class 클래스이름 {
int a; //필드선언
}
▶️ 초기 값을 주는 경우
public class 클래스이름 {
int a=10; //필드선언
}
등등 이렇게 선언 가능하고, 내가 생각했던 필드 개념이 이번에 문제 풀면서 찾아본 필드의 지극히 작은 부분에 해당 되어 이렇게 따로 정리를 해보았다.
이 글 참조!
필드 (자바) - 해시넷
필드(field)란 클래스를 구성하는 요소 중 하나로 클래스 내부 멤버이다. 어떠한 데이터를 저장하기 위한 역할을 담당하며 클래스 내부의 생성자와 메소드 밖에 정의가 된다. 필드는 클래스에서
wiki.hash.kr
객체 지향의 4대 특성
분명 강의에서 듣고, 필기도 했던 것 같은데 따로 글이 없는 느낌이라 다시 정리해본다.
❣️ 캡슐화(Encapsulation) : 정보 은닉 (Information hiding)
- 데이터에 대한 정보를 숨기기 위해 외부로부터 직접적인 접근을 제한한 후 getter, setter 메소드를 통해서 읽기와 쓰기가 가능하도록 하는 것다.
자바 키워드
- 접근제어자 (private, default, protected, public)
❣️ 상속(Inheritance) : 재사용 + 확장 (extends)
- 상위 클래스의 특성을 재사용하고 하위 클래스에서 필요한 특성을 확장하여 사용하는 것이다.
- 상위 클래스 쪽으로 갈수록 추상화, 일반화되고 하위 클래스 쪽으로 갈수록 구체화, 특수화된다.
https://tychejin.tistory.com/124
상속 관계에서 만족해야하는 문장
- 하위 클래스는 상위 클래스다.
- 하위 클래스는 is a kind of 상위 클래스이다.
자바 키워드
- extends
❣️ 추상화(Abstraction) : 모델링
- 구체적인 것을 분해해서 관심 영역(애플리케이션 경계, Application Boundary)에 있는 특성만 가지고 재조합하는 것입니다.
추상화와 모델링의 관계
- OOP의 추상화는 모델링이다.
- 클래스 : 객체 = 펭권 : 뽀로로
- 클래스 설계에서 추상화가 사용된다.
- 클래스 설계를 위해서는 애플리케이션 경계부터 정해야 한다.
- 객체 지향에서 추상화의 결과는 클래스이다.
❣️ 다향성(Polymorphism) : 사용 편의
- 객제 지향에서 다형성이라고 하면 개발자의 편의를 위하여 사용하는 오버라이딩(overriding)과 오버로딩(overloading)이라고 할 수 있습니다.
오버로딩(overloading)
- 같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를 중복 정의
- https://tychejin.tistory.com/122
오버라이딩(overriding)
- 같은 메서드 이름, 같은 인자 목록에서 상위 클래스의 메서드를 재정의
- https://tychejin.tistory.com/123
자바 키워드
- extends
Q) 내 생일을 디데이로 며칠동안 살았는지 코드 짜보기(Date 이용)
Date로 짜니까 계속 취소선이 생겨서 Calender로 구현함!
import java.util.Calendar;
public class Main {
public static void main(String[] args) {
Calendar today = Calendar. getInstance( );
Calendar birth = Calendar. getInstance( );
today.set(2022,12,2);
birth.set(1993,1,8);
long days = today.getTimeInMillis() - birth.getTimeInMillis();
System.out.println(days / (24*60*60*1000));
}
}
System.out.println(days / (24*60*60*1000));
이 부분은 지금 함수 자체가 Milliseconds 단위이기 때문에 24시간*60분*60초*1000밀리세컨드로 나누어 주여야 일(日)로 나온다.
Date를 알아보기 위해 내가 참고했던 블로그들
https://blog.naver.com/miracle_cat/222906415465
https://blog.naver.com/ekqls9960/222488860482
튜터님 OSI 7 계층 강의
어우,,, 다 정리 못했는데 ,,,,, 내일 주말이니까 주말에 마저 정리해야지!