2024. 8. 28. 01:36ㆍJava 문법만 배운 뒤 [전화번호부]프로그램 만들기
1. Java 문법만 배운 뒤 [전화번호부]프로그램 만들기
1. 콘솔창을 통한 저장/조회/관리(수정-삭제) 기능을 개발.
System.in이 무엇이고 어디에 좋고..
이러한 설명은 검색을 통해서 배우는게 정확하고 맞다고 생각해서, 연관 지식은 키워드를 던지기만 하려고 한다.

샘플 코드가 Main.java로 되어 있어서 PhoneBook.java 로 변경한다.
실제 파일명과 class명이 일치해야 하는 것은 Java 규칙이다.

자동완성은 [컨트롤 + 스페이스] 누르면 나옴.
왼쪽에 재생 버튼은 딱봐도 실행이다.
import java.util.Scanner;
public class PhoneBook {
public static void main(String[] args) {
System.out.println("전화번호부 Ver 0.1");
while(true) {
System.out.println("기능을 선택하세요. \n1.신규등록\n2.조회\n3.관리\n4.프로그램 종료");
Scanner s = new Scanner(System.in);
int input = s.nextInt();
if(input == 4) {
break;
}
}
}
}"문자열" 에 \n = 줄바꿈, \t = 탭 추가 등등 여러가지가 있다.
다른 언어에서도 공용으로 쓰이는데 궁금하면 개행문자, n 줄바꿈 등으로 검색 ㄱ

[재생버튼 누르면 돌아가는 원리 생각나는대로 적어봄]
Java는 위에처럼 public class의 main에서부터 프로그램을 실행하기로 약속 해놨다.
실행 => IDE가 뒤에서 묵묵히 JDK로 컴파일
=> PhoneBook.class 생성(빌드)
=> javaw.exe 라는거를 사용해서 그 클래스를 실행하면
=> JDK안에 같이 설치되어 있는 JRE가 실행해 줌.
=> JVM이라는 Java 가상 머신내에 메모리로 프로그램 적재도 하고 운영체제한테 부탁해서
=> 프로세스(프로그램이 처리? 동작하는 상태)로서 기능을 한다.
쓰레드라는 개념이 있는데, 위에 순서까지 동작하면서 JVM은 main Thread 라는것을 무조건 1빠로 찾아서 실행하기로 약속해놨단 말이다.
CPU 사봤으면 옛날에 인텔 4코어 8쓰레드 이런말 들어봤을 것임. 효율적인 처리를 위해 프로그램 코드를 나눠놓고 쓰레드 바꿔치기 해가면서 작업하는데, 이건 운영체제가 일하는 방식을 공부하면 자세히 나오던 것 같다.
그래서 컴퓨터공학 공부하라고 하는듯.
4를 누르면 break; 를 실행하고, 무한 while에서 벗어나서 main 쓰레드가 할 일이 없어서 종료된다.
( System.out.print("dd"); 만 적고 수행하면 출력 찍고 나서 종료되듯이 )
먼저 신규등록 기능부터,
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class PhoneBook {
public static void main(String[] args) {
System.out.println("전화번호부 Ver 0.1");
Map<String, String> repository = new HashMap<>();
program: while(true) {
System.out.println("기능을 선택하세요. \n1.신규등록\n2.조회\n3.관리\n4.프로그램 종료");
Scanner s = new Scanner(System.in);
int input = s.nextInt();
switch (input) {
case 1: System.out.println("===신규등록===");
System.out.println("성명, 전화번호를 순서대로 입력하세요.\n이름:");
String name = s.nextLine();
System.out.println("전화번호:");
String phoneNumber = s.nextLine();
repository.put(name, phoneNumber);
System.out.println("저장 되었습니다.\n전체 목록:" + repository.toString());
break;
case 4:
System.out.println("===종료===");
break program;
}
}
}
}전화번호부는 이름 넣으면 번호 찾고 연락하는게 목적이니 Map에 넣으면 딱 적당할 것 같다.
변수명을 고민하는 척 하다가, "저장소" == Repository 라고 하길래 하나 선언.
근데 위 코드는 버그가 있다.

띠용, 나는 이름 안넣었는데, 이름 부분 코드가 안멈춰있고 전화번호까지 넘어간다.
\n 줄바꿈이 들어가서 그런가, nextLine은 줄바꾸는 걸 인식하는 놈이라 그런것일까? (아님)
디버그 기능 사용법을 여기서부터 배워서 쓰면 좋을것 같다.
실은 디버그에만 의존하면 또 안되고, 왜 그런지 애초에 알아야하지만, 또 멈춰가면서 빨리빨리 해결되면 조크든여.

저기 문제되는 부분에서 멈추게 하려면 15라는 줄 번호 숫자를 클릭한다. 그러면 BreakPoint 멈추는 점이 빨갛게 나온다. 거의 IDE 공통.
그리고 나서, Run 이 아니라, Debug를 실행하면 저기를 실행하기 직전에 실제 프로그램이 멈추고, 그곳까지의 메모리에 담긴 내용 등등이 나온다.

우상단에 현재 실행중이라서, 첫 번째 버튼은 껐다가 켜는 버튼으로 돼 있고, 가운데 De-Bug 벌레잡기 모드의 버튼이 보인다.
진짜 옛날 컴퓨터는 실로 짜고 뭐 그랬는데 벌레 끼여서 안돌아가서 그거 제거하면서 디버그라고 유래가 있다 함.
그러고 보니 Thread도 실이라는 뜻이고, 같은 유래이다.
한 붓 그리기처럼 실 하나가 어떤 단위 동작을 수행했을 것을 추측해보면서 공감각 기억을 하자.
벌레 누르면, 프로그램 종료 => (디버그 모드로) Run 된다. => 그럼 순서대로 실행하다가 점 찍은곳에 좀 들여다 보라고 멈춤.

생각해보니 switch에 찍어야 걸린다. 잘못 찍어서 다시 점찍었고, 디버그로 실행되어서 재수행은 안해도 된다.
1 쓰고 엔터치면 switch에 걸릴듯.

딱! 잡아서 일러 바치는 상태가 됨.
input에 뭐가 들어있고, 스캐너도 만들었고 레포지토리 라고 선언된 거 있는데 속살은 HashMap이고.. 어쩌고 저쩌고
@1066 이런거는 실제 위치한 메모리 주소값이다. 값은 같은데 실제로 다른 메모리에 들어있는것은 중요한 정보니께.

디버그창 벌레모양버튼 활성화 되면 나오는데 저 화살표가 핵심이다.
초록색 재생 버튼은 F8이고 스텝오버부터 F6 , F5, F7 순서인데,
F8은 다음 중단점까지 쭈우욱 수행해라.
F6은 지금 잡아둔 줄을 수행해라
F5는 지금 잡아둔 줄에서 수행하는거 어떻게 되어있나 보게 그 구현 안으로 들어가라 (스텝인투)
F7은 들어갔을 때 쓰는데, 나와라
이다.
들어가고 나가는건.. 뭐 예를 들어 어떤 코드가 appleService.calculate("123", 456); 이런식으로 잡혔을 때 F5 누르면,
public class AppleService {
. . . . 이런 저런 코드들 ....
public String calculate( String a1, int b1 ) {
Sout( a1 + b1 ); <<<<<<<<<<< 딱 여기 잡고 기다린다. F7 누르면 안에 내용물 다 수행하고 방금 거기로 나옴.
}
}
암튼 F6 누르면 다음줄 수행인데 input 이 1이라서 case 1 로 찾아가는것 까지 하고 또 기다린다. F6은 계속 다음 다음 다음 하는거라고 보면 됨.


원래 멈추고 콘솔로 이동 후 내가 1, 엔터 입력해야 "전화번호: .." 이 부분으로 다시 걸리는게 티키타카인데,
그냥 넘어간다는 것만 알았다. Scanner s 에 대해 볼 수 있길래 클릭했더니 그 스캐너에 들어있는 기본값들이 보인다. (초기화 시, 생성자의 기본값 세팅으로 생성된 상태)
생각해보니, 윈도우 OS에서는 엔터를 입력하면 CR 캐리지리턴 + LF 라인피드 ? 이렇게 두번 입력하게 동작한다.
맥은 LF인가 하나만 써서 줄바꿈을 동작하고. 리눅스는 또 뭐 다르고.. 알고만 있다가 외우진 말고 검색해서 쓰자.
나는 운 좋게 알고 있던 내용이여서 아래처럼 수정 후 정상 동작.
연관 없어 보이는 내용도 일단 흡수해두면 도움이 될 때가 많다
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class PhoneBook {
public static void main(String[] args) {
System.out.println("전화번호부 Ver 0.1");
Map<String, String> repository = new HashMap<>();
program: while(true) {
System.out.println("기능을 선택하세요. \n1.신규등록\n2.조회\n3.관리\n4.프로그램 종료");
Scanner s = new Scanner(System.in);
int input = s.nextInt();
switch (input) {
case 1: System.out.println("===신규등록===");
System.out.print("성명, 전화번호를 순서대로 입력하세요.\n이름:");
s.nextLine();
String name = s.nextLine();
System.out.print("전화번호:");
String phoneNumber = s.nextLine();
repository.put(name, phoneNumber);
System.out.println("저장 되었습니다.\n전체 목록:" + repository.toString());
break;
case 4:
System.out.println("===종료===");
break program;
}
}
}
}===신규등록===
성명, 전화번호를 순서대로 입력하세요.
이름:YG
전화번호:010112
저장 되었습니다.
전체 목록:{YG=010112}
기능을 선택하세요.
1.신규등록
2.조회
3.관리
4.프로그램 종료
이제 map.put 으로 등록 했으니, map.entrySet()을 반복문 돌리면서 예쁘게 조회도 하고, remove도 구현해주면 일단은 전화번호부 프로그램 기능이 구현되겠다.
'Java 문법만 배운 뒤 [전화번호부]프로그램 만들기' 카테고리의 다른 글
| 0. Java 문법만 배운 뒤 [전화번호부]프로그램 만들기 (0) | 2024.08.28 |
|---|