JAVA/java 실습

[자바JAVA] 객체지향1 - 클래스와 객체 . Tv클래스로 알아보는 객체배열, 멤버호출방법, 객체주소변경, 향상된 for문

자바칩 프라푸치노 2020. 10. 7. 13:27

 

이번 포스팅에서는 Tv클래스를 통해 클래스와 객체에 대해 더 자세히 알아보겠습니다.

이 포스팅에는 아래의 내용이 포함되어있습니다.

1. 멤버 호출 방법

2. 객체 주소 변경, 주소 출력

3. 객체 배열 생성

4. 향상된 for문

 

 

이론 포스팅은 아래의 글을 봐주세요!

2020/10/07 - [§개발자 되기 프로젝트§/java 이론] - [자바 java] 객체지향개념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
public class Tv {
    //TV의 속성(Attribute)들, 멤버변수, 필드라고도 한다.
    String color; //tv의 색상 나타낼 멤버변수
    boolean power; //tv의 전원상태 (on
    int channel;//tv의 채널을 나타낼 멤버변수
    
    
    //멤버메서드(c언어에서는 함수라고도 함)
    //tv의 전원 켜거나 끄는 기능을 하는 메서드
    public void power() {
        this.power = !power;
        if (power) {
            System.out.println("TV가 켜졌습니다.");
        }
        else {
            System.out.println("TV가 꺼졌습니다.");
        }
        return//메서드는 리턴문을 만나면 그 즉시 종료함.
        
    }
    //TV채널을 높이는 기능을 하는 메서드
    public void channelUp() {
        //유효성검사
        if (this.channel<0) {
            System.out.println("채널에는 음수가 없습니다. 1번 채널로 돌아갑니다.");
            this.channel =1;
        }
        
        if (this.channel>999) {
            System.out.println("더 이상 채널이 없습니다. 1번 채널로 돌아갑니다.");
            this.channel =1;
        
        }
        this.channel++;
        return;
    }
    //TV채널을 낮추는 기능을 하는 메서드
    public void channelDown() {
        if (this.channel<0) {
            System.out.println("채널에는 음수가 없습니다. 1번 채널로 돌아갑니다.");
            this.channel =1;
        }
        
        if (this.channel>999) {
            System.out.println("더 이상 채널이 없습니다. 1번 채널로 돌아갑니다.");
            this.channel =1;
        
        }
        this.channel--;
        
        return;
    }
    
}
 
cs

Tv클래스를 만들었습니다.

 

이것들은 바로 멤버 변수

그 밑에 이런식으로 되어있는 것은 멤버 메서드입니다.

 

여기서도 메서드를 살펴보시면

public void power(){}

이렇게 되어있습니다.

public은 접근 제어자

void는 리턴값이 없다

power은 메서드명

()는 매개변수(매개변수없음)

입니다.

그러니까 power()메서드를 호출하면 여기에 적혀있는 코드들이 실행된다는 말입니다.

power메서드를 보면 this.power은 ( 멤버변수power은 ) !power로 바꾸고 

( 원래 true라면 false로, false라면 true로 바꾼다. 

처음 호출하면 power의 기본값 false이므로 true가 된다.)

 

만약에 power가 true이면 tv가 켜지고 

아니라면 tv가 꺼졌습니다를 출력하는 메서드입니다.

 

 

channelUp메서드도 마찬가지로 public접근 제어자, void(리턴타입 없음)

이구요

만약에 멤버변수channel에 0미만이나 999초과되는 수가 들어가있으면 

어쩌고 저쩌고를 출력하고 아니라면 채널을 ++ 해줍니다.

 

channelDown메서드도 이해되실것입니다.

 


그럼 실행 클래스를 만들어보겠습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package sec02_exam;
 
public class TvEx1 {
 
    public static void main(String[] args) {
        
        Tv t = null//Tv인스턴스를 참조하기 위한 참조변수 t를 null로 초기화
        t = new Tv();//Tv인스턴스를 생성한다.
        t.power();//Tv를 켠다.
        t.channel = 7;//Tv인스턴스의 멤버변수 channel의 값을 7로 한다.
        t.channelDown();//Tv인스턴스의 메서드 channelDown()을 호출한다.
        System.out.println("현재 채널은 " + t.channel + "입니다.");
        t.power();//Tv를 끈다.
        
        
 
    }
 
}
 
cs

 

Tv t = null이라고 해놓고

t에 new연산자를 통해 새로운 인스턴스를 생성해줍니다.

Tv t = new Tv();로 한줄로 줄일 수 있습니다.

멤버에 접근하는 방법은 인스턴스명.멤버명

이므로 t.power();은 

Tv인스턴스인 t에 power메서드를 호출한다는 뜻입니다.

그럼 power에서 tv가 켜지겠네요.

그리고 t.channel에 7이라는 값을 입력했습니다.

그리고 channerDown메서드를 호출했으니 t.channel은 6이 되겠습니다.

그리고t.power을 다시 호출했으니

tv가 꺼지겠네요

 

확인해봅시다.

<출력결과>

이렇게 잘 나오고 있습니다.


두번째 실행 클래스를 만들어보았습니다.

 

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
public class TvEx2 {
 
    public static void main(String[] args) {
        
            Tv t1 = new Tv();
            Tv t2 = new Tv();
            
            System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
            System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
                
            System.out.println("t1의 주소: " + t1);
            System.out.println("t2의 주소: " + t2);
                
            
            t2 = t1; //t2의 주소값 변경함(즉, 같은 인스턴스를 가르키고 있다.)
            
            System.out.println("t1의 주소: " + t1);
            System.out.println("t2의 주소: " + t2);
            
            t2.channel = 15//t2과 t1이 같아서 아무거나 조작해도 같은 결과가 나온다.
            t1.channelDown();
            
            System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
            System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
        
 
    }
 
}
 
cs

Tv인스턴스를 두개 생성하고

채널을 출력하고 있습니다.

tv클래스에 보시면 channel은 선언만 되어있고 초기화가 되어있지 않으므로 int형의 기본값인 0 으로 초기화가 되어있을 것입니다.

그리고 밑에는 주소를 출력합니다.

이 인스턴스는

이렇게 생성이 되기 때문에 주소가 당연히 다르겠죠.

<출력결과>

예상과 같습니다.

 

그리고 다음 코드를 보면 t1의 주소를 t2에 대입하고 있습니다.

그러면 t1이 가리키던 객체랑 똑같은것을 t2도 가리키겠죠

이렇게요.

그러면 t2가 참조하던 객체는 참조가 끊기면서 쓰레기 값 (더미데이터)가 되어 

gc(garbage collector)에 의해서 수거됩니다.

<출력결과>

이렇게 주소가 같아졌구요

 

코드를 보시면

t2의 channel에 15를 대입하고 있죠.

그런데 t2가 참조하는거나 t1이 참조하는거나 같은 객체죠

그러니까 t1의 channel도 15가 되는 것입니다.

그래서 t1.channelDown을 하면 channel이 14가 됩니다.

<출력결과>

결론적으로 이렇게 출력이 되었습니다.

 

 


세번째 실행클래스입니다.

 

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
package sec02_exam;
 
public class TvEx3 {
//객체 배열 (=2차원 배열)
    public static void main(String[] args) {
        
            Tv[] tvArr = new Tv[3]; //길이가 3인 TV배열
            
            for (int i = 0; i < tvArr.length; i++) {
                tvArr[i] = new Tv(); //붙이는 작업
                tvArr[i].channel = i +10//i+10을 각 tvArr[i]에 채널에다가 저장
                System.out.println(tvArr[i].channel);
                System.out.println(tvArr[i]);
            }
 
            
            for (int i = 0; i < tvArr.length; i++) {
                tvArr[i].channelUp();//채널이 1씩 증가
                System.out.printf("tvArr[%d].channel = %2d %n", i , tvArr[i].channel);
            }
            
            
            for(Tv tv : tvArr) {
                //새로운 Tv의 인스턴스가 생성되어 기존의 참조하고 있던 인스턴스는 쓰레기 객체가 된다.
                tv = new Tv();
                tv.channel = 10;
                System.out.println(tv);
                System.out.println(tv.channel);
                
                
            }
    }
 
}
 
cs

 

여기서는 객체 배열을 만들었습니다.

 

객체 배열을 만든다는 것은

이렇게 tv의 속성을 모두 가진 인스턴스가 배열로 모여져있단는 것입니다.

그런데 제가 그린 것처럼 인스턴스가 생성되는 것은

아래의 코드처럼 new연산자를 사용해 그 인덱스에 객체를 생성했다는 뜻이구요

위처럼 방만 만들어줬다는 것은 아직 그 객체를 참조하고 있지는 않다는 뜻입니다.

 

여기서 attach작업을 통해 Tv인스턴스를 생성해주어야 

비로소 제가 위에 그린 메모리 상의 작업이 된다는 것입니다.

 

여기서 tvArr[i]를 출력하면 주소가 출력이 됩니다.

<출력결과>

 

다음 코드에서는 채널을 하나씩 올리는 메서드를 호출했으니

원래 채널에서 1씩 증가된 채널이 나타납니다.

<출력결과>

다음은 향상된 for문인데요

2020/09/29 - [§개발자 되기 프로젝트§/java 실습] - 자바 java 일차원배열 - 향상된 for문, 배열에서 값 하나씩 가져오기

 

자바 java 일차원배열 - 향상된 for문, 배열에서 값 하나씩 가져오기

안녕하세요 이번에는 배열에서 값을 순서대로 가져오는 향상된 for문을 보겠습니다. 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 package sec01_firstArray; publi..

sso-feeling.tistory.com

이 포스팅을 참고해주시구요

이 향상된 for문에서는 또다시 tvArr에 인덱스마다 새로운 Tv인스턴스를 만들고 있고

채널을 10이라고 넣고 있네요

<출력결과>

출력해보니 역시나 새로 만들었으니 주소가 다르고

채널은 10으로 초기화가 된 모습을 볼 수 있습니다.

 

728x90