TIL. 배열 심화, 5일차 클래스의활용

hyuko·2023년 1월 6일
0

Java

목록 보기
17/26

배열 심화

  • 기존의 배열은 배열의 길이가 정해지면 그 배열은 길이가 연장이 되지않는다.

  • 문제 해결 : 배열의 길이가 고정되어 있을 때 배열을 연장하는 코드

// 기존 배열에 있는 값을 새로운 배열에 넣는 메소드
	public static void transferArray(int[] oldArray, int[] newArray) {
		for(int i = 0; i < oldArray.length; i++) {
			newArray[i] = oldArray[i]; // 새로운 배열에 기존의 배열에 있는 값을 옮기는 작업
		}
		
	}
	
	// 배열을 추가하는 메소드
	public static int[] addArrayLength(int[] array) {
		int[] newArray = new int[array.length + 1]; // 새로운 배열을 만듬 본래 배열의 길이 플러스 하나
		transferArray(array, newArray); // 기존의 배열과 새로운 배열을 넣어 작업한다.
		return newArray;
	}
	
	// 데이터를 추가하는 메소드
	public static int[] addData(int[] array, int data) {
		int[] newArray = addArrayLength(array); // 배열의 길이를 연장시키는 작업
		newArray[array.length] = data;
		return newArray;
	}

	public static void main(String[] args) {
		
		int[] nums = new int[0];
		
		nums = addData(nums, 1);
		nums = addData(nums, 2);
		nums = addData(nums, 3);
		nums = addData(nums, 4);
		nums = addData(nums, 5);
		
		for(int i = 0; i < nums.length; i++) {
			System.out.println(nums[i]);
		}
		
		
	}

기존의 배열은 0의 길이를 가지는 배열을 가지고 있고
이 배열의 길이를 하나 연장시키는 새로운 배열을 만들어서
본래의 배열에 있던 정보를 넣어주는 식으로 하면 된다.
위의 코드는 그것을 기능별로 메소드를 나누어 표현했다.

  • 코드 실행시 나오는 결과콘솔화면

배열을 이용해 간단한 시스템만들기

  1. 클래스의 활용

    • 클래스는 기능에 따라 구분이 된다.
    • 정보를 담는 클래스와 기능/로직을 담는 클래스로 나눈다.
    • 정보를 담는 클래스는 보통 Entity 클래스라고 부른다.
  2. 시스템을 실행할 클래스와 정보를 담는 클래스, 정보를 저장하는 클래스 , 서비스,로직을 담는 클래스로 나누어준다.

  3. 위 2번의 과정에 대한 클래스의 나눈 모습입니다.

위의 캡쳐 사진에서 볼 수 있듯이 기능에 따라서 클래스를 나누어 주었다.
User 클래스는 Entity 정보만을 담고 있는 클래스
UserMain은 실행을 위한 클래스
UserRepository는 User클래스의 정보를 저장하는 클래스
UserService는 저장된 정보를 바탕으로 로직을 담고 있는 클래스

  • User 클래스 코드
private String username;	// 사용자이름(아이디, 계정)
	private String password;	// 사용자비밀번호
	private String name;		// 실제이름(성명)
	private String email;		// 이메일
	
	public J12_User() {} 		// ctrl + spacebar
	
	// alt + shift + s -> generated constructor using fields
	public J12_User(String username, String password, String name, String email) {
		this.username = username;
		this.password = password;
		this.name = name;
		this.email = email;
	}

	// alt + shift + s -> generated Getters and Setters
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	// alt + shift + s -> generated toString(); 정보에는 클래스명, 변수에 어떤 값이 담겨 있는지 표현해준다. 
	//	이전까지 했던 printInfo 메서드와 비슷한 개념
	
	@Override
	public String toString() {
		return "J12_User [username=" + username + ", password=" + password + ", name=" + name + ", email=" + email
				+ "]";
	}

User라는 객체에 필요한 정보만 가지고 있다.
변수들을 모두 전역으로 설정하여 클래스내에서는 어디서든 쓸 수 있게
해놓는다.

  • UserRepository 클래스
private J12_User[] userTable;

	public J12_UserRepository(J12_User[] userTable) {
		this.userTable = userTable;
	}
	
	public J12_User[] getUserTable() {
		return userTable;
	}
	
    // 저장
	public void saveUser(J12_User user) {
		extendArrayOne();
		userTable[userTable.length - 1] = user;
	}
	
    // 배열의 길이를 연장
	private void extendArray(int length) {
		J12_User[] newArray = new J12_User[userTable.length + length];
		trasferDataToNewArray(userTable, newArray);
		userTable = newArray;
	}
	
    // 배열의 길이를 하나 연장
	private void extendArrayOne() {
		J12_User[] newArray = new J12_User[userTable.length + 1];
		trasferDataToNewArray(userTable, newArray);
		userTable = newArray;
	}
	
    // 이전 배열에서 새로운 배열에 값을 대입하는 메소드
	private void trasferDataToNewArray(J12_User[] oldArray, J12_User[] newArray) {
		for(int i = 0; i < oldArray.length; i++) {
			newArray[i] = oldArray[i];
		}
	}

위의 코드를 보면 알 수 있듯이 User의 정보를 저장하기 위한
변수와 메소드기능이 담겨져 있다.

  • UserService 클래스
private Scanner scanner;
	
	public J12_UserService() {
		scanner = new Scanner(System.in);
	}
	
	public void run() {
		boolean loopFlag = true;
		char select = '\0';
		
		while(loopFlag) {
			showMainMenu();
			select = inputSelect("메인");
			loopFlag = mainMenu(select);
		}
	}
	
	public void stop() {
		for(int i = 0; i < 10; i++) {
			try {
				Thread.sleep(500);
				System.out.println("프로그램 종료중....(" + (i + 1) + "/10)");
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("프로그램 종료");
	}
	
	private char inputSelect(String menuName) {
		System.out.println(menuName + "메뉴 선택: ");
		char select = scanner.next().charAt(0);
		scanner.nextLine();
		return select;
	}
	
	private void showMainMenu() {
		System.out.println("========<< 메인메뉴 >>========");
		System.out.println("1. 회원 전체 조회");
		System.out.println("2. 회원 등록");
		System.out.println("3. 사용자이름으로 회원 조회");
		System.out.println("4. 회원 정보 수정");
		System.out.println("==============================");
		System.out.println("q. 프로그램 종료");
		System.out.println();
	}
	
	private boolean mainMenu(char select) {
		boolean flag = true;
		
		if(isExit(select)) {
			flag = false;
		
		}else {
			if(select == '1') {
				
			}else if(select == '2') {
				
			}else if(select == '3') {
				
			}else if(select == '4') {
				
			}else {
				System.out.println(getSelectedErrorMessage());
			}
		}
		System.out.println();
		
		return flag;
	}
	
	private boolean isExit(char select) {
		return select == 'q' || select == 'Q';
	}
	
	private String getSelectedErrorMessage() {
		return "###<<< 잘못된 입력입니다, 다시 입력하세요. >>>###";
	}

위의 서비스 클래스에서는 실행메소드가 있고, 그 실행 메소드 안에서
실행되는 메소드는 메인함수에서 사용되지 않기 때문에 private로
정보은닉을 해준다. 그리고 서비스 클래스 즉 서비스 로직을 담고 있는
클래스의 경우에는 전역변수를 최소한으로 하고 각각의 기능을 담고있는
메소드 지역에서만 사용이 될 수 있도록 지역변수 선언을 활용한다.

  • 실행을 위한 UserMain 클래스
public static void main(String[] args) {
		J12_UserService service = new J12_UserService();
		
		service.run();
		service.stop();
		

	}

실행 클래스는 정말 딱 실행만을 위한 클래스 이기 때문에
최소한의 호출과 메소드 실행으로 실행되어야한다.

  • 메인 실행후 콘솔화면

정리

어떠한 프로그램을 만들 때는 클래스 별로 기능에 따라 나누어져
정보를 가지고있는 클래스, 저장하는 클래스, 로직을 담고있는 클래스 등으로 나누어 사용해야 한다.
그리고 메소드는 메소드 명을 보기만 해도 무슨 기능을 하는지 알아야한다
(메소드의 기능은 명확해야한다.)

profile
백엔드 개발자 준비중

0개의 댓글