1. 복습


1) 자바의 구성요소: 클래스, 메서드, 변수

2) 클래스의 구성요소: 메서드, 변수 

3) 클래스는 '사용자 정의 데이터 타입' 이다. 


4) 구조


1
2
3
4
class Person {
    int age;
    String name;
}
cs


1
2
3
4
5
    int    num = 10;
        
    Person hgd = new Person();
    hgd.age = 14;
    hgd.name = "홍길동";
cs




2. 변수의 종류 


* 앞에 무엇이 붙느냐(static)에 따라 변수명이 다르다. 


1) 클래스 변수 (static 변수, 공용 변수, 파란색 이탤릭체)

- 선언 위치: 클래스 내에 선언

- 초기값: 있음

- 사용법: 클래스명.변수명;

- 모든 인스턴스가 공통적으로 같은 값을 유지해야할 경우에는 클래스 변수를 사용한다. 


2) 인스턴스 변수 (non-static 변수, 파란색)

- 선언 위치: 클래스 내에 선언

- 초기값: 있음

- 사용법: 클래스를 사용한 인스턴스 생성 > 인스턴스명.변수명;

- 인스턴스마다 각각의 다른 값을 유지해야할 경우에는 인스턴스 변수를 사용한다. 


> 클래스와 인스턴스 변수는 초기화를 하지 않아도 사용 가능하다.


3) 지역 변수 (갈색)

- 선언 위치: 메서드 내에 선언, 제어문 내에 선언

- 초기값: 없음

     : 가급적 선언과 동시에 초기화 해줄 것을 권장한다.

ex. int a = 0;    double a = 0.0;    String a = "";

- 사용법: 변수명;


> 지역 변수는 초기화를 하지 않으면 오류는 나지 않지만 사용할 수는 없다. 



# 클래스 변수, 인스턴스 변수, 지역 변수 (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
package classex;
 
public class ClassTest03 {
 
    // 클래스, 인스턴스 변수는 초기화를 하지 않아도 사용 가능 
    static int num1;        // 클래스(static)변수
    int num2;             // 인스턴스(non-static)변수 
    
    public static void main(String[] args) {
 
        // 0. 인스턴스화 시키기 
        ClassTest03 c1 = new ClassTest03();
        
        // 1. 클래스 변수 
        System.out.println("클래스 변수: " + num1);
        System.out.println("클래스 변수: " + c1.num1);
        System.out.println("클래스 변수: " + ClassTest03.num1);         // 권장! 
        
        // 2. 인스턴스 변수 
        // System.out.println("인스턴스 변수: " + num2);                     // 오류 
        // System.out.println("인스턴스 변수: " + ClassTest03.num2);    // 오류 
        System.out.println("인스턴스 변수: " + c1.num2);
        
        // 3. 지역 변수 
        int num1 = 10
        System.out.println("지역 변수: " +  num1);
        
        int num2;
        // System.out.println(num2);    // 초기화 오류
        
        for (int i=0; i<5; i++) {
            int num3 = 5;    
        }
        
    }
}
cs

# 실행 결과


# 설명

Line 6~7: 클래스 변수, 인스턴스 변수는 초기화하지 않아도 사용 가능하다. 

Line 28~29: 그러나 지역 변수는 초기화하지 않고 사용할 수 없다. 

Line 15~17: 클래스 변수를 사용하고자 할 때, 

    변수명 앞에 클래스명을 붙이는 것을 권장하는데 이는 다른 개발자와 협업을 하는 상황에서 오해가 생기지 않게 예방할 수 있기 때문이다. 

Line 12: 인스턴스 변수를 사용하고자 할 때, 반드시 클래스를 이용하여 인스턴스화를 시켜 생성해야한다. 

Line 20~21: 인스턴스 변수는 인스턴스화 시킨 객체를 통해서만 호출할 수 있다. 

Line 22: 인스턴스화 시킨 c1 객체를 통하여 num2를 호출하였다. 

Line 31~33: 지역변수는 제어문 블록 내 또는 메소드 안에서 선언할 수 있다. 



# 클래스 변수, 인스턴스 변수, 지역 변수 (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
package classex;
 
class Test {
    
    static int num1 = 1
    int num2 = 2;
    
    // 3. 지역 변수 
    void test() {
        int num3 = 10;
    }
}
 
public class ClassTest03_3 {
 
    static int num1;    // 클래스(static)변수
    int num2;         // 인스턴스(non-static)변수 
    
    public static void main(String[] args) {
 
        // 0. 인스턴스화 시키기 
        ClassTest03_3 c1 = new ClassTest03_3();
        Test t1 = new Test();
        
        // 1. 클래스 변수 
        // 클래스 안에 있는 변수는 클래스명을 따로 쓰지 않아도 사용 가능하지만 
        // 다른 클래스 안에 있는 변수는 반드시 클래스명을 써줘야한다. 
        System.out.println("클래스 변수 num1: " + num1);
        System.out.println("클래스 변수 num1: " + ClassTest03_3.num1);
        
        System.out.println("클래스 Test 변수 num1: " + t1.num1);
        System.out.println("클래스 Test 변수 num1: " + Test.num1);
    
        System.out.println();
    
        // 2. 인스턴스 변수 
        System.out.println("인스턴스 변수 num2: " + c1.num2);
        System.out.println("인스턴스 Test 변수 num2: " + t1.num2);
        
    }
}
cs

# 실행 결과


# 설명

Line 9~10: 지역 변수는 메소드 내에서 선언 가능하다. 

Line 22: ClassTest03_3 클래스를 사용하여 c1 객체 인스턴스화 

Line 23: Test 클래스를 사용하여 t1 객체 인스턴스화

Line 28~29: 실행을 ClassTest03_3 클래스 내의 메소드 안에서 하고 있기 때문에 ClassTest03_3의 클래스 변수인 num1 앞에 클래스명을 따로 적지 않아도 사용 가능하다. (권장하지 않음)

Line 31~32: 그러나 ClassTest03_3 클래스 외부에 있는 Test 클래스의 클래스 변수 num1은 인스턴스화 된 객체 t1을 통해서만 호출할 수 있다. 



# 클래스 변수, 지역 변수 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package classex;
 
public class ClassTest03_2 {
 
    static int num1;        // 클래스(static)변수
    int num2;            // 인스턴스(non-static)변수 
    
    public static void main(String[] args) {
        
        System.out.println("클래스 변수: " + num1);
        
        int num1 = 10;
        System.out.println("지역 변수: " + num1);
        System.out.println("클래스 변수: " + ClassTest03_2.num1);
        
    }
}
cs

# 실행 화면 

# 동일한 변수명의 지역 변수가 선언되었을 경우 

- 파란색 이탤릭체로 사용되었던 num1은 갈색의 지역 변수 num1으로 바뀌며 값은 10으로 된다. 

- 클래스 변수와 지역 변수가 동일할 때 지역 변수가 우선순위로 적용된다. 

- 그래서 변수 앞에 클래스명을 생략하지 않는 것을 권장하는 것이다.



# 클래스 변수와 인스턴스 변수의 차이

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
package classex;
 
class Card {
    // 공통점: 가로, 세로 > 클래스 변수 
    // 차이점: 숫자, 문양 > 인스턴스 변수 
    
    static int width = 150;
    static int height = 300;
    int number;
    String shape;
}
 
public class ClassTest04 {
    public static void main(String[] args) {
        
        Card c1 = new Card();
        // System.out.println(c1);     // classex.Card@3d012ddd
        c1.number = 4;
        c1.shape = "Heart";
        
        Card c2 = new Card();
        c2.number = 7;
        c2.shape = "Spade";
        
        // c1이 바꾼 공용 사물함의 w, h값은 c2에도 적용된다.
        c1.width = 300;
        c1.height = 150;
        System.out.println(c2.width);  // 300
        System.out.println(c2.height); // 150
    }
}
cs
# 설명



- 클래스 변수로 선언된 width와 height는 c1, c2가 동시에 사용할 수 있는 공용 사물함에 들어있다고 볼 수 있다.

- 인스턴스 변수로 선언된 number와 shape은 c1, c2 마다 다르기 때문에 각 자신의 개인 사물함에 들어있다고 볼 수 있다. 

- 만약 c1 객체에서 공용 사물함에 있는 클래스 변수 width와 height의 값을 변경할 경우 그대로 저장이 되며

  c2 객체에서는 변경된 클래스 변수를 사용하게 된다.



3. 메소드 (method) (총 4가지)


* 메서드는 호출할 때 메모리에 생성이 된다. 

* 변수는 new를 붙일 때 메모리에 생성이 된다.

* 즉, 위의 두 가지 경우를 '동적 메모리 할당' 이라고 부른다. 


* 리턴 타입: 총 8가지의 데이타 타입 (byte, short, int ... )

1) 클래스 메소드 

(1) 리턴 타입이 없는 경우 


1
2
3
4
5
static void 메소드명() {
    // return; 생략
}
 
호출: 클래스명.메소드명();
cs



(2) 리턴 타입이 있는 경우


1
2
3
4
5
6
7
8
static int 메소드명() {
  // return + 리턴타입과 같은 타입의 값
    return 10;    
}
 
호출: 
int num = 클래스명.메소드명(); 
System.out.println(num);
cs



2) 인스턴스 메소드 

(1) 리턴 타입이 없는 경우


1
2
3
4
5
void 메소드명() {
    // return; 생략
}
 
호출: 인스턴스명.메소드명();
cs



(2) 리턴 타입이 있는 경우


1
2
3
4
5
6
7
int 메소드명() {
    return 10;
}
 
호출:
int num = 인스턴스명.메소드명();
System.out.println(num);
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
package classex;
 
public class ClassTest05 {
    
    // 클래스 메서드 
    static int sum() { return 10 + 5; }
    static void getInfo() { System.out.println("리턴타입X 클래스 메서드"); }
    
    // 인스턴스 메서드 
    int multiply() { return 10 * 3; }
    void getName() { System.out.println("홍길동"); }
    
    public static void main(String[] args) {
 
        // 1. 클래스 메서드 
        System.out.println(ClassTest05.sum());
        
        int num1 = ClassTest05.sum();
        System.out.println(num1);
        
        ClassTest05.getInfo();
        
        // 2. 인스턴스 메서드 
        ClassTest05 c1 = new ClassTest05();
        
        System.out.println(c1.multiply());
        c1.getName();
        
    }
}
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
package classex;
 
/*    Tv 클래스 
 *     1. 특징(변수)
 *         1) Brand (String) 
 *         2) Color (String)
 *         3) Price (int)
 *         4) Channel (int)
 *         
 *     2. 기능(메서드)
 *         1) channelUp(): 1증가
 *         2) channelDown(): 1감소
 * */
 
class Tv {
    String brand;
    String color;
    int price;
    int channel;
    
    void channelUp() { channel++; }
    void channelDown() { channel--; }
    void showInfo() {
        System.out.println("브랜드: " + brand);
        System.out.println("색  상: " + color);
        System.out.println("가  격: " + price);
        System.out.println("채  널: " + channel);
    }
}
 
public class ClassTest06 {
    public static void main(String[] args) {
 
        Tv myTv = new Tv();
        myTv.brand = "삼성";
        myTv.color = "블랙";
        myTv.price = 1000;
        myTv.channel = 7;
        
        myTv.showInfo();
    
        myTv.channelDown();
        myTv.channelDown();
        myTv.channelDown();
        myTv.channelUp();
        
        System.out.println("현재 채널: " + myTv.channel);
        
    }
}
cs

'JAVA > JAVA1' 카테고리의 다른 글

JAVA1_day15 | 클래스 Class (3)  (0) 2017.12.28
JAVA1_day14 | 추가공부  (0) 2017.12.27
JAVA1_day13 | 추가공부  (0) 2017.12.26
JAVA1_day13 | 클래스 Class (1)  (0) 2017.12.26
JAVA1_day13 | 2차 배열 Array  (0) 2017.12.26