TIL-20240429
2024-04-29
오늘의 학습 🌠
코트카타 정리 📃
SQL
- 상위 1개의 데이터 가져오기
LIMIT 1
알고리즘
- 오름차순 정렬
Arrays.sort()
강의 학습 내용 💨
- 오류(Error) : 일반적으로 회복이 불가능한 문제
예외(Exception) : 일반적으로 회복이 가능한 문제
- 컴파일 에러(예외)
.java 파일을 .class 파일로 컴파일 할 때 발생하는 에러
- 문법 틀렸을 때
- 자바 프로그래밍 언어 규칙 지키지 않았을 때
- 런타임 에러(예외)
우리가 주로 다루게 될 에러(예외)
문법적인 오류는 아니라서 컴파일은 잘 되었지만 “프로그램” 실행도중 맞닥뜨리게 되는 예외
- 확인된 예외(Checked Exception)
- 컴파일 시점에 확인하는 예외
반드시 예외 처리를 해줘야 함
컴파일 에러와 헷갈리면 안됨. 우리가 이미 특정 문제를 인지하고 있어서 해당 예외를 정의해두었고 정의했기 때문에 컴파일 하는동안 이 예외에 대한 예외처리를 했는지 확인 할 수 있는 예외임.
- 즉 Checked Exception에 대한 예외처리를 하지 않으면 컴파일 에러가 발생
- 미확인된 예외(Unchecked Exception)
- 런타임 시점에 확인되는 예외
- 예외 처리가 반드시 필요하지 않은 예외
- 예외처리를 어떻게 해야되는가?
- 정의 -> 알리고 -> 핸들링
throws | throw |
---|---|
메서드 이름 뒤에 붙어 이 메서드가 어떠한 예외사항을 던질 수 있는지 알려주는 예약어 | 메서드 안에서 실제로 예외 객체를 던질 때 사용하는 예약어 |
여러 종류의 예외사항 적을 수 있음 | 일반 메서드 return 키워드처럼 throw 아래 구문들은 실행 X, throw문과 함께 메서드 종료 |
Checked Exception을 다룸
- 예외가 발생하는 상황 “인지”, 어떠한 에러인지 “정의”
- 메서드 선언할 때 예외가 발생하는 위험한 메서드라는 것을 “알림(throws/throw)
- checked exception을 정의하고 알렸으니 이 메서드(main)를 사용할 때 예외처리를 하지 않으면 컴파일 에러 발생 -> try catch 문 사용
- Throwable Class
시작은 모든 객체의 원형인
Object
클래스에서 시작- “문제 상황”을 뜻하는
Throwable
클래스가 Object 클래스를 상속 - Trowable 클래스의 자식으로 앞서배운 에러(
Error
)와 예외(Exception
) 클래스가 있음 - 에러 클래스와 예외 클래스는 각각
IOError
클래스,RuntimeException
클래스와 같이 구분하여 처리
- Chained Exception
- 연결된 예외
- 예외는 다른 예외를 유발할 수 있음
- 원인 예외를 새로운 예외에 등록한 후 다시 새로운 예외를 발생시키는데 이를 예외 연결이라고 함
📌
왜 예외를 연결하지?
- 여러가지 예외를 하나의 큰 분류의 예외로 묶어 다루기 위해
- checked exception을 unchecked exception으로 포장(wrapping) 하는데 유용하게 사용
- Generic
타입 언어에서 “중복되거나 필요없는 코드를 줄여주는 것”
타입 안정성을 해치지 않는 것
📌
왜 제네릭을 사용하지?
js나 python 같이 타입이 없는 언어인 약타입 언어를 이용한다면 일은 간단함. 기본적으로 타입을 지정해 줄 필요가 없기 때문에 하나의 함수만 구현하면 끝임.
- 하지만 Java는 타입을 지정해줘야 하는 언어를 사용함
따라서 똑같은 로직을 수행하는 함수를 타입을 지정해야 한다는 이유로 세 차례나 구현해야 함. 이 말은 “오버로딩“을 뜻함
1 2 3
public class Generic { public Object plusReturnFunction(Object a,Object b) { ... } }
- 그렇다면 상기의 코드로 하면되지 않나?
- Object를 상속받기 때문에 이와 같이 작성하면 실제로 타입과 상관없이 메서드 안에 두 파라미터를 전달하는 것은 가능함. 하지만 타입 안정성이 침해받게 됨
- 예를 들어 a 객체와 b 객체에 단항 연산자를 사용할 수 있을까?
- 두 타입이 다르다면 연산자를 사용하기 위해 같은 타입으로 맞춰줘야 하는데 어떤 타입으로 맞출 수 있을까?
- 따라서 형변환과 같은 부수적인 코드는 오히려 늘어나게 됨. 이런 방식은 사용하지 않음.
- 이런 방식을 구현할 수 있게 하는 것이 Generic
1
2
3
public class Generic<T> { ... }
Generic<String> stringGeneric = new Generic<>();
Genetic
의 클래스처럼 제네릭을 사용한 클래스를 제네릭 클래스라고 함 - 제네릭에서 <> 사이에 들어가는 변수명 T는 타입 변수라고 함
- Generic 클래스를 원시 타입이라고 함
- static 멤버에 사용할 수 없음
- 타입 변수는 인스턴스 변수로 간주되고 모든 객체에 동일하게 동작해야하는 static 필드 특성상 사용 불가능
- 다형성 즉, 상속과 타입 관계는 그대로 적용
- 와일드 카드
- <? extends T> : T와 그 자손들만 사용 가능
- <? super T> : T와 그 조상들만 가능
- <?> : 제한 없음
- Wrapper 객체
- 원시 타입을 ‘추상화’ 시켰다고 표현할 수 있음
1
2
3
4
5
6
7
Integer num = new Integer(17); //Boxing
//int 타입인 17을 wrapper 클래스로 Boxing 한 것
int n = num.intValue(); //UnBoxing
//JDK 1.5 version 이상부터 AutoBoxing 기능 제공
Character ch = 'X'; //AutoBoxing
char c = ch; //AutoUnBoxing
Git 오류 해결🔄
첫 번째 오류 🤔
- 개인 프로젝트 진행중 Git push에서 오류 발생
- 템플릿 프로젝트 다운받아서 intelliJ에 압출 풀기
- repo 연결 후 commit 후 push 시도
- push reject 발생
이유 : 두 개의 branch 간에 관련 없는 히스토리를 병합하려고 시도할 때 발생, 두 branch가 서로 다른 remote 저장소를 가리키거나 새로운 저장소를 초기화한 후에 발생
해결 :
git pull origin main --allow-unrelated-histories
명령어로 강제로 병합 수행, 해당 명령어로 관련 없는 히스토리를 병합하여 local branch와 remote branch를 동기화할 수 있음. 후에 다시 push하여 업데이트 진행- 두 번째 오류 😔
C:\Users\user\Downloads\nbcamp-java-personal-task\nbcamp-java-personal-task\src\main\java\calculator\App.java:14: error: unmappable character (0xEC) for encoding x-windows-949 System.out.println("?�� 번째 ?��?���? ?��?��?��?��?�� : ");
. windows 기본 설정이 ms949여서 그렇다고 하여 UTF-8로 수정 후 해결
검색 후 기존의 build 파일 삭제 후 다시 run 수행
해결😭
네 번째 오류
- git commit 작성자 수정
- 아마도 받아오는 템플릿의 작성자인 튜터님의 이름으로 연동되어있는 거 같아서 수정
IntelliJ 터미널 열기(Alt+12)
git commit --amend --author="이나영 <ajd092710@gmail.com>"
해당 명령어를 통해 이름과 이메일 주소를 바꿈- 편집기에서 수정된 커밋 저장
- 수정하기 위해 i 입력, esc + :wq 로 종료
git push origin main --force
해당 명령어로 push- 이와 같은 과정으로 이전 commit 된 사용자를 본인으로 변경함
git config user.name
git config user.email
을 통해 맞는 계정을 사용하고 있는지 확인- 내 계정과 다르다면 변경
git config --local user.name 이나영
git config --local user.email ~~@gmail.com
추가 🕤
이 그림은 저입니다.
🐱🏍— —🤸🏻♀️ ~~~ 야~호~