[JAVA] 클래스
클래스 구성 형식
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 |