TIL - 전역변수 | 정렬 출력 | Git add

su·2023년 5월 30일
0

TIL

목록 보기
11/93
post-thumbnail

문제1 - 대기 번호 출력하기

1) 문제

현재 진행하고 있는 개인 과제는 키오스크를 만드는 것이다.
어느정도는 구현이 된 상태인데, 대기 번호를 출력하는 곳에서 막혀버렸다.
몇 번째 주문인지를 파악해야 한다는 점인데,
그렇다면 ,,, 이 사람이 실질적으로 Order 하고 나서 주문번호가 count 되어야 한다.
그리고 증가된 주문번호를 무사히 출력해주어야 한다.

2) 시도

온통 메소드들 투성이라, 어디에 변수를 생성하고 값을 추가해주면 좋을 지 고민이 되었다.
실행할 메소드 안에다 변수를 생성한다면, 그 메소드를 실행할 때마다 변수가 초기화되어
대기번호를 늘리면서 출력하는 의미가 사라질 것이다. 그렇다면 ..?

출력할 메소드들을 작성해둔 클래스(MyMenu) 내에 필드를 생성해보자 !

private int countNumber = 0;

이렇게 각 메소드 안에 생성하는 것이 아닌
클래스 내부에 위쪽에 필드를 선언해 주었다.
초기값은 0으로 설정하고, 주문이 완료될 때마다 대기번호를 하나씩 증가하는 메소드를 만들어보자!

public void setCountNumber(int i){
	this.countNumber += i;
}

setCountNumber(int i) 메소드를 통해서 값을 수정해주면 되지 않을까? 하는 생각이 들어서 코드를 이렇게 작성해 보았다.

// 메소드를 실행하고
setCountNumber(1);
System.out.println("대기번호: " + this.countNumber);

그리고 실행했더니 원하는 대로 출력이 잘 되었다 ..!
그런데 ,, 다시 가만 생각해보니 메소드가 필요한가 ..? 싶었다.

3) 해결

그렇다. setter 메소드는 필요가 없다 ...
습관처럼 private으로 선언한 필드의 값을 설정해주기 위한 setter 메소드를 만들어버린 것이다.
이 클래스에서 생성된 필드를 다른 클래스에서 값을 수정할 일이 없는데도 말이다.

그래서 setCountNumber() 메소드를 과감하게 지워버렸다.
그리고 아래에서 작성했던 코드를 수정했다.

countNumber += 1;
System.out.println("대기번호: " + this.countNumber);

원하는 대로 실행이 잘 되는 것을 확인할 수 있었다 !

4) 배운 점

객체, 인스턴스의 내용이 정말 중요하다는 점을 다시 한 번 깨달았다.
그 객체 안에서 돌아다니는 내용들이기 때문에, 해당 클래스 내에 변수를 선언해두고
값을 추가해주면 값이 초기화 될 일 없이 계속해서 증가함을 확인할 수 있었다.

접근 제어자를 private으로 선언해두고, 굳이 setter 메소드를 또 만들어서
그 클래스 내에서 사용하도록 하는 실수는 .. 하지 않도록 해야겠다.

문제2 - 정렬해서 출력하기

1) 문제

과제에서 보여준 출력 화면처럼 만들기 위해서는 출력할 값들을 정렬해야 겠다고 생각했다.
출력할 때 보통 System.out.println(); 메소드를 사용하지만,
정렬해서 사용 가능한 System.out.prinf(); 를 사용하여 출력하려고 했다.

2) 시도

// 출력 부분을 고치고자 코드를 따로 빼서 실행해보았다.
List<Goods> goodsListCoffee = Arrays.asList(
        new Goods("1." , "아메리카노", 5.0, "에스프레소와 물의 컴비네이션"),
        new Goods("2.", "카페라떼", 5.8, "에스프레소와 우유의 컴비네이션")
        ); // goodsListCoffee

for (Goods good: goodsListCoffee) {
    System.out.printf("%-2s %-15s %1s %5s %1s %s\n",
    good.getNum(), good.getName(), "|", "W "+good.getPrice(), "|", good.getDetail());
}

전부 문자열로 선언을 해둔 터라 "%s"를 이용해서 정렬해놓으면 원하는 대로 출력 가능할 것이라고 생각했는데, 아니었다..

왜 ... 왜 저렇게 .. 교묘하게 빗겨나간 상태로 출력이 되는 것일까 ..?
뒤쪽에 다른 부분들은 올바르게 정렬이 되어 출력되는 것 같은데,
good.getName() 부분에서 정렬이 잘못 되고 있는 듯 하였다.
%-숫자 면 왼쪽정렬되어 빈 부분이 오른쪽에 채워지고,
%숫자 면 오른쪽정렬되어 빈 부분이 왼쪽에 채워진다고 알고 있어서 - 숫자를 사용한건데,,
문자열을 정렬해서 출력하려면 다른 방법을 사용해야 하나 ..? 싶었다.

String.format이라는 함수가 있길래 따로 사용해보았다

// for문만 수정 !
for (Good good: goodsListCoffee) {
	String name = String.format("%-20s", good.getName());
    System.out.printf("%-2s %-1s %1s %5s %1s %s\n",
                      good.getNum(), good.getName(), "|",
                      "W "+good.getPrice(), "|", good.getDetail());
}

결과는 ? 마찬가지다 .. 대체 뭐가 문제인건지..

왼쪽 정렬 자체는 잘 되었고, 문제는 절대값만큼의 자리를 차지하지 못하면 그 만큼을 공백으로 채워주어야 하는데, 공백의 크기가 일반 문자열의 크기와 달라서 그런가 ..?
그냥 안된다.. ^^ 하 ㅠㅠ

3) 해결

CY 스승님께서 해결책을 보내주셨다 !!
한글이 아니라 영어로 고쳐서 출력하면 올바르게 출력된다고 한다.
몹시 반가운 마음에 바로 코드를 수정해 보았다.

List<Goods> goodsListCoffee = Arrays.asList(
        new Goods("1." , "
Americano", 5.0, "에스프레소와 물의 컴비네이션"),
        new Goods("2.", "Cafe Latte", 5.8, "에스프레소와 우유의 컴비네이션")
        ); // goodsListCoffee
        
for (Goods good: goodsListCoffee) {
	System.out.printf("%-2s %-20s %s %-5s %s %s\n",
                      good.getNum(), good.getName(), "|",
                      "W " + good.getPrice(), "|", good.getDetail());
}

코드를 이리저리 바꿔봤던 시도가 무색할 정도로 완벽하게 출력된다.

깔끔하게 정렬된 결과를 얼마나 바랐는데.. 드디어 원하던 결과로 출력이 되었다.
그런데 한글로는 정말 안되는걸까?

CY 스승님께서 자료를 선물해주셨다.
참고: https://daewonyoon.tistory.com/322
한글 등의 문자의 폭이 영문 문자의 2배라는 점을 기본 문자열 포매팅에서는 고려하지 않아 발생하는 일이라고 한다. (한글도 고려해줘 ...)
이 현상을 수정하기 위해서는 문자열이 실제로 몇 칸을 차지하는지 폭을 계산해주어야 한다고 한다.

4) 배운 점

자바에서 기본 포매팅을 사용할 때, 한글은 폭이 영문문자의 2배라는 사실을 고려하지 않기 때문에 정렬 시 원하는대로 정렬 결과가 출력되지 않는다는 점을 알게 되었다.
맨 뒤쪽에 출력하는 detail의 경우, 문자와 문자 사이에 껴 있지 않아 특별하게 정렬할 필요가 없기 때문에 그냥 출력해주어도 되지만,
중간에 껴있는 메뉴명의 경우 한글이라 원하는 대로 출력이 되지 않는다는 사실을 알게 되었다.
현재는 메뉴명을 영어로 바꾸는 방법을 채택했지만, 한글을 사용해서도 정렬할 수 있는 방법을 더 찾아봐야겠다.

Git에 폴더 전체 add 하기

문제 및 해결

gitHub에 내가 만든 프로젝트를 올리고자 레퍼지토리를 생성하고,
git bash 창을 켜서 파일을 더해주고 커밋하려고 했다.
그런데 전체 폴더를 더하면 편할 것 같아서 ... 검색해봤다 !

$ git add .

생각보다 간단한 명령어였다 ..
지난번에는 확인할 겸 파일을 하나씩 정성스럽게 더해주었는데 ..
이제 그렇게 하지 않아도 된다 !

git에 파일을 올리는 법을 다시 정리해보려고 한다.

  1. 깃허브에 레퍼지토리를 생성한다.
  2. 내 컴퓨터의 파일로 돌아와 올리고 싶은 프로젝트 폴더 안에서 git bash를 열어준다.
  3. git init으로 .git 숨김 폴더를 생성해준다.
  4. 내가 만든 레퍼지토리에서 $ git remote add origin ~ 명령어를 실행한다.
  5. $ git branch –M main 를 실행한다.
    (브랜치의 이름을 main으로 바꾸는 명령어)
  6. $ git add . 를 실행한다.
    (해당 폴더의 모든 파일을 추가한다)
  7. $ git commit -m "commit message"
    (add한 파일들에 대한 커밋을 작성한다)
  8. $ git push -u origin main
    (main 브랜치로 push하는 명령어)

맨 처음에 이렇게 실행해두면, 해당 폴더(프로젝트) 내에서는
파일을 더하고, 커밋하고, 푸쉬만 해주면 된다 !
계속해서 git을 사용해야 하기 때문에 까먹지 않도록 자주 보고 사용하는 것이 좋을 것 같다.

profile
(❁´◡`❁)

0개의 댓글