본문 바로가기
아카이브/자바의 정석

6장 객체지향프로그래밍 20200918

by nineteen 2020. 9. 18.
반응형

자바에서 자료형은 크게 두가지로 나뉜다

 

기본형, 참조형

 

기본형 변수 - 실제 값을 저장

                - 논리형, 문자형, 정수형, 실수형

 

참조형 변수 - 어떤 값이 저장되어 있는 주소를 값으로 가짐

                - 객체의 주소를 저장, 8개의 기본형을 제외한 나머지 타입

 

ex) 클래스이름 변수이름; -> 변수의 타입이 기본형이 아닌 것들은 모두 참조변수

     Date d;              -> d는 Date클래스의 참조변수

     d = new Date();   -> Date객체를 생성해서, 그 주소를 d에 저장

 

 

 


클래스 변수와 인스턴스 변수

 

1
2
3
4
5
6
7
8
9
10
11
12
public class Card {
    // 폭, 넓이  - 클래스 변수, 모든 인스턴스가 공통적으로 같은 값을 유지해야하는 속성
    // 무늬, 숫자 - 자신만의 무늬와 숫자를 유지해야하는 속성
    
    // 변수구성
    static int width = 100// 모든 인스턴스가 공유되는 값을 가짐
    static int height = 250;
    
    String kind;
    int number;
}
 
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 CardTest {
 
    public static void main(String[] args) {
        // 카드의 폭,높이 출력
        // 카드 인스턴스생성, 하트모양, 7인 카드생성
        // 카드 인스턴스생성, 스페이스모양, 4인 카드생성
        // 생성한 카드들의 정보출력
        // 카드1의 폭,높이 변경
        // 카드1,2의 폭,높이 출력
        
        // 클래스변수 출력, 클래스이름.클래스변수
        System.out.println("width = " + Card.width + ", height = " + Card.height);
        
        Card c1 = new Card(); // Card클래스의 인스턴스 c1 생성
        c1.kind = "Heart";
        c1.number = 7;
        
        Card c2 = new Card(); // Card클래스의 인스턴스 c2 생성
        c2.kind = "Space";
        c2.number = 4;
        
        System.out.println("c1의 모양 : " + c1.kind + ", 숫자 : " + c1.number + 
                ", 폭 : " + c1.width + ", 높이 : " + c1.height);
        System.out.println("c2의 모양 : " + c2.kind + ", 숫자 : " + c2.number + 
                ", 폭 : " + c2.width + ", 높이 : " + c2.height);
        
        // c1의 폭과 높이만 변경했지만, 클래스변수이므로 c2의 폭과 높이출력시 변경된 값 출력
        c1.width = 50;
        c1.height = 80;
        
        System.out.println("c1의 폭 : " + c1.width + ", 높이 : " + c1.height);
        System.out.println("c2의 폭 : " + c2.width + ", 높이 : " + c2.height);
        
    }
 
}
 
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
class Data {
    int x;
}
 
public class PrimitiveParamEx {
    
    // 기본형 매개변수, 값만 변경, 복사본만 변경된거라 원본에 영향x
    public static void change(int x) { 
        x = 1000;
        System.out.println("change() : x = " + x);
    }
 
    public static void main(String[] args) {
        Data d = new Data();
        d.x = 10;
        System.out.println("main() : x = " + d.x);
        
        change(d.x);
        System.out.println("After change(d.x)");
        System.out.println("main() : x = " + d.x);
    }
 
}
 
cs

 

 

 

참조형 매개변수

(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
class Data {
    int x;
}
 
public class ReferenceParamEx {
 
    // 참조형 매개변수, 값이 저장된 주소를 change()메소드에 넘겨줌
    public static void change(Data d) { 
        d.x = 1000;
        System.out.println("change() : x = " + d.x);
    }
 
    public static void main(String[] args) {
        Data d = new Data();
        d.x = 10;
        System.out.println("main() : x = " + d.x);
        
        change(d);
        System.out.println("After change(d)");
        System.out.println("main() : x = " + d.x);
    }
 
}
 
 
cs

 

(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
class Data {
    int x;
}
 
public class ReferenceParamEx2 {
 
    // 참조형 매개변수, 배열도 객체와 같이 참조변수를 통해 데이터가 저장된 공간에 접근
    public static void change(int[] x) { 
        x[0= 1000;
        System.out.println("change() : x = " + x[0]);
    }
    
    public static void main(String[] args) {
 
        int[] x = {10};
        System.out.println("main() : x = " + x[0]);
        
        change(x);
        System.out.println("After change(x)");
        System.out.println("main() : x = " + x[0]);
    }
}
 
 
 
cs

 

(3)

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
public class ReferenceParamEx3 {
    // 메소드 정의, 
    // 배열의 모든 요소 출력, 배열의 모든 요소의 합 반환, 배열을 오름차순으로 정렬
    // 배열생성 / 초기화
    // 정의한 메소드 실행
    
    public static void printArr(int[] arr) {
        for(int i : arr) {
            System.out.print(i + " ");
        }
        System.out.println();
    }
    
    public static int sumArr(int[] arr) {
        int sum = 0// 배열 모든 요소의 합을 담을 변수
    
        for(int i : arr) {
            sum += i;
        }
        
        return sum;
    }
    
    public static void sortArr(int[] arr) {
        int tmp; // 임시로 값을 담아둘 변수
        
        for(int i=0; i<arr.length-1; i++) { // 정렬을 몇번 반복할지 
            for(int j=0; j<arr.length-1-i; j++) { // 정렬을 하는 반복문
                if(arr[j] > arr[j+1]) {
                    tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1= tmp;
                }
            }
            
        }
    }
    
    public static void main(String[] args) {
        int[] arr = {3,2,1,6,5,4};
        
        printArr(arr);
        sortArr(arr);
        printArr(arr);
        System.out.println("sum = " + sumArr(arr));
    }
 
}
 
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
class Data {
    int x;
}
 
public class ReferenceReturnEx {
 
    // 참조형 반환타입, 객체의 주소를 반환
    static Data copy(Data d) {
        Data tmp = new Data();
        tmp.x = d.x;
        
        return tmp;
    }
    
    public static void main(String[] args) {
        Data d = new Data();
        d.x = 10;
        
        // 반환형이 Data클래스 타입이기 때문에 Data의 참조변수가 받아야함
        Data d2 = copy(d); 
        System.out.println("d.x = " + d.x);
        System.out.println("d2.x = " + d2.x);
 
    }
 
}
 
cs

'아카이브 > 자바의 정석' 카테고리의 다른 글

7장 20200924  (0) 2020.09.24
7장 상속 20200921  (0) 2020.09.21
6장 객체지향프로그래밍(2) 20200919  (0) 2020.09.19
5장 배열 20200917  (0) 2020.09.17
JAVA 배열 20200916  (0) 2020.09.16