Post

TIL-20240429

TIL-20240429

2024-04-29

오늘의 학습 🌠


1

코트카타 정리 📃

SQL

  • 상위 1개의 데이터 가져오기
    • LIMIT 1

알고리즘

  • 오름차순 정렬
    • Arrays.sort()

강의 학습 내용 💨

  • 오류(Error) : 일반적으로 회복이 불가능한 문제
  • 예외(Exception) : 일반적으로 회복이 가능한 문제

  • 컴파일 에러(예외)
    • .java 파일을 .class 파일로 컴파일 할 때 발생하는 에러

    • 문법 틀렸을 때
    • 자바 프로그래밍 언어 규칙 지키지 않았을 때
  • 런타임 에러(예외)
    • 우리가 주로 다루게 될 에러(예외)

    • 문법적인 오류는 아니라서 컴파일은 잘 되었지만 “프로그램” 실행도중 맞닥뜨리게 되는 예외

  • 확인된 예외(Checked Exception)
    • 컴파일 시점에 확인하는 예외
    • 반드시 예외 처리를 해줘야 함

    • 컴파일 에러와 헷갈리면 안됨. 우리가 이미 특정 문제를 인지하고 있어서 해당 예외를 정의해두었고 정의했기 때문에 컴파일 하는동안 이 예외에 대한 예외처리를 했는지 확인 할 수 있는 예외임.

    • 즉 Checked Exception에 대한 예외처리를 하지 않으면 컴파일 에러가 발생
  • 미확인된 예외(Unchecked Exception)
    • 런타임 시점에 확인되는 예외
    • 예외 처리가 반드시 필요하지 않은 예외
  • 예외처리를 어떻게 해야되는가?
    • 정의 -> 알리고 -> 핸들링
throwsthrow
메서드 이름 뒤에 붙어 이 메서드가 어떠한 예외사항을 던질 수 있는지 알려주는 예약어메서드 안에서 실제로 예외 객체를 던질 때 사용하는 예약어
여러 종류의 예외사항 적을 수 있음일반 메서드 return 키워드처럼 throw 아래 구문들은 실행 X, throw문과 함께 메서드 종료

1

  • Checked Exception을 다룸

  • 예외가 발생하는 상황 “인지”, 어떠한 에러인지 “정의”
  • 메서드 선언할 때 예외가 발생하는 위험한 메서드라는 것을 “알림(throws/throw)
  • checked exception을 정의하고 알렸으니 이 메서드(main)를 사용할 때 예외처리를 하지 않으면 컴파일 에러 발생 -> try catch 문 사용

1

  • Throwable Class
    • 시작은 모든 객체의 원형인 Object 클래스에서 시작

    • “문제 상황”을 뜻하는 Throwable 클래스가 Object 클래스를 상속
    • Trowable 클래스의 자식으로 앞서배운 에러(Error)와 예외(Exception) 클래스가 있음
    • 에러 클래스와 예외 클래스는 각각 IOError 클래스, RuntimeException 클래스와 같이 구분하여 처리

1

  • 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("?�� 번째 ?��?���? ?��?��?��?��?�� : ");

  • 해당 오류 발생 1

  • . windows 기본 설정이 ms949여서 그렇다고 하여 UTF-8로 수정 후 해결

  • 세 번째 오류 한글 깨짐 현상 😡 1

  • 검색 후 기존의 build 파일 삭제 후 다시 run 수행

1

  • 해결😭

  • 네 번째 오류

    • 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

추가 🕤


  • 생각보다 git 오류가 많아서 정신이 없었지만 이번 기회에 배우게 되는 것도 좋은 공부일지도..는 글을 위한 포장.. 1

이 그림은 저입니다.

🐱‍🏍— —🤸🏻‍♀️ ~~~ 야~호~

This post is licensed under CC BY 4.0 by the author.