2/27 TIL

큰모래·2023년 2월 27일
0

Git

Add

  • 커밋할 파일을 인덱스(장바구니)에 넣어두는 것
  • 명령어
    • git add [파일명]
    • git add . : 현재 디렉토리에 있는 모든 파일을 add한다.

Commit

  • Git 저장소에 자신의 디렉토리에 있는 모든 파일에 대한 스냅샷을 기록하는 것
  • 게임에서의 세이브 포인트라 생각하면 편함 (진행상황에서 각각의 세이브 포인트를 남길 수 있다)
  • 각각의 커밋은 부모 커밋을 가리킨다.
  • 명령어
    • git commit -m "메시지"

Branch

  • 특정 커밋에 대한 참조 (하나의 커밋과 그 부모 커밋들을 포함하는 작업 내역)
  • //브렌치를 많이 만들어도 메모리나 디스크 공간에 부담되지 않는다.
// 참조에 대해 이해하기 쉬운 예시

Commit c0 = new Commit();    // c0 커밋
Commit c1 = new Commit();    // c1 커밋

Branch main = c1;  // main branch는 c1 커밋을 단순 참조할 뿐
  • 명령어
    - git branch [branch명] : 브렌치 생성
    - git branch -d [branch명] : 브렌치 삭제
    - git branch : 생성된 브렌치 확인
    - git checkout [branch명] : 해당 브렌치로 이동 (Head가 해당 branch를 가리킨다)
    - git checkout -b [branch명] : 위의 두 과정이 한번에 된다.
    - git log —-branches -—graph --oneline : 브렌치 그래프를 간략하게 보여준다.
        

Merge

  • 브렌치를 다른 브렌치로 합치는 과정
  • 명령어
    • git merge [A브렌치] : A브렌치를 현재 가리키는 브렌치로 합병한다.

기타 터미널 및 깃 명령어 (mac)

  • cd [경로] : 해당 경로로 이동
  • touch [파일명] : 파일 생성
  • rm -rf [파일명] : 파일 삭제
  • git log : 로그 확인

자바

char & String

char c = 'a';

String s = "abc"; 
  • char c = ‘a’
    • char 타입 변수 c에 ‘a’를 저장한다.
  • String s = “abc”
    • String 타입 객체 s에 “abc”를 저장하는 것이 아닌, “abc”를 다른 곳에 저장하고 참조하는 것이다.

String s1 = "하하";
String s2 = "하하";

System.out.println(s1 == s2);        //false
System.out.println(s1.equals(s2));   //true
  • s1 == s2
    • == 연산자 는 객체의 주솟값을 비교하여 비교하려는 객체가 동일한 객체인지를 판별한다.
  • s1.equals(s2)
    • equals 연산자 역시 주소값 비교를 수행하는 메서드이다.
    • true인 이유
      - 자바는 메모리 최적화를 위해 똑같은 값을 만들지 않고 최대한 재활용하는 기능을 가지고 있다.
      - 즉, s1을 선언할 때 만들어놓은 “하하”를 s2에서 재활용한다. 따라서 true가 나옴.



//1번 상황
String s = "*";  //선언
s += "*";        //연산
s += "*";        //연산
s += "*";        //연산
s += "*";        //연산
System.out.println(s); //출력 : *****

//2번 상황
StringBuilder sb = new StringBuilder();
sb.append("*");
sb.append("*");
sb.append("*");
sb.append("*");
sb.append("*");
System.out.println(sb.toString()); //출력 : *****
  • s += "*"
    • 기존 값에 * 을 추가한 문자를 계속 문자 저장공간에 저장한다. (String 불변성)
  • sb.append("*")
    • 처음 선언 시 * 을 저장, 이후 똑같은 값을 사용할 때 재활용한다.



toString()

  • Object 클래스를 확인해보면 toString() 메서드가 있는 것을 확인할 수 있다.
  • 자바의 모든 클래스는 자동으로 Object 클래스를 상속하므로 toString() 메서드 역시 사용할 수 있다.
  • 또한 toString() 메서드를 오버라이드하여 내가 원하는 대로 출력할 수도 있다.
	class Main {
			public static void main(String[] args) {
					사람 a사람1 = new 사람("홍길동", 22);
					사람 a사람2 = new 사람("홍길순", 23);
					System.out.println(a사람1); // 출력 : 사람[이름=홍길동,나이=22]
					System.out.println(a사람2); // 출력 : 사람[이름=홍길순,나이=23]
			}

	class 사람 extends Object {
			String 이름;
			int 나이;
			사람(String 이름, int 나이) {
				this.이름 = 이름;
				this.나이 = 나이;
			}
	
			@Override
			public String toString() {
				return "사람[이름=" + 이름 + ",나이=" + 나이 + "]";
			}
	}
  • System.out.println(a사람1)
    • 자바는 a사람1 객체를 자동으로 toString() 을 통해 String으로 바꿔서 출력해준다.



equals()

  • equals() 역시 Object 클래스의 메서드이다.
  • 객체들을 내가 원하는 비교항목을 통해 같은지 다른지를 판별하기 위해서는 equals()오버라이드 한다.

class 사람 {
	String 이름;
	int 나이;
	사람(String 이름, int 나이) {
		this.이름 = 이름;
		this.나이 = 나이;
	}
	
	@Override
	public boolean equals(Object o) {

		// 객체 o가 사람이 아니면 false
		if (!( o instanceof 사람)) {
			return false;
		}
		
		사람 other = (사람)o;
		
		// 두 사람의 이름이 다르면 false
		if(!this.이름.equals(other.이름)) {
			return false;
		}
		
		// 두 사람의 나이가 다르면 false
		if(this.나이 != other.나이) {
			return false;
		}
		
		// 위 세가지 조건을 모두 통과하면 true
		return true;
	}
	
	
}


객체화

  • 박싱 : 기본 타입 데이터에 대응하는 Wrapper 클래스로 만드는 동작
  • 언박싱 : Wrapper 클래스에서 기본 타입으로 변환
  • 현재 자바 최신버전에서는 자바 컴파일러가 박싱, 언박싱이 필요한 상황에서 자동으로 처리 해준다.
//기본 타입 -> Wrapper 클래스
int -> Integer
long -> Long
float -> Float
double -> Double

// Auto Boxing
int i = 10;
Integer iObj = i; 

// Auto UnBoxing
Integer iObj = new Integer(10);
int i = iObj;


static

  • 객체에 소속된 것이 아닌 클래스에 소속된 것
  • 객체는 static 메서드에 접근 가능하다. (역은 성립하지 않는다)
class Number {
		static int num1 = 0;
		int num2 = 0;
}

class Main {
		public static void main(String[] args) {
				Number A = new Number();
				Number B = new Number();
				
				A.num1++;
				A.num2++;

				B.num1++;
				B.num2++;

				System.out.println(A.num1);    // 출력 : 2
				System.out.println(A.num2);    // 출력 : 1

				System.out.println(B.num1);    // 출력 : 2
				System.out.println(B.num2);    // 출력 : 1

				// num1은 static 변수이므로 객체에서 공통으로 접근 가능하다.
				// 즉, A.num1 과 B.num1 은 공통된 static 변수를 가지므로 똑같은 값이다.
				// num2는 인스턴스 변수이므로 각각의 객체마다 고유한 값을 가진다.
		}
}


제네릭

  • 타입을 클래스 내부에서 지정하지 않고 외부에서 지정한다.
  • 같은 클래스를 사용하지만 타입을 다양하게 하고 싶을 때 사용할 수 있다.
  • a저장소1getter(), setter() 실행 시 Integer,int 타입의 값만 받을 수 있다.
  • a저장소2getter(), setter() 실행 시 Double,double 타입의 값만 받을 수 있다.
  • a저장소3getter(), setter() 실행 시 사과 타입의 값만 받을 수 있다.

class Main {
	public static void main(String[] args) {
		저장소<Integer> a저장소1 = new 저장소<>();
		a저장소1.setData(30);
		int a = a저장소1.getData();
		System.out.println(a);
		
		저장소<Double> a저장소2 = new 저장소<>();
		a저장소2.setData(5.5);
		double b = a저장소2.getData();
		System.out.println(b);
		
		
		저장소<사과> a저장소3 = new 저장소<>();
		a저장소3.setData(new 사과());
		사과 c = a저장소3.getData();
		System.out.println(c);
	}
}

class 저장소<T> {
	Object data;
	
	T getData() {
		return (T)data;
	}
	
	void setData(T inputedData) {
		this.data = inputedData;
	}
}

class 사과 {
}


Scanner

  • 자바 입력 class
  • sc.nextInt() : 입력값으로 숫자만 받을 수 있다.
    • 이때, 문자 입력 시 InputMismatchException 예외 발생
  • sc.nextLine()
    • sc.nextInt()\n(엔터키) 이전 숫자만 입력 받기 때문에 버퍼에 \n 이 남아있게 된다.
    • 이 상태에서 다음 입력값을 받으려 하면 버퍼에 남아있는 필요 없는 \n 을 입력값으로 받아버림.
    • 따라서, sc.nextLine()을 실행시켜 버퍼에 남은 \n을 제거한다.
    • 제거하지 않으면 무한루프에 빠짐.
  • InputMismatchException
    • 지정한 변수 타입과 다른 타입의 변수를 받았을 때 생기는 예외
  • sc.close()
    • 입력을 받을 때 파일을 통해 입력받는 경우도 있다. 이 경우, 파일을 닫지 않으면 해당 파일이 손상되거나 이후 다른 파일을 열때 차질이 생길수 있음. 따라서 스캐너를 닫아 리소스를 해제시킨다.
import java.util.InputMismatchException;
import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int input = 0;

        while ( true ) {
            System.out.printf("숫자 : ");

            try {
                input = sc.nextInt(); // 대기, 숫자 하나 입력될 때 까지
                sc.nextLine(); // 버퍼를 비운다.
                break;
            }
            catch ( InputMismatchException e ) {
                sc.nextLine(); // 버퍼를 비운다.
                System.out.println("숫자를 입력해주세요.");
            }
        }

        System.out.printf("입력된 숫자 : %d\n", input);

        sc.close();
    }
}
profile
큰모래

0개의 댓글