티스토리 뷰

day10 190304

이번 시간에는 this키워드, 접근제한자, 메소드의 응용(getter, setter, BusinessLogic Object 등..)에 대해서 배웠습니다.

뒤로 갈수록, 여러 클래스들을 합쳐서 사용하게 되서 파일간의 이동이 잦아지게 됩니다.

헷갈리지 않게 많은 복습이 필요할 것 같습니다.


--필드 : 클래스 바로안에 있는 변수(=인스턴스 변수, 멤버 변수)

--지역변수 : 메소드 안에서 선언된 변수

--매개변수 : 메소드에 입력받는 값인 변수


--this : 객체, 자신의 주소 값을 담고 있다. 

( 객체의 멤버변수)

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
public class Book {
    int no;
    String title;
    String writer;
    int price;
 
    Book() {
    
    }
 
    Book(int no, String title, String writer, int price) {
        this.no = no;
        this.title = title;
        this.writer = writer;
        this.price = price;
    }
 
    void displayBookDetail() {
        String title = "테스트";
 
        System.out.println("번호 : " + no);
        System.out.println("제목 : " + title);
        System.out.println("제목 : " + this.title);        // 객체의 멤버변수인 title을 사용해서
        System.out.println("저자 : " + writer);            // 메소드안의 title인 "test"가 아닌 객체의 값이 출력된다.
        System.out.println("가격 : " + price);
    }
}
cs

22행과 23행을 보면, 22행에서는 19행에 의하여, "테스트"가 출력되지만, 23행은 this.title이 해당 클래스의 title을 가리키고 있으므로 "테스트"가 아닌 해당 클래스의 객체의 값이 출력된다.


<접근 제한자>

: 필드의 구성요소를 외부에 노출시킬지, 아닐지 제어할 때 사용.

  필드, 클래스, 생성자, 메소드에 사용 가능


1. public // 공개

2. proteted // 상속을 배우고 다룸.

3. default // 같은 패키지(폴더) 내 공개

4. private // 비공개


1
2
3
4
5
6
7
8
9
public class Subject {
    private int no;        // 과목번호
    private String name;        // 과목명
    private String professor;    // 담당교수명
    
    public Subject() {            // public은 공개 접근 제한자로 사용 가능.
    // private Subject() {        // private을 사용하면, 패키지 내 다른 파일에서 참조 불가능.
        
    }
cs
위 2,3,4행은 private로 감싸져있어서 다른 클래스에서 바로 가져와서 쓸 수 없는 상태가 됩니다.

이것을 가져와서 사용하고 수정하기위해 존재하는 것이 getter/setter메소드입니다.

--getter method => 필드의 값을 제공한다.
--형식 :
1
2
3
4
5
public class Subejct {
    private int no;
    private String name;
    private String professor;
}
cs
에서
getter method는
1
2
3
4
public int getNo() {
    return no;
}
 
cs
1
2
3
public String getName() {
    return name;
}
cs
이런식으로 가지게 됩니다. private로 직접 가져올 수 없는 그 필드의 값을 getter메소드를 통해서 가져올 수 있게 됩니다.

--setter method => 필드의 값을 변경한다.
1
2
3
public void setNo(int no) {
    this.no = no;
}
cs
setter메소드는 위 소스처럼정의 되겠습니다. 해당하는 필드타입을 매개변수로 입력받아서 this키워드로 필드가있는 클래스안에서 메소드를 통해서 값을 수정해줍니다. 2행에서 this.no는 클래스의 필드, no는 입력받은 매개변수가 되겠습니다.


-- 값을 저장/운반 할때 사용하는 객체 // 소스 Employee같은 객체
Value Object
Java Beans(자바빈즈)
Domain Object(도메인 객체)

<위 객체의 대표적인 형식>
1
2
3
4
5
6
public class 클래스명 {
    필드;
    필드;
 
    getter/setter 메소드
}
cs

-- 기능을 제공하는 객체
Service Object
BusinessLogic Object

<위 객체의 대표적인 형식>
1
2
3
4
5
6
7
public class 클래스명Service {        //*업무로직 : 실제 회사에서 사용하는 로직
    필드
 
    업무로직 메소드
    업무로직 메소드
    ...    
}
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
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
// 사원 정보를 담는 객체
public class Employee {
    // 사원번호, 이름, 소속부서명, 급여, 근무연수, 전화번호
    // no,        name,    dept,    salary,  workingYear, tel
    
    // 비공개 필드 정의
    private int no;
    private String name;
    private String dept;
    private int salary;
    private int workingYear;
    private String tel;
 
    // 기본 생성자
    public Employee() {        // public 붙이기! 기본생성자는 빈 깡통
 
    }
 
    // getter메소드
    public int getNo() {
        return no;
    }
 
    public String getName() {
        return name;
    }
 
    public String getDept() {
        return dept;
    }
 
    public int getSalary() {
        return salary;
    }
 
    public int getWorkingYear() {
        return workingYear;
    }
 
    public String getTel() {
        return tel;
    }
 
    // setter메소드
    public void setNo(int no) {
        this.no = no;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void setDept(String dept) {
        this.dept = dept;
    }
 
    public void setSalary(int salary) {
        this.salary = salary;
    }
 
    public void setWorkingYear(int wokringYear) {
        this.workingYear = workingYear;
    }
 
    public void setTel(String tel) {
        this.tel = tel;
    }
}
cs

우선, 사원의 정보를 담는 객체가 있는 Employee클래스 파일입니다.

7~12행에서 필드값들을 private로 감싸서 선언하고, 19~42행은 그 값들을 다른 클래스에서 가져올 수 있는 getter메소드, 44~67행은 그 값들을 저장시킬 수 있는 setter메소드를 만들었습니다. (아직 이클립스를 사용하지 않는데, getter와setter가 자주 쓰여서 단축키로 있다고합니다.)


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
public class EmployeeService {
    Employee[] database = new Employee[3];
 
    public EmployeeService() {
        database[0= new Employee(10"김유신""영업1팀"2502"010-1234-5678");
        database[1= new Employee(20"강감찬""기술팀"3503"010-1111-1111");
        database[2= new Employee(30"이순신""인사팀"3002"010-1234-2222");
    }
 
    // 모든 사원정보를 출력하는 기능
    public void printAllEmployees() {
        for (Employee e : database) {
            int no = e.getNo();
            String name = e.getName();
            String dept = e.getDept();
            int salary = e.getSalary();
            int workingYear = e.getWorkingYear();
            String tel = e.getTel();
            
            System.out.println("사원번호 : " + no);
            System.out.println("사원이름 : " + name);
            System.out.println("소속부서 : " + dept);
            System.out.println("실수령액 : " + salary);
            System.out.println("근무년수 : " + workingYear);
            System.out.println("전화번호 : " + tel);
            System.out.println();
        }
    }
 
    // 조회할 사원번호를 전달받아서 그 번호에 해당하는 사원정보를 제공하는 기능
    public Employee getEmployee(int empNo) {
        Employee emp = null;
 
        for (Employee e : database) {
            if (empNo == e.getNo()) {
                emp = e;
                break;
            } 
        }
        if ( emp == null) {
            System.out.println("사원번호가 존재하지 않습니다!");
        }
        return emp;
    }
}
cs

위 파일이 바로, Business Logic 업무로직 메소드를 가진 EmployeeService 클래스 파일입니다. 통상 프로그램의 ~~~Service라는 파일이름을  쓴다고합니다.

10~28행의 기능과 30~44행의 기능의 업무로직을 가진 클래스파일이 되겠습니다.

원래라면, 데이터베이스 파일이 존재하는데 지금 DB를 배우지않아서 2~8행으로 DB데이터를 임의로 만들었습니다.



10행의 모든사원정보를 출력하는 기능은, 12행 database배열을 enhanced for문으로 반복시켜서 변수를 하나 만들어서 getter메소드로 값을 호출하여 저장하고, 20~행으로 출력을 하는 방식이 되겠습니다.

31행의 기능같은 경우에는, 32행의 비어있는 객체를 만들어서 34~38행 과정을 통해서, 입력받은 사원번호와 database배열에 들어있는 사원번호들과 비교를 해서 있을 경우에, 만들어두었던 빈 객체에 채워넣고, 제공하는 것입니다. 40행은 빈 객체가 위 과정후에 그대로 빈 객체라면 비교했을때 일치하는 것이 없다는 뜻이 되므로, 존재하지 않는다는 문구를 출력해봤습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
public class EmployeeServiceApp {
    public static void main(String[] args) {
        
        EmployeeService service = new EmployeeService();
 
        // 모든 사원정보 출력해보기
        service.printAllEmployees();
 
        // 10번 사원 찾기
        Employee x = service.getEmployee(10);
        System.out.println("해당 사원 : " + x.getName());
    }
}
cs

위 클래스파일이 업무로직이 있는 EmployeeService클래스파일을 사용할 메인 파일입니다.

4행에서 먼저, 사용하기 위해 EmployeeService클래스의 객체를 생성해주고, 그 파일의 메소드를 이용하여 6~7행, 9~12행을 만들게 됩니다.


실무에서는 위 세가지 파일의 동작원리처럼 여러 클래스 파일을 만들어, 

메인 파일에 다른 클래스파일의 메소드만 적어서 사용하는 방식으로 이루어진다고 합니다.


다른 서비스,서비스앱 프로그램들도 첨부파일에 있으니, 주석을 참고해서 복습하시면 되겠습니다.

day10.zip


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함