JAVA/java 실습

[자바JAVA] 클래스 - Time클래스로 보는 private접근 제어자, getter, setter, 매개변수가있는 생성자, toString오버라이딩

자바칩 프라푸치노 2020. 10. 8. 07:46

이번에는 Time클래스를 통해 객체지향 개념 1 - 클래스와 객체에 대해 더 알아보겠습니다.

이론은 아래 포스팅을 확인해주세요.

2020/10/07 - [§개발자 되기 프로젝트§/java 이론] - [자바 java] 객체지향개념1 - 클래스와 객체, 클래스 접근 제어자, 메서드 구성

이 포스팅은 아래의 내용을 포함하고 있습니다.

1. private접근 제어자

2. getter, setter

3. 매개변수가 있는 생성자

4. toString오버라이딩

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
public class Time {
 
            //접근 제어자 (Access Modifier)의 종류
            //private : 같은 클래스 내에서만 접근 가능함.
            //protected : 같은 패키지, 자손 클래스에서만 접근 가능함.
            //default : 같은 패키지에서만 접근 가능함.
            //public: 누구나 다 접근 가능함.
            
            //멤버 변수(접근제어자 private외부로부터 값을 숨김)
            private int hour;
            private int minute;
            private int second;
            
            //기본 생성자 - 코드로 추가를 해주지 아니하면, 컴파일러가 알아서 추가를 해준다.
            public Time() {
                System.out.println("기본 생성자 호출");
            }
            //매개변수가 있는 생성자- 멤버변수의 초기화 메서드이다.
            public Time(int hour, int minute, int second) {
                System.out.println("매개 변수가 있는 생성자 호출");
                
                this.hour = hour;
                this.minute = minute;
                this.second = second;
            }
            
            
            //getter메서드: 멤버변수의 값을 읽어가게끔 해주는 메서드
            //setter메서드: 멤버변수의 값을 저장하거나 수정하거나 해주는 메서드
            
            public int getHour() {
                return hour;
            }
            public void setHour(int hour) {
                if (hour<0 || hour>23) {
                    System.out.println("시간을 잘못 입력하셨습니다.");
                    return;
                }
                this.hour = hour;
            }
            public int getMinute() {
                return minute;
            }
            public void setMinute(int minute) {
                if (minute<0 || minute>59) {
                    System.out.println("분을 잘못 입력하셨습니다.");
                return;
                }
                this.minute = minute;
            }
            public int getSecond() {
                return second;
            }
            public void setSecond(int second) {
                if (second<0 || second>59) {
                    System.out.println("초를 잘못 입력하셨습니다.");
                    return;
                }
                
                
                this.second = second;
            }
        
            @Override
            public String toString() {
                    return this.getHour() + "시 " + this.getMinute() + "분 " + this.getSecond() + "초";
                }
                
    
    
}
 
cs

 

Time클래스에 멤버변수는 이렇게 선언이 되었습니다.

초기화를 해주지않았으니 당연히 int형의 기본값인 0으로 초기화되어있습니다.

접근 제어자가 private입니다.

그러면 같은 클래스 즉, 이 Time클래스에서만 접근을 할 수 있습니다.

실행 클래스를 하나 더 만들어서 거기서 이 멤버 변수를 사용할 수 없다는 말입니다.

그렇다면 이 멤버에 접근을 하기 위해서는 

getter와 setter가 필요합니다.

 

이클립스에 

source에서 Generate Getters and Setters에 들어가시고

select all을 해주시면 getter와 setter둘다 선택이 되구요 

따로 선택하고 싶다면 밑에 select getters나 setters를 해주면 됩니다.

 

getter는 값을 다른 클래스에서 읽는 것,.

setter는 값을 다른 클래스에서 넣는 것이라고 이해하시면 되겠습니다.

이것도 메서드니까 마지막의 setSecond 메서드를 살펴보시면

public 접근제어자(다른 클래스에서도 사용가능)

void (리턴 타입 없음)

setSecond(메서드명)

(int second) 매개변수가 int 

입니다.'

 

 

그리고 메서드 구현부를 보시면

second<0 이거나 second>59이면 뭐시기를 출력한다 하는데

여기서 second는 매개변수로 들어온 second입니다.

우리가 Time 클래스에서 설정한 멤버변수second가 아니라는 말씀입니다.

그리고 맨 밑에 this.second = second;

라고 되어있습니다.

this.second가 바로 멤버변수 second입니다.

이렇게 지역변수와 멤버변수를 구분 하기 위해서 this를 사용합니다.

이 부분은 나중에 또 다루어보겠습니다.

 

그래서 매개변수로 들어온 second를 멤버변수인 second에 대입하겠다는 말입니다.

 

toString은 이렇게 구현을 했구요

값을 읽는 것은 getter라고 했으니 getter로 이렇게 리턴을 했습니다.

getter을 보시면 이렇게 멤버변수를 리턴하고 있으니까요

여기서는 this가 붙어도 되고 안붙어도 멤버변수를 가리킵니다.

여기는 이름이 같은 지역변수가 없으니까요.

 

 

마지막으로 생성자부분인데요.

이론 포스팅에서도 말했듯이

클래스에는 속성(변수), 기능(메서드), 생성자가 있는데 

다른건 몰라도 생성자는 꼭 있어야합니다.

이게 있어야 인스턴스가 생성할 수 있는데 만약에 생성자를 아무것도 안만들었으면 컴파일러가 알아서 기본생성자를 추가해줍니다.

기본생성자는 public Time(){} 이렇게 클래스명이랑 똑같은 이름을 가졌습니다.

그리고 밑에 코드처럼 매개변수가 있는 생성자도 만들 수 있습니다.

생성할때 매개변수로 들어온 값으로 멤버변수를 초기화해놓고 만든다는 말입니다.

그럼 실행클래스로 가보겠습니다.

 


실행클래스입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class TimeEx {
 
    public static void main(String[] args) {
        
        Time t1 = new Time();
        Time t2 = new Time(10,55,10);
        
        //setter메서드 이용하여 값 설정
        t1.setHour(15);
        t1.setMinute(24);
        t1.setSecond(33);
        
        System.out.println(t1); //setter메서드로 설정했음
        System.out.println(t2); //위에서 설정했음
        
 
    }
 
}
 
cs

t1 은 기본생성자로 인스턴스 호출

t2는 매개변수가 있는 생성자로 인스턴스를 호출합니다.

그럼 t1은 멤버변수들이 다 기본값인 0으로 초기화되겠고

t2는 멤버변수들이 안의 값으로 초기화가 되어있겠습니다.

 

그리고 밑에서는 t1에서 setter를 이용해 멤버변수에 값을 저장합니다.

여기서 sysout으로 t1과 t2를 출력하면 오버라이딩된 toString메서드가 나오겠죠.

<출력결과>

이렇게 출력이 잘 되고 있습니다.

728x90