• Homework(8)

    2021. 6. 30.

    by. 와트

    ※문제. 사원정보 관리하기

    필드: 사번, 이름, 소속부서, 직급, 나이, 성별, 급여, 보너스포인트, 핸드폰, 주소
    1. 키보드입력용 메소드 : empInput()
    2. emp객체 모든 필드 출력용 메소드 : empOutput()
    3. getter/setter메소드

    ******* 사원 정보 관리 프로그램 ************
    1. 새 사원 정보 입력 => empInput() 메소드 실행
    2. 사원 정보 삭제 => 참조변수에 null대입할 것.
    3. 사원정보 출력 => empOutput() 메소드 실행
    9. 끝내기
    ********************************************
    더보기

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    public class Employee {
     
        private int empNo;
        private String empName;
        private String dept;
        private String job;
        private int age;
        private char gender;
        private int salary;
        private double bonusPoint;
        private String phone;
        private String address;
        
        public void setEmpNo(int empNo) {
            this.empNo = empNo;
        }
        
        public int getEmpNo() {
            return empNo;
        }
        
        public void setEmpName(String empName) {
            this.empName = empName;
        }
        
        public String getEmpName() {
            return empName;
        }
        
        public void setDept(String dept) {
            this.dept = dept;
        }
        
        public String getDept() {
            return dept;
        }
        
        public void setJob(String job) {
            this.job = job;
        }
        
        public String getJob() {
            return job;
        }
        
        public void setAge(int age) {
            this.age = age;
        }
        
        public int getAge() {
            return age;
        }
        
        public void setGender(char gender) {
            this.gender = gender;
        }
        
        public char getGender() {
            return gender;
        }
        
        public void setSalary(int salary) {
            this.salary = salary;
        }
        
        public int getSalary() {
            return salary;
        }
        
        public void setBonusPoint(double bonusPoint) {
            this.bonusPoint = bonusPoint;
        }
        
        public double getBonusPoint() {
            return bonusPoint;
        }
        
        public void setPhone(String phone) {
            this.phone = phone;
        }
        
        public String getPhone() {
            return phone;
        }
        
        public void setAddress(String address) {
            this.address = address;
        }
        
        public String getAddress() {
            return address;
        }
        
        public void empInput() {
            Scanner sc = new Scanner(System.in);
            System.out.println("-------- 신입 사원 정보를 입력합니다 --------");
            System.out.println("사번을 입력하세요 : ");
            empNo = sc.nextInt();
            System.out.println("이름을 입력하세요 : ");
            empName = sc.next();
            System.out.println("소속부서를 입력하세요 : ");
            dept = sc.next();
            System.out.println("직급을 입력하세요 : ");
            job = sc.next();
            System.out.println("나이를 입력하세요 : ");
            age = sc.nextInt();
            System.out.println("성별을 입력하세요(M/F) : ");
            gender = sc.next().charAt(0);
            System.out.println("급여를 입력하세요 : ");
            salary = sc.nextInt();
            System.out.println("보너스포인트를 입력하세요 : ");
            bonusPoint = sc.nextDouble();
            sc.nextLine();
            System.out.println("핸드폰 번호를 입력하세요 : ");
            phone = sc.nextLine();
            System.out.println("주소를 입력하세요 : ");
            setAddress(sc.nextLine()); 
        }
        
        public void empOutput() {
            System.out.println("-------------신입 사원 정보를 출력합니다 -----------");
            System.out.println("사번 : " + this.empNo);
            System.out.println("이름 : "  + this.empName);
            System.out.println("소속부서 : " + this.dept);
            System.out.println("직급 : " + this.job);
            System.out.println("나이 : " + this.age);
            System.out.println("성별 : " + this.gender);
            System.out.println("급여 : " + this.salary);
            System.out.println("보너스포인트 : " + this.bonusPoint);
            System.out.println("핸드폰 : " + this.phone);
            System.out.println("주소 : " + this.address);
            System.out.println("--------------------------------------------");
            
        }
    cs

    원래는 사용자 입력값을 받을 때, setter메소드를 이용해서 받았다.

    현재 주소 입력값을 받을 때처럼 setAddress(sc.nextLine()); 이렇게.

    절차가 잘 보이도록 하려면 이렇게 해도 무방하다고 한다.

    다만 클래스 안이라서 필드의 멤버변수 사용이 즉시 가능하고, 직접 접근이 가능하니 보통은 직접 접근을 추천한다고 한다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
        public void mainMenu_() {
            Employee e = new Employee();
            
            while(true) {
            System.out.println("********사원 정보 관리 프로그램********\n"
                    + "1. 새 사원 정보 입력\n"
                    + "2. 사원 정보 삭제\n"
                    + "3. 사원 정보 출력\n"
                    + "9. 끝내기\n"
                    + "***************************");
            System.out.print("입력 : ");
            
            int num = sc.nextInt();
            
            if(num != 1 && num != 2 && num != 3 && num != 9) {
                System.out.println("번호를 잘못 입력하셨습니다.");
                continue;
            }
            
            switch(num) {
            case 1 : e.empInput(); break;
            case 2 : e = new Employee(); break
            //'참조변수에 null 대입할 것'이라고 하셨는데 NullPointerException나오는 게 싫어서 그냥 초기화 시켜버림
            // 객체 안의 값을 지운 것
            case 3 : e.empOutput(); break;
            default : return;
            }
            }
            
        }
    cs

    실행메소드는 이렇게.

    NullPointerException 나오는 게 싫어서 객체 자체를 초기화시켜 버렸는데 if문 사용해서 해결하는 방법이 있었다.

     

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
        public void mainMenu() {
            String menu = "********사원 정보 관리 프로그램********\n"
                    + "1. 새 사원 정보 입력\n"
                    + "2. 사원 정보 삭제\n"
                    + "3. 사원 정보 출력\n"
                    + "9. 끝내기\n"
                    + "***************************";
            System.out.print("입력 : ");
            
            Employee e = null// 공간만 만들어 놓고
            while(true) {
                System.out.print(menu);
                int choice = sc.nextInt();
                switch(choice) {
                case 1
                    e = new Employee(); // 실제 객체 할당은 여기서
                    e.empInput();
                    break
                case 2
                    e = null//참조주소값 제거. 객체의 연결고리를 끊은 것
                    System.out.println("사원정보가 삭제되었습니다.");
                    break;
                case 3
                    if(e != null)
                    e.empOutput(); 
                    //지역변수는 반드시 초기화(값대입) 후 사용해야 한다. 26에 Employee e;라고 선언만 하면 안되는 이유
                    else
                        System.out.println("사원 정보를 먼저 입력하세요.");
                    break;
                case 9return;
                default : System.out.println("잘못 입력하셨습니다.");
                }
            }
    cs

    참조주소값을 제거하느냐, 객체 안의 값을 제거하느냐의 차이. 

     

     

    ※문제. 다음 코드에서 각 출력문에 찍히게 될 값을 작성하고, 실제 코드로 작성후 확인하세요.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    public class Test {
        int a = 100;
        static int s = 99;
     
        public static void main(String[] args) {
            Test t = new Test();
            t.test1();
            t.test2();
            Test d = new Test();
            t.test3(d);
            System.out.println(d.a);
            t.test4(t);
        }
     
        public void test1() {
            int a = 1000;
            int s = 999;
            System.out.println(this.a); 
            System.out.println(Test.s); 
        }
     
        public void test2() {
            Test t = new Test();
            t.a = 1000
            System.out.println(a); 
        }
     
        public void test3(Test t) {
            t.a = 10
            this.a = 200;
            System.out.println(t.a);
        }
     
        public void test4(Test t) { 
            t.a = 1000
            System.out.println(this.a);
        }
    cs

    이거 정말 어려웠다... 풀다가 나중에는 이 t가 네 t이냐 test3메소드의 t이냐 상태가 되었다...

    차근차근 풀어보아야 비로소 이해가 된다.

    '혼자 있는 방 > Java' 카테고리의 다른 글

    Homework(10)  (0) 2021.07.02
    Homework(9)  (0) 2021.07.01
    Test(1)  (0) 2021.06.28
    Homework(7)  (0) 2021.06.25
    Homework(6)  (0) 2021.06.24

    댓글

Designed by Nana