관리 메뉴

프로그래밍 삽질 중

접근지정자와 접근자(getter), 설정자(setter) 설명 및 문제 본문

과거 프로그래밍 자료들/자바(Java)

접근지정자와 접근자(getter), 설정자(setter) 설명 및 문제

평부 2021. 3. 2. 23:42

※ 접근지정자란?

- 종류는 4가지(private, default, protected, public)

접근지정자 접근 범위 적용 대상 
private 정의된 클래스 내에서만 접근 가능
상속받은 하위 클래스에서도 접근 불가
default 같은 패키지 내에서 접근 가능
protected 같은 패키지 내에서 접근 가능
다른 패키지에서 접근 불가능하나 상속을 받은 경우 하위 클래스에서는 접근 가능
public 패키지 내부, 외부 클래스에서 접근 가능

 

※ getter(접근자)와 setter(설정자) 사용시 주의할 점

- 클래스 내부에 캡슐화된 멤버를 외부에서 사용할 필요가 있을 때 사용

- 접근자 : private으로 지정된 필드 값을 반환

- 설정자 : 값을 변경, 공개된 메소드

- 일반적으로 접근자는 get, 설정자는 set으로 시작하는 이름을 사용

- 필드 이름을 외부에 차단하여 독립시키기 때문에 필드 이름 변경이나 데이터 검증도 가능

 

 

 

 

 

[문제 1]

//입력값
//phone1 Samsung 300 350
//phone2 Apple 500 400
//phone3 Nokia 400 200

//[InvoiceItem] - 적용할 것
//String phone //핸드폰 분류
//String name //회사명 
//int qty //구매수량
//double unitPrice //단가
//-------------------------
//InvoiceItem(String phone, String name, int qty, double unitPrice)
//String getPhone()
//String getName()
//int getQty()
//void setQty(int qty)
//double getUnitPrice()
//void setUnitPrice(double unitPrice)
//double getTotal() 
//String toString() -> "InvoiceItem[phone=?, name=?, qty=?, unitPrice=?]"

//출력값
//InvoiceItem=[phone=phone1, name=Samsung, qty=300, unitPrcie=350.0]의 구매총액은 105000.0
//InvoiceItem=[phone=phone2, name=Apple, qty=500, unitPrcie=400.0]의 구매총액은 200000.0 
//InvoiceItem=[phone=phone3, name=Nokia, qty=400, unitPrcie=200.0]의 구매총액은 80000.0

 

 

 

 

[문제1 답]

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
import java.util.Scanner;
 
class InvoiceItem {
    String phone; 
    String name;
    int qty;
    double unitPrice;
    
    public InvoiceItem() {}
    
    public InvoiceItem(String phone, String name, int qty, double unitPrice) {
        this.phone = phone;
        this.name = name;
        this.qty = qty;
        this.unitPrice = unitPrice;
    }
 
    //shift + alt + "s" -> getter/setter -> all
    public String getPhone() {
        return phone;
    }
    public String getName() {
        return name;
    }
    public int getQty() {
        return qty;
    }
    public void setQty(int qty) {
        this.qty = qty;
    }
    public double getUnitPrice() {
        return unitPrice;
    }
    public double getTotal() {
        return qty * unitPrice;
    }
    public String toString() {
        return String.format("InvoiceItem[phone=%s, name=%s, qty=%d, unitPrice=%.1f]"
                                            phone, name, qty, unitPrice);
                
    }
    
}
 
public class InvoiceItemEx {
 
    public static void main(String[] args) {
        
    
        Scanner scan = new Scanner(System.in);
        InvoiceItem[] iArray = new InvoiceItem[3]; //출력값이 3개이므로
        
        for(int i=0; i<iArray.length; i++) {
            iArray[i] = new InvoiceItem();
            iArray[i].phone = scan.next();
            iArray[i].name = scan.next();
            iArray[i].qty = scan.nextInt();
            iArray[i].unitPrice = scan.nextInt();
        }
        
        for(int i=0; i<iArray.length; i++) {
            System.out.printf("%s의 구매총액은 %.1f\n"
                    iArray[i].toString(), iArray[i].getTotal());
        }
    
    
    }
 
}
 
cs

 

 

 

 

 

[문제 2]

//사원 4명의 아이디는 각각 1~4
// 4명의 이름과 월급 정보는 입력받아 배열에 저장, 모든 내용 출력
// 월급 인상률은 아이디 순으로 각각 10, 20, 30, 40;
//Employee[id=1, name=김태호, salary=25000000]

// 결과값
//Employee[id=1, name=김태호, salary=25000000]의 연봉은 300000000 월급인상분은 2500000
//Employee[id=2, name=장선장, salary=30000000]의 연봉은 360000000 월급인상분은 6000000
//Employee[id=3, name=타이거박, salary=40000000]의 연봉은 480000000 월급인상분은 12000000

//Employee[id=3, name=업동이, salary=35000000]의 연봉은 420000000월급인상분은 10500000

//[Employee]
//int id
//String name
//int salary
//-----------
//+Employee(int id, String name. int salary)
//+int getid()
//+String getName()
//+int getSalary()
//+void serSalary(int salary)
//+int getAnnualSalary()
//+int raiseSalary(int percent)
//+String toString()

 

 

 

 

[문제 2 답]

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
import java.util.Scanner;
 
class Employee{
    int id;
    String name;
    int salary;
    
    public Employee(int id, String name, int salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }
    
    public int getId() {
        return id;
    }
    
    public String getName() {
        return name;
    }
    
    public int getSalary() {
        return salary;
    }
    
    int getAnnualSalary() {
        return salary*12;
    }
    
    int raiseSalary(int percent) {
        return salary*percent/100;
    }
    
    public String toString() {//Employee[id=1, name=코난, salary=25000000]
        return String.format("Employee[id=%d, name=%s, salary=%d]",
                                        id, name, salary);
    }
    
}
 
public class EmployeeEx {
 
    public static void main(String[] args) {
    
        Scanner scan = new Scanner(System.in);
        Employee[] eArray = new Employee[4];
        
        for(int i=0; i<eArray.length; i++) {
            //eArray[0]
            //eArray[1]
            //eArray[2]
            //eArray[3]
            //Employee[id=%d, name=%s, salary=%d
            eArray[i] = new Employee(scan.nextInt(),
                                    scan.next(), scan.nextInt());
        }
        
        for(int i=0; i<eArray.length; i++) {
            System.out.printf("%s의 연봉은 %d 월급인상분은 %d\n"
                    eArray[i].toString(), 
                    eArray[i].getAnnualSalary(),
                    eArray[i].raiseSalary((i+1)*10)); //1씩 증가 시 10
        }
    
    }
 
}
 
cs