위키

김이홍·2023년 5월 25일

인텔리제이

  • 커뮤니티 버전으로 다운 후 올 체크 후 설치
  • 자바 17버전 아마존으로 설치
  • 파일->font에서 d2코딩 설치하고 폰트 사이즈 조정하기 -> 에디터에 있는 폰트는 내용, 어피어런스에 있는 폰트는 인터페이스 폰트

자바 1일차

  • 유용한 단축키
    alt + insert : 생성자 자동 생성
    ctrl(shift) + n : 클래스명(파일명) 찾아서 데려가기
    alt + insert : 새로운 파일이나 클래스를 생성
    ctrl( + shift) + [ - or + ] : 코드(전체) 접기 or 펼치기
    ctrl + alt + s : 세팅 열기
    alt + 드래그 : 영역 제한 드래그
    ctrl(+shift) + w : 선택 확장(축소)
    alt + enter : 자동 임포트 하기
    shift + F6 : 해당 파일 이름 바꾸기
    ma + enter : main 클래스 생성
    ctrl(+shift) + F : 찾기(전체문서에서)
    ctrl(+shift) + R : 찾고 바꾸기(전체문서에서)
    shift(+ctrl) + F10 : 실행하기(현재 커서 있는 파일)
    shift + enter : 한줄 내리기
    shift + alr + 방향키 위 or 아래 : 줄 바꿈
    shift + ctrl + 방향키 위 or 아래 : 위치 바꿈(함수일 경우 함수 내용포함)
    ctrl + alt + L : 전체 정렬
    ctrl + alt + i : 한줄 정렬
    ctrl + d : 복사해서 아래 붙이기
    ctrl + y : 한 줄 삭제
    sout + enter : System.out.println();
    ctrl + space : 자동완성 목록 보여주기
  • 정수 : int, 실수 : double, float(작은), 문장 : String
  • 10과 20 사이의 값을 조건식으로 나타내고 싶으면 (10 < x && x < 20)
    - (10 < x < 20) -> 이런식으로는 표시할 수 없다!!
  • 10보다 작거나 20보다 큰 값을 조건식으로 나타내고 싶으면 (10 < x || x > 20)

자바 2일차

  • 반복문
    - while : if 문과 작동 원리는 거의 같다. 다른 점이 있다면 조건이 참일 동안 계속 반복한다는 점이다.
    		```
      int i = 1; // 조건 변수 초기화
    while (i <= 5) { // 조건식
    System.out.println(i);
    i++; // i = i + 1; // 조건 변수 제어
    }
    - for :  조건변수에 따른 조건식이 참일 동안 반복된다. 가장 많이 쓰인다.
    	```
       for (조건 변수 초기화; 조건식; 조건 변수 제어) {
    	// 반복해서 실행될 코드
    	}
    	```
  • 형식
    	```
    // 복잡할때 -> 일반적인 방법
    String message = String.format("%d살 %s입니다.", age, name);
    // 숫자 넣고 싶은 곳에 %d, 문자 넣고 싶은곳에 %s, 이후 변수를 넣고 싶으면 콤마 후에 순서대로 변수를 넣는다.
    // %d, %s, %f 같은 거를 형식지정자라고 하고 출력 메서드에서 사용되며, 출력하려는 값을 특정 형식으로 포맷팅하는 데 사용된다.
    System.out.println(message);
    	```
    // 편한 방법 -> 줄바꿈이 안된다.
    System.out.printf("%d살 %s입니다.\n", age, name); // 줄바꿈이 안되니까 이스케이프 시퀀스 \n 쓰면 된다.
  • 깃허브 : 원격 저장 서버
  • 깃 : 파일 자동 관리 프로그램
  • 자바와 깃허브 연동하기
    - 기본세팅
    - 깃 설치
    - 깃 배쉬로 커멘드 입력 할 준비
    - cd(Change Directory) src (src 만 관리 하도록 하기 위해서) -> 원하는 파일로 변경 // dir(Directory) : 현재 위치에 있는 폴더 안에 있는 폴더를 볼 수 있다.
    - git init -> 깃을 시작 한다. 깃 시작 전에 위에 작업 처럼 관리 할 폴더로 위치한 후 시작해야된다.
    - git init 을 하면 관리할 폴더 안에 숨김 폴더로 git 폴더가 생성되는데 혹시나 생성 위치가 잘못됐다면 해당 폴더에 들어가서 삭제해주면 된다.
    - git remote add origin 깃 주소 -> 이때 origin은 깃 주소 저장소의 별명이 된다.
    - git remote rename <현재 별명> <새로운 별명> -> origin 의 별명을 바꾸는 법
    - 자격증명 관리자에서 window 자격증명 > 일반 자격 증명 > git 관련 내용 다 삭제
    - git config --global user.name "깃허브 닉네임"
    - git config --global user.email "깃허브 이메일"
    - 깃허브 사이트 들어가서 프로필 > 세팅 > Developer settings > personal access tokens > classic > generate new token 해서 토큰 받기!
    - 토큰 번호는 다시 볼 수 없으니 어디다가 저장 하길 바란다.
    - 토큰은 보안을 위한 인증서 같은 거라고 보면 됨, 90일 정도 인증기간 잡기, 무기한도 있다, 현재 정책으로는 아이디로는 연동을 할 수 없는 걸로 알고 있다.
    - 토큰은 푸쉬 할 때만 필요한 인증 수단이고 푸쉬 하고 싶은 컴퓨터는 모두 각기 다른 토큰이 필요하다!!
    • 이력을 저장할 파일지정
      • git status : 현재 관리하고 있는 폴더 안의 관리 대상 상태를 보여준다.
        • 빨간색은 선택되지 않은 상태
        • 초록색은 선택된 상태 -> 선택하기 위해서 (git add .)
        • 하나만 추가 하고 싶으면 git status 에서 확인된 폴더 주소를 전부 다 선택해서 git add day02/_06_Practice3.java 처럼 입력한다.
    • 지정된 파일을 백업파일에 저장
      • git commit -m "메시지"
    • 백업 파일을 깃허브 서버로 전송
      • git push -u origin master -> 깃 주소 저장소의 별명인 origin의 master 브랜치로 보낸다는 뜻
      • 브라우저로 연결 > 토큰 받은 걸로 접속
    • 주의 사항
    • 작업 순서를 잘 지켜야된다.
      • git pull origin master
      • 소스코드 작업
      • git add .
      • git commit -m "메시지"
      • git pull origin master(혹시나? 하는 마음에)
      • git push origin master
    • 참고 : 명령문 종료 후 빠져나가는 법 : q
  • 함수
    • java는 main에서 시작과 끝이 일어난다.
    • void -> 함수는 반드시 값을 반환해야되는데 유일하게 반환하지 않아도 되는 반환타입이다.
    • void 외의 형식은 값을 반환해야 되고 return 이 반드시 존재해야된다.
    • 클래스는 함수는 모아 두는 공간의 역할을 할 수 있다.
    • 함수 내에서 사용되는 지역변수나 매개변수는 해당 함수의 스코프 내에서만 의미를 가진다.
      - 단 그 변수를 참조변수로 사용했을 때는 변수 공유가 가능하다.
    • main 함수를 제외하고 모든 함수는 호출하지 않는 이상 실행되지 않는다.

자바 3일차

  • 배열
    - 선언 : Int 변수[] = new Int[배열의 길이];
    배열을 사용한다고 선언 했으니까 이제 배열안에 내용물을 넣으면 된다.
    변수[0] = 30; 같이 각 인덱스 별로 값을 넣어준다.
    - 만약에 int[] arr = {1, 2, 3};와 같이 선언된 배열에서 arr[3]을 출력하면 기본값인 0이 출력됩니다. 마찬가지로, boolean[] arr = {true, false, true};와 같이 선언된 배열에서 arr[3]을 출력하면 기본값인 false가 출력됩니다.
    좀 더 쉬운 방법은 Int 변수[] = {값1,값2,값3,값4,값5}
    • [배열].length -> 배열의 길이 추출
      • -> 배열의 길이는 index + 1 이다.
    • import java.util.Arrays; 를 사용하면 배열을 사용하기 편하다.
      • Arrays.sort(변수) -> 변수로 설정된 배열값을 오름차순으로 정렬해 준다
        • Arrays.copyOfRange(변수, 시작인덱스, 끝인덱스) -> 시작 인덱스 부터 끝 인덱스까지 재설정된 변수 배열을 만들어 준다.
  • 입력
    - Scanner sc = new Scanner(System.in); -> 이제 부터 입력받을 수 있다.
    - 상단에 알아서 import 된다.
    • sc.next() : 문자열을 입력받을 수 있다.(한단어)
    • sc.nextLine() : 문자열 한 줄을 입력받을 수 있다.
    • sc.next() 다음 sc.nextLine()를 하면 오류나 난다.
      • sc.next()을 하면 \n제외하고 뽑는데 그 후에 sc.nextLine()을 하면 \n을 뽑기 때문! 따라서 두개를 저런 순서로 쓴다면 실제 출력될 nextline 앞에 한번 더 nextline을 써서 \n을 빼줘야 된다.

자바 4일차

  • 메모리
    - 힙 메모리(Heap Memory):
    힙 메모리는 동적으로 할당된 객체와 배열이 저장되는 영역입니다.
    프로그램 실행 중에 런타임에 객체가 생성되고, 힙에 할당됩니다.
    힙 메모리는 가비지 컬렉션(Garbage Collection)에 의해 관리되며, 더 이상 참조되지 않는 객체들은 가비지 컬렉션에 의해 해제됩니다.
    객체는 new 연산자를 통해 생성되고, 생성된 객체의 주소는 참조 변수를 통해 접근됩니다.
    힙 메모리는 JVM이 시작될 때 정해진 크기로 설정되어 있으며, 필요에 따라 동적으로 확장될 수 있습니다.
    - 스택 메모리(Stack Memory):
    스택 메모리는 메서드 호출과 함께 자동으로 할당되는 지역 변수, 매개 변수, 메서드 호출 정보 등을 저장하는 영역입니다.
    스택 메모리는 후입선출(LIFO, Last-In-First-Out) 방식으로 동작합니다.
    메서드가 호출될 때마다 해당 메서드의 로컬 변수와 매개 변수가 스택에 할당됩니다. 메서드가 종료되면 해당 변수들은 스택에서 제거됩니다.
    메서드의 호출 정보는 스택 프레임(Stack Frame)에 저장되어 호출 스택(Call Stack)을 형성합니다.
    메서드 호출 시 새로운 스택 프레임이 생성되고, 메서드의 실행이 완료되면 스택 프레임이 제거됩니다.
    스택 메모리는 스레드마다 별도로 생성되며, 스레드의 수행을 지원합니다.
    스택 메모리의 크기는 스레드마다 할당된 스택 크기에 의해 결정됩니다.
    요약적으로, 힙 메모리는 동적으로 할당된 객체와 배열이 저장되는 영역이며, 가비지 컬렉션에 의해 관리됩니다.
    스택 메모리는 메서드 호출과 관련된 지역 변수, 매개 변수, 메서드 호출 정보 등을 저장하는 영역으로, 후입선출 방식으로 동작하며 스레드마다 별도로 생성됩니다.

  • 변수
    - 지역 변수 (Local Variables):
    지역 변수는 메서드, 생성자, 초기화 블록 등의 블록 내에서 선언된 변수입니다.
    지역 변수는 해당 블록 내에서만 접근 가능하며, 블록을 벗어나면 사용할 수 없습니다.
    메모리 스택(Stack)에 저장되며, 블록 내에서 선언된 순서대로 할당됩니다.
    지역 변수는 선언된 블록의 실행이 끝나면 메모리에서 자동으로 해제됩니다.
    매개변수도 메서드 내의 지역 변수로 간주됩니다.
    값 타입(기본형)의 변수이므로 값에 의한 전달(pass-by-value)로 동작합니다. 메서드에 전달될 때 값이 복사되며,
    메서드 내에서 변경되어도 호출자에게 영향을 주지 않습니다.
    - 참조 변수 (Reference Variables):
    참조 변수는 객체나 배열의 참조를 저장하는 변수입니다.
    힙 영역(Heap)에 실제 객체나 배열이 생성되고, 그 주소를 참조 변수에 저장합니다.
    참조 변수를 통해 해당 객체나 배열에 접근하고 조작할 수 있습니다.
    객체의 경우, null 값을 가질 수 있어 객체가 할당되지 않은 상태를 나타낼 수 있습니다.
    참조 변수는 메모리 스택(Stack)에 저장되며, 힙 영역의 객체나 배열을 참조합니다.
    참조 타입의 변수이므로 참조에 의한 전달(pass-by-reference)는 일어나지 않습니다. 메서드에 전달될 때 참조 값이 복사되며,
    메서드 내에서 참조된 객체의 상태가 변경되면 호출자도 영향을 받을 수 있습니다.
    요약적으로, 지역 변수는 해당 블록 내에서만 사용 가능하며 스택에 저장되고, 값 타입의 변수이므로 값에 의한 전달로 동작합니다.
    반면, 참조 변수는 객체나 배열의 참조를 저장하며 힙에 실제 객체나 배열이 생성되어 스택에 저장된 참조 변수로 참조됩니다.
    참조 변수는 참조 타입의 변수이므로 참조 값에 의한 전달로 동작하며, 메서드 내에서 참조된 객체의 상태가 변경될 경우 호출자도 영향을 받을 수 있습니다.

  • 표기법
    - 카멜 표기법 (Camel Case):
    카멜 표기법은 식별자의 첫 문자는 소문자로 시작하고, 그 뒤에 오는 단어의 첫 문자는 대문자로 표기하는 방식입니다.
    예시: myVariable, calculateResult, getUserInfo
    일반적으로 변수, 메서드, 함수 등의 이름을 작성할 때 사용됩니다.
    자바에서는 카멜 표기법을 일반적으로 사용합니다.
    - 파스칼 표기법 (Pascal Case):
    파스칼 표기법은 식별자의 각 단어의 첫 문자를 대문자로 표기하는 방식입니다.
    예시: MyClass, CalculateResult, GetUserInfo
    클래스, 인터페이스, 열거형 등의 이름을 작성할 때 주로 사용됩니다.
    자바에서는 클래스 이름을 작성할 때 주로 파스칼 표기법을 사용합니다.
    카멜 표기법과 파스칼 표기법은 가독성과 일관성을 높이기 위해 사용되는 네이밍 규칙입니다.
    주로 어떤 스타일을 사용할지는 개인, 팀, 언어, 프레임워크 등에 따라 다를 수 있습니다. 중요한 것은 코드베이스 전체에서 일관성을 유지하여 가독성을 높이고 협업을 원활하게 하는 것입니다.

  • 클래스
    - 클래스를 사용하여 여러가지 자료를 관리할 수 있다. -> 내가 표현하고자 하는 대상을 정의해서 자바한테 알려줘야 된다.
    [클래스명] [변수명] = new [클래스명](); // 객체 생성 -> 클래스(설계도)를 실체하는 인스턴스(객체)로 만드는 선언 : 배열과 비슷하다.
    int[] person = new int[5]; -> int[]자리만 클래스로 바뀜.
    • 클래스 내에 생성된 변수는 인스턴스 변수라고 하고 해당 클래스 안에서 공유된다.
    • 필드란 클래스 내부에 선언된 변수를 의미하며 클래스의 멤버 변수라고도 불립니다.

  • equals

    	```
    	String str1 = new String("Hello world!!");
    	String str2 = new String("Hello world!!");
    
    	System.out.println(str1);
    	System.out.println(str2);
    	System.out.println(str1 == str2);
    
    	// str1, str2는 참조값(주소값)
    	// heap 안에 만들어진 애들은 인스턴스나 객체라고 부른다.
    
    	// 주소를 비교 -> 만약에 두 변수가 동일한 주소를 가지고 있다면 같다고 나옴.
    	System.out.println("------------");
    	if( str1 == str2 ){

    System.out.println("str1과 str2는 같은 값을 가지고 있습니다.");
    }
    else{
    System.out.println("str1과 str2는 다른 값을 가지고 있습니다.");
    }

    	// 두 참조 변수가 가리키는 객체의 내용을 비교
    	System.out.println("------------");
    	if( str1.equals(str2) ){

    System.out.println("str1과 str2는 같은 값을 가지고 있습니다.");
    }
    else{
    System.out.println("str1과 str2는 다른 값을 가지고 있습니다.");
    }

    	```

자바 5일차

  • static
    static 변수는 클래스 수준의 변수로서(변수나 함수에 쓸 수 있음), 해당 클래스의 모든 인스턴스들이 공유하는 변수입니다. 즉, 클래스의 모든 객체들이 동일한 static 변수를 참조하며 값을 공유합니다.
    이때 모든 객체들 안에는 static 변수는 포함되지 않고 클래스 내의 동일한 static 변수를 참조한다.
    static 변수는 클래스가 로드될 때 생성되며, 프로그램이 실행되는 동안 메모리에 유지됩니다.
    static 변수는 클래스 이름을 통해 접근할 수 있으며, 클래스의 인스턴스를 생성하지 않고도 사용할 수 있습니다.
    클래스 내의 static 으로 만들어진 함수는 클래스 내의 static 으로 만들어진 변수를 써야된다.(물론 스태틱 함수 내부의 함수는 static을 쓸 필요는 없다.) -> 클래스 생성시 만들어지는 스태틱 함수 내의 변수는 객체 만들기 전의 변수를 사용할 수 없다는 말
    static 변수는 일반적으로 클래스 수준의 상수 또는 모든 인스턴스가 공유해야 하는 값을 저장하는 데 사용됩니다. 예를 들어, 다수의 객체가 공유하는 카운터 값이나 설정값 등을 static 변수로 정의할 수 있습니다.
    아래는 static 변수의 예시입니다

    	```

    public class Counter {
    private static int count = 0;

    public Counter() {
    count++;
    }

    public static int getCount() {
    return count;
    }

    public static void main(String[] args) {
    Counter c1 = new Counter();
    System.out.println(Counter.getCount()); // 출력: 1
    Counter c2 = new Counter();
    System.out.println(Counter.getCount()); // 출력: 2
    }

    		- 위의 예시에서 count 변수는 static 키워드로 선언되었습니다. 이 변수는 Counter 클래스의 모든 인스턴스들이 공유하는 변수이므로,
      Counter 객체가 생성될 때마다 count 값이 증가합니다.
      getCount() 메서드를 통해 count 값을 얻을 수 있습니다. 출력 결과로는 1과 2가 차례로 출력됩니다.
    

  • 생성자
    생성자(메서드)를 클래스 내부에 만들면 된다. -> 리턴타입이 없고 반드시 실행된다. // 클래스명과 동일하게 지으면 된다.
    만들지 않으면 자동으로 구현되어있고 숨겨져 있다.
    클래스명(){ ★★ 초기화 ★★ }

  • this -> this는 현재 실행 중인 메서드 또는 생성자 내에서 객체를 가리키는 특수한 참조입니다.
    - 클래스 내부에서만 사용 // 현재 인스턴스에 대한 참조를 제공
    - this는 현재 객체에 대한 참조를 가지고 있어 객체 내부의 멤버에 접근하거나 다른 생성자를 호출하는 등 객체와 관련된 작업을 수행하는 데 사용됩니다.

  • 상속
    - class [하위클래스] extends [상위클래스] { ... } -> '하위클래스는 상위클래스이다' 라는 명제가 성립이 되어야 한다.

  • 오버로딩(overloading : 과적)
    - 오버로딩(overloading)은 하나의 클래스 내에서 같은 이름의 메서드를 다양한 매개변수로 정의하는 것-> 코드의 가독성과 재사용성을 높일 수 있습니다.

      ```
    		int add(int a, int b) {

    return a + b;
    }

    		double add(double a, double b) {

    return a + b;
    }

    		int add(int a, int b, int c) {

    return a + b + c;
    }

      ```
  • 오버라이딩(overriding : 치환) : 상속 관계에서 상위 클래스의 메서드를 하위 클래스에서 재정의하는 것


자바 6일차

  • 객체 지향 3요소
    - 캡슐화 (Encapsulation): 관련된 데이터와 메서드를 하나의 단위인 객체로 묶는 것을 의미합니다.
    객체는 내부의 상태(데이터)를 숨기고 외부에 공개된 인터페이스(메서드)를 통해 상호작용합니다. 이를 통해 데이터의 무결성을 보호하고 코드의 유지보수성을 향상시킵니다.

    	- 상속 (Inheritance): 클래스 간의 계층적인 관계를 형성하여 코드를 재사용하는 방법입니다.
    	  상속을 통해 하위 클래스는 상위 클래스의 속성과 동작을 상속받아 사용할 수 있으며, 필요한 경우 상속된 멤버들을 재정의하거나 추가 기능을 구현할 수 있습니다.
    
    	- 다형성 (Polymorphism): 하나의 객체가 여러 가지 타입을 가질 수 있는 능력을 의미합니다.
    	  다형성은 상속과 밀접한 관련이 있으며, 부모 클래스의 타입으로 파생된 여러 클래스의 객체를 동일한 타입으로 다룰 수 있습니다. 이를 통해 유연하고 확장 가능한 코드를 작성할 수 있으며, 메서드 오버라이딩과 인터페이스를 통한 다형성을 구현할 수 있습니다.

  • 접근제어자
    - public: 가장 넓은 범위의 접근 제어자로, 해당 멤버는 어떤 클래스에서든 접근할 수 있습니다.
    - protected: 동일한 패키지 내의 클래스와 상속 관계에 있는 '하위 클래스'에서 접근할 수 있습니다.
    - default (접근 제어자를 명시하지 않은 경우): 동일한 패키지 내의 클래스에서만 접근할 수 있습니다.
    - private: 해당 멤버는 선언한 클래스 내에서만 접근할 수 있습니다.
    • public > protected > default > private

  • 업캐스팅과 다운캐스팅(형변환 중 오브젝트 형변환)
    형변환 기본 개념 : 더 큰(상위개념)이 작은 타입 안으로 들어갈 수 없기 때문에 작은 타입에 큰 타입을 집어 넣으려고 하면
    명시적으로 '()' 괄호 안에 해당 형태를 표시 해줘야된다. 반대로 큰 타입을 작은 타입으로 형변환 하려고 하면 자동으로 변환해준다.

    	```Cat cat = new Cat();
    	Animal animal = cat; // Cat 객체를 Animal 타입으로 업캐스팅
    	Animal animal = new Cat();
    
    		```
    Animal animal = new Cat(); // Cat 객체를 Animal 타입으로 업캐스팅
    Cat cat = (Cat) animal; // Animal 타입을 다시 Cat 타입으로 다운캐스팅

자바 7일차

  • 생성자
    	```
    	class 클래스명{
    	클래스명(){} -> 보이지 않더라도 자바에서 기본적으로 생성되는 것
    	클래스명(int i){생성자 내용추가} -> 이렇게 매개변수가 들어간 생성자를 만들었을때는 자바에서 기본으로 만들어준 생성자는 따로 만든 것이 없다면 없어지게된다.
    	}
    	```
    
    	```
    class 자식클래스 extends 부모클래스 {
    클래스명(){
    super();
    }
    -> 보이지 않더라도 자바에서 기본적으로 생성되는 자식 생성자 
    // 만약에 부모 클래스의 생성자가 매개변수를 포함한 생성자가 있다면 이 코드는 작동되지 않는다.
    기본 생성자가 없기 때문. 따라서
    		```
    클래스명(){
    		   		super(매개변수);
    		   } -> 이런식으로 부모클래스에 있는 형태에 맞는 기본 생성자를 호출해줘야된다. 여기서 super()는 부모 클래스의 생성자를 호출하는 메서드다.
    		}

  • 부모 자식간의 클래스에서 부모클래스에서 생성된 변수는 자식에서도 사용 가능하다.
  • 만약 부모클래스의 변수가 있고, 자식 클래스에서도 같은 이름의 변수를 생성한다면 변수는 오버라이딩 되지 않기 때문에 두개의 변수가 존재한다고 봐야된다.

자바 8일차

  • Object 타입은 자바의 모든 클래스를 포함하기 때문에 모든 타입의 값을 다룰 수 있습니다.

Object obj;
obj = 10; // int 타입
obj = "Hello"; // String 타입
obj = new ArrayList<>(); // ArrayList 타입
obj = true; // boolean 타입

  • Object 타입은 다형성(polymorphism)의 개념을 활용하여 여러 타입의 객체를 동적으로 다룰 수 있는 장점이 있습니다.
    그러나 Object 타입을 사용하면 컴파일러가 타입 체크를 수행하지 않으므로, 실제로 어떤 타입의 객체가 저장되어 있는지 확인하기 위해 타입 캐스팅이 필요합니다.

  • 제네릭(generic : 포괄적인)
    - 타입 안정성(Type Safety): 제너릭은 컴파일 시간에 타입 체크를 수행하여 잘못된 타입 사용을 방지합니다.
    컴파일러는 타입 매개변수를 이용하여 타입 검사를 수행하므로, 컴파일 시점에서 오류를 잡아내고 실행 시점에서의 ClassCastException과 같은 예외를 방지할 수 있습니다.

    	- 코드 재사용성: 제너릭을 사용하면 여러 종류의 타입에 대해 동일한 코드를 재사용할 수 있습니다. 하나의 제너릭 클래스나 메서드를 선언하면 다양한 타입에 대해 동작하는 코드를 작성할 수 있습니다.
    
    	- 컴파일 타임 타입 체크: 제너릭을 사용하면 타입 매개변수에 대한 타입 체크를 컴파일 시간에 수행하므로, 타입 안정성을 보장할 수 있습니다. 이로 인해 런타임에 발생할 수 있는 타입 관련 오류를 사전에 방지할 수 있습니다.
    
    	- 자동 형변환: 제너릭을 사용하면 컴파일러가 자동으로 형변환을 처리해줍니다. 타입 매개변수에 해당하는 실제 타입으로의 형변환을 개발자가 수동으로 처리할 필요가 없습니다.

  • 제네릭 사용법
    - 클래스에 선언 : class MyClass와 같이 선언 -> T(type의 약자)는 관습적인 변수명이고 다른 변수를 사용해도 된다.
    • 인스턴스 생성 시 : MyClass myObj = new MyClass();
    • 메서드에 선언 : public void myMethod(T param)

// 제너릭 클래스
class MyGenericClass<T> {
    private T data;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

// 제너릭 메서드
public <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.println(element);
    }
}

// 제너릭 타입 사용
MyGenericClass<Integer> myObj = new MyGenericClass<>();
myObj.setData(10);
int value = myObj.getData();

String[] stringArray = {"Hello", "World"};
printArray(stringArray);

자바 9일차

  • valueOf() : 문자열을 원하는 데이터 타입으로 변환해준다.
    - Double.valueOf(), Boolean.valueOf(), Float.valueOf() 도 있다. 이들은 각각 문자열을 double, boolean, float로 변환해준다.
    • 예시
      	```    
      	String numberStr = "123";
      	int number = Integer.valueOf(numberStr);
      	System.out.println(number);  // 123
  • valueOf()는 래퍼 클래스 간의 변환에서 자주 사용된다. -> int 값을 Integer 객체로 변환하여 반환 -> numberObj에는 Integer 객체가 저장
    	```
    	int number = 123;
    	Integer numberObj = Integer.valueOf(number);
    	System.out.println(numberObj);  // 123
    	```

  • nextLine()은 Scanner 클래스의 메서드로, 한 줄의 문자열을 입력 받을 때 사용됩니다. 여러 단어로 이루어진 문자열이나 공백이 포함된 문자열을 정확히 입력받고자 할 때 nextLine()을 사용하는 것이 좋습니다.
    nextLine()은 개행 문자를 포함한 한 줄의 문자열을 반환합니다.
    주의해야 할 점은, nextInt(), nextDouble() 등의 다른 입력 메서드를 사용한 후에 nextLine()을 호출할 때 개행 문자가 남아있는 경우가 발생할 수 있습니다.
    이를 방지하기 위해 nextLine()을 사용하기 전에 한 번 호출하여 개행 문자를 소비하는 것이 좋습니다.
    ☆★☆★ 숫자는 nextInt()로 받고 개행문자를 소비해야된다. ☆★☆★
    		  Scanner sc = new Scanner(System.in);
    		  System.out.print("이름을 입력하세요: ");
    		  String name = sc.nextLine();
    		  System.out.print("나이를 입력하세요: ");
    		  int age = sc.nextInt();
    		  sc.nextLine(); // 개행 문자 소비
    		  System.out.print("직업을 입력하세요: ");
    		  String occupation = sc.nextLine();
    		``` 
  • next() 메서드는 공백 문자(스페이스, 탭 등) 이전까지의 문자열을 입력받습니다. 따라서 띄어쓰기를 포함한 여러 단어로 이루어진 문자열을 입력받을 경우,
    next()는 첫 번째 단어까지만 인식하고 공백 이후의 단어는 무시합니다.
    또한, next()는 개행 문자(엔터)를 입력받지 않고 입력 스트림에 남겨둡니다.
    이러한 이유로 nextLine()을 사용하여 한 줄 전체를 입력받는 것이 바람직한 경우도 있습니다.

텍스트게시판 작업

  • 현재날짜 가져오는 방법
    - Java 날짜 및 시간 API의 java.time.LocalDate 클래스를 사용
    • LocalDate currentDate = LocalDate.now(); -> "YYYY-MM-DD" 형식(예: "2023-06-09")으로 현재 날짜가 출력
  • LocalDate 객체를 원하는 형식으로 변환하는 법 : java.time.format.DateTimeFormatter 클래스 사용
    	```
    // LocalDate 사용해서 현재 날짜 객체 생성
    LocalDate currentDate = LocalDate.now(); // 원하는 날짜 포맷 지정
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"); // 날짜를 지정한 포맷으로 변환
    String formattedDate = currentDate.format(formatter);

0개의 댓글