본문으로 바로가기

문제상황:
다음은 전화번호부 프로그램의 일부입니다. Friend 클래스와 Main 클래스는 모두 같은 패키지(main) 안에서 구현되어 있으며, 프로그램 실행시 오류가 발생합니다.

<Main 클래스>

package main;


import java.util.ArrayList;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		ArrayList<Friend> list = new ArrayList<Friend>();
		Scanner in = new Scanner(System.in);

		int menuNo = 0;
		while(menuNo != 3) {
			System.out.println("< 기능을 선택하세요 > ");
			System.out.println("1. 전화번호부에 추가");
			System.out.println("2. 저장된 번호 보기");
			System.out.println("3. 종료");
			menuNo = in.nextInt();
			
			if(menuNo == 1 ) {
				Friend user = new Friend();
				System.out.println("사용자 이름을 입력하세요");
				String name = in.next();
				user.name = name;
				
				System.out.println("전화번호를 입력하세요");
				String phone = in.next();
				user.phone = phone;
				
				list.add(user);
				System.out.println("성공적으로 추가되었습니다.");
				
			}
			
			if(menuNo == 2) {
				for(Friend f : list) {
					System.out.println(f.name + "\n" + f.phone);
					System.out.println("-");
				}
			}
		}

	}

}

<Friend 클래스>

package main;

public class Friend {
	private String name;
	private String phone;
	
	public String getName() {
		return this.name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getPhone() {
		return this.phone;
	}
	
	public void setPhone(String phone) {
		this.phone = phone;
	}

}

 

에러의 이유:
위 프로그램에서 에러가 발생하는 이유는 Friend 클래스에서 "private" 접근제한자로 선언된 멤버변수를 Main 클래스에서 직접적으로 접근하려 했기 때문에 발생합니다.

private로 선언된 멤버변수는 다른 클래스에서 접근 및 수정할 수 없으며, 자식 클래스에게 상속되지도 않고 오직 부모 클래스에서만 사용이 가능합니다. 이때문에 Main 클래스에서는 Friend의 name과 phone 클래스가 감추어져 있기 때문에 에러가 발생하는 것입니다.

에러의 해결:
(1) 간단하게 Friend 클래스에서 private가 아닌 public으로 멤버변수를 선언하면 에러가 해결됩니다. 하지만 이는 권장되지 않습니다. 대규모 프로젝트나 다수가 참여하는 프로젝트에서 각각의 클래스에서 어떤 이름으로 변수를 선언했는지 기억하는 것은 무리이기 때문에 접근 제한자와 Getter, Setter를 이용하는 것인데, public을 사용하면 그 의미가 없기 때문입니다.

(2) Getter (Friend클래스에서 public으로 정의된 getName, getPhone 메서드)와 Setter (setName, setPhone 메서드)를 이용하여 값에 접근하도록 수정합니다. 메인클래스의 코드중에 user.name = name; 처럼 멤버변수에 직접 접근하는 코드들을 모두  user.setName(name); 와 같은 Getter와 Setter를 사용하도록 수정합니다.

//수정된 Main 클래스

package main;


import java.util.ArrayList;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		ArrayList<Friend> list = new ArrayList<Friend>();
		Scanner in = new Scanner(System.in);

		int menuNo = 0;
		while(menuNo != 3) {
			System.out.println("< 기능을 선택하세요 > ");
			System.out.println("1. 전화번호부에 추가");
			System.out.println("2. 저장된 번호 보기");
			System.out.println("3. 종료");
			menuNo = in.nextInt();
			
			if(menuNo == 1 ) {
				Friend user = new Friend();
				System.out.println("사용자 이름을 입력하세요");
				String name = in.next();
				user.setName(name);
				
				System.out.println("전화번호를 입력하세요");
				String phone = in.next();
				user.setPhone(phone);
				
				list.add(user);
				System.out.println("성공적으로 추가되었습니다.");
				
			}
			
			if(menuNo == 2) {
				for(Friend f : list) {
					System.out.println(f.getName() + "\n" + f.getPhone());
					System.out.println("-");
				}
			}
		}

	}

}
//수정된 Friend 클래스
package main;

public class Friend {
	private String name;
	private String phone;
	
	public String getName() {
		return this.name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getPhone() {
		return this.phone;
	}
	
	public void setPhone(String phone) {
		this.phone = phone;
	}

}
#14 - 3번을 누르면 프로그램 종료기 때문에 3이 아닌 동안에 계속 반복하여 메뉴를 출력하고, 사용자로 부터 메뉴 선택을 입력받습니다.

#21~32 - 저장될 사용자의 이름과 전화번호를 사용자로 부터 입력받고, Friend 클래스 형으로 선언된 user에 이름과 전화번호를 저장, 마지막에는 Friend 클래스 자료형을 갖는 리스트에 저장하여 마칩니다.

#37~39 - 리스트에 저장된 모든 정보를 출력합니다. 사용자와 사용자의 구분은 "-"를 출력하여 구분하고, 이름과 전화번호를 출력합니다.

'Coding > Java' 카테고리의 다른 글

[1]Java의 시작 - Eclipse 설치하고 프로젝트 만들기  (0) 2019.06.26