JAVA

[JAVA] 클래스

주옹스 2020. 7. 31. 16:22

클래스 구성 형식

 

   

        1-1 ) 클래스의 접근 권한

               클래스를 외부에서 접근하지 못하도록 제한하는 역할

         

                : 필드(인스턴스변수, 클래스변수)나 메소드의 접근제어자

                public > protected > 기본(default) > private  
         

                  public : 제약없이 어디에서나 사용가능   
                  default  :동일한 패키지(폴더) 안에서 사용가능

 

 

 

 

        1-2 ) 클래스 이름

              일반적으로 대문자로 시작

 

 

 

 

        1-3 ) 필드

               :  인스턴스변수, 클래스변수

 

                  * 인스턴스 변수란?

                     ㄱ. 객체마다 고유의 속성을 나타내기 위해 사용되는 변수.

                     ㄴ. 객체에 메모리를 할당 받을 때 마다 새로운 저장 공간을 할당 받는다.

                     ㄷ. heap 영역에 메모리 할당받는다.

                     ㄹ. 객체에 종속적으로 객체에서 호출한다 --> 반드시 객체를 생성해야 사용할 수 있다.

                     ㅁ. 객체에 null이 할당되거나 객체를 더 이상 참조하지 않게 되었을 때,

                          가비지 컬렉터에의해 메모리가 해제된다.

                     ㅂ. JVM이 알아서 메모리 해제해줌. ( c언어는 메모리할당과, 해지 둘다 개발자가 해줘야함)

 

                  * 클래스 변수란?

                    ㄱ. static을 붙여서 선언하는 변수

                    ㄴ. 클래스가 로딩될 때 단 한번 메모리가 할당 되며, 객체 생성과 무관하게 사용 할 수 있다.

                    ㄷ. 클래스 변수는 모든 인스턴스들이 공통적인 값을 갖는다.

                    ㄹ. 일반적으로 객체가 아닌 클래스 이름을 이용하여 외부에서 접근한다.

                    ㅁ. 메소드( method,static ) 영역에 메모리를 할당받으며, 클래스 변수는 프로그램이 종료될 때 소멸

 

           

                   

                  - 필드 초기 값 

                      필드는 선언하면서 초기화 하지 않는 경우, 메모리를 할당 받을 때 다음과 같이 초기화가 이루어짐

필드의 초기값

 

 

                  - 필드의 구성 형식

                     

필드의 구성 형식

 

 

        1-4 ) 생성자 

               - 생성자는 클래스와 동일한 이름을 가지며 객체 생성 및 초기화를 위해 호출

               - 생성자를 만들지 않는 경우, 컴파일 할 때 컴파일러가 자동으로 디폴트 생성자를 만듦

 

  

 

        1-5 )  메소드 

                 메소드는 생성된 객체가 수행할 수 있는 연산 또는 행위를 구현

 

 

 

 

 

코드로 보는 클래스 설명

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
73
74
75
76
77
78
79
80
81
82
83
package ex0731;
 
public class Class_Test2 {
    public static void main(String[] args) {
 
        //<<컴파일 오류>>
        
        Bank bb; //초기화 안됨
        
        //bb.name ="홍길동"; 
           //컴파일 오류. 인스턴스 변수, 인스턴스 메소드는 객체가 생성된 경우만 호출 가능
           //may not have been initialized
        
        
        
        //<<런타임오류>>
        
        Bank bb2 = null//객체를 null로 초기화 -> 객체를 초기화시키는 방법은 null밖에 없음
           // null은 객체가 생성되지 않은 아무것도 없는 상태
        
        //bb2.name ="홍길동";
          //런타임 오류. 객체가 생성되지 않은 상태에서 인스턴스 변수나 인스턴스 메소드 접근 불가.
          // NullPointerException
        
        
        
        
        //객체 생성 : new 생성자([인수])
        bb = new Bank();  
        bb2 = new Bank();
        
        //bb.money = 100; //private 멤버는 class안에는 있지만 class밖에서 접근 불가능 
                          //컴파일 오류.
                 
        
        bb.name = "홍길동";
        System.out.println(bb.name+":"+bb.getMoney()); //홍길동:1000
        
        
        System.out.println(bb2.name+":"+bb2.getMoney()); //null:1000
    }
}
 
 
// public > protected > 기본(default) > private
//  public : 누구나 사용가능
//  default  :동일한 패키지(폴더) 안에서 사용가능
 
 
class Bank{ //Bank라는 클래스이름을 또 사용할 수 없음 >>> 컴파일하면 -> class파일 생성
     
    //인스턴스 변수 : 객체를 생성해야 호출할 수 있는 변수
    //private : 클래스내에서만 접근 가능.
    //    클래스 밖에서는 접근 불가
    
    private int money = 1000//통장만들면 무조건 1000으로 초기화됨
    String name; //동일한 패키지의 클래스에서는 접근
    
    
    
    //인스턴스 메소드 :  객체를 생성해야 호출할 수 있는 메소드
     public int getMoney() {
        return money;
    }
     
     
     //인출 : 인스턴스 메소드 
     public int draw (int m) {
         if(m>money) {
             return -1;
         }
         money -= m;
         return m;
     }
     
     
     //입금 : 인스턴스 메소드 
     public int saving(int m) {
          
         money += m;
         return m;
     }
}
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
69
70
71
72
package ex0731;
 
public class Class_Test3 {
    public static void main(String[] args) {
 
        //객체선언과 메모리할당
        User3 u1;
        // u1.a=100; //컴파일 오류 -> 메모리 할당을 하지 않았기 떄문.
        
        //클래스 변수는 클래스명으로 접근.
        System.out.println(User3.c); //->기울기 있는거는 클래스변수나 클래스메소드
        //클래스 메소드는 클래스명으로 접근
        User3.sub2();
        
        
        u1= new User3();
        User3 u2 = new User3();
        
        // 레퍼런스변수를 선언 하면 heap영역에 할당받고, heap의 주소를 해당 변수에 넣어줌.
        System.out.println(u1); // ex0731.User3@15db9742 : 클래스명@해쉬코드 --> 해시코드 객체를 빠르게 보여주기 위해 사용.
        System.out.println(u2); // ex0731.User3@6d06d69c
        
        
        u1.a = 100// 인스턴스 변수, 인스턴스 메소드는 객체로 접근
        u1.sub1();  //100:10:300
        
        u2.sub1();  //0:10:300
        
        
        // 클래스 변수나 클래스 메소드는 객체로 접근가능하지만
        // 객체생성과 상관 없으므로 클래스명으로 접근한다.
        //System.out.println(u1.c);
    }
}
 
 
 
class User3{ 
    
    int a; // 인스턴스 변수. 객체가 생성되면서 0으로 초기화
           // 인스턴스 변수 : 객체가 생성되어야 사용할 수 있다.
           // 인스턴스변수는 객체를 통해서 접근할 수 있다.
    
    int b = 10// 인스턴스 변수. 객체가 생성되면서 10으로 초기화
    
    static int c = 300// 클래스 변수
          // 객체 생성과 상관없이 클래스가 로딩되면 바로 사용가능
          // 클래스명을 이용하여 접근.
    
    
    // 인스턴스 메소드
    // 객체를 생성해야 호출할 수 있는 메소드
    public void sub1() {
        int n = 10// 메소드 안에 선언된 변수
                    // 초기화( 값이 존재 )해야 사용가능 
        System.out.println("지역변수 : "+n);
        // 인스턴스 메소드는 인스턴스변수, 클래스변수 접근
        System.out.println(a+":"+b+":"+c ); //c -> 클래스 변수이기 때문에 sub1 호출하면 a:b:c출력 가능
    }
    
    
    
    // 클래스 메소드
    // 객체생성과 상관 없이 언제나 호출가능
    public static void sub2() {
        
        //System.out.println(a+":"+b); //a,b는 객체를 생성해야 호출가능하기 때문에 클래스 메소드에서 부를 수 없음.
                                       //컴파일 오류.
        
        System.out.println(c);
    }
}
cs

 

 

 

 

 

[ Ex 클래스 만들기 ]

문자를 매개변수로 넘겨 받아 소문자이면 대문자로 변환

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package ex0731;
 
public class Method_Ex2 {
    public static void main(String[] args) {
      
        char a = 'a';
        User5 u = new User5();
        
        a = u.upper(a);
        System.out.println(a);
        
    }
}
 
 
//문자를 매개변수로 넘겨받아 소문자이면 대문자로 변환
class User5{
    public char upper(char ch) {
        return ch >= 'a'&& ch <='z'?(char)(ch-32):(char)ch;
    }
}
cs