컴퓨터 관련/JAVA 강의

java #8 #9 변수/메소드, 접근지정자

승명 2016. 12. 18. 19:22

java #8 #9 변수/메소드, 접근지정자

 

* 변수 (variable)
  
static 변수
(class 변수)
- 클래스의 필드에 선언하는 변수
- 메모리에 가장 먼저 올라감
- 자동초기화 : 실행시 jvm이 초기 값을 자동으로 넣어줌.

* 부여되는 초기값
구분데이터형초기값
정수형
byte, short, int, long0
실수형float, double0.0
문자형char\u0000 유니코드값=0 (2바이트)
불린형booleanfalse
참조형class, string, arraynull

- 변수 선언시 static(접근 지정자) 붙여서 선언(static 데이터형 변수명;)

* 접근지정자

1public클래스 외부에서 사용 가능
2protected같은 패키지의 다른 클래스에서는 사용 가능, 외부 패키지의 클래스가 사용하려면 이 클래스의 자식클래스만 사용 가능.
3private정의된 클래스 안에서만 사용 가능
4default같은 패키지의 다른 클래스에서 사용 가능.(아무것도 안쓰고 선언하면 default로 간주함) (friendly)
5static공용메모리 사용
6final값 변경 불가
7transient직렬화 방지(stream을 써야 알수 있게 됨)

파란글자(1,2,3,4) = 클래스 외부 사용여부 지정, 4개 중 1개만 사용 가능
   5,6,7 = 여러개 사용 가능.

- 클래스가 실행되면 가장 처음 메모리에 올라간다.
- 하나의 변수를 객체들이 공유하여 사용
- 메모리를 절약할 수 있고 참조하는 속도가 빠르다.
- 사용하지 않아도 메모리에 올라가기 때문에 메모리의 낭비로 이어질 수 있다.
- 특정 instance(객체)에 속해있는 변수가 아니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package day0213;
 
/**
* 실행되는 JVM에서 하나가 만들어지고 모든 객체가 하나의 변수를 참조하여 사용하는 (공용) static 변수의 사용법
* @author SiSt
*/
 
public class StaticVariable {
     static int i;
    
     public static void main(String[] args) {
          System.out.println(i);
          //특정 객체가 가지고 있는 변수는 아니다.
          StaticVariable sv/*객체*/ = new StaticVariable();
          StaticVariable sv1/*객체*/ = new StaticVariable();
         
          /*sv.i=100;
          System.out.println(sv.i);
          System.out.println(sv1.i);*/
          // static 변수의 올바른 사용문법은 클래스명.변수이다.
          System.out.println(StaticVariable.i);
     }//main
 
}//class

cs

instance 변수
(member 변수)
- class field에 정의하는 변수
- class를 객체로 만들어야(객체화, instance화) 메모리 올라가는 변수
- 생성하는 객체마다 메모리에 올라간다.
- 자동초기화가 된다.
- 객체명.변수명으로 사용한다.
- static 영역에서 인스턴스변수를 직접 사용할 수 없고 객체화를 하여 사용한다.

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
package day0213;
 
/**
* class의 필드에 정의되고 객체화를 하여야만 메모리에 올라가서 객체명으로 접근하여 사용할 수 있는 인스턴스 변수의 사용법 static
* 영역은 메모리에 가장 먼저 올라가기 때문에 instance 영역의 변수를 참조할 수 없다.
*
* @author SiSt
*/
public class InstanceVariable {
     int i; // instance(member 변수)
 
     public static void main(String[] args) {
          // static 영역은 instance 영역보다 메모리에 먼저 올라가기 때문에 메모리에 올라오지 않은 인스턴스 변수를 직접
          // 사용할 수 없다.
          // 메모리에 먼저 올라온 static 영역에서 instance 영역의 변수를 사용하려면 객체화를 하여 메모리에 올려놓고
          // 객체명.변수명으로 사용된다.
          // 객체화 : 클래스명 객체명=new 클래스명();
          InstanceVariable iv = new InstanceVariable();
          InstanceVariable iv1 = new InstanceVariable();
          // iv : 객체(instance)라고 하고 heap에 할당된 주소를 저장.
          // System.out.println(iv)
          // 객체가 생성되면 객체마다 instance변수를 초기화하여 가지고 있다.
          System.out.println("iv객체 i= " + iv.i + "/ iv1객체 i = " + iv1.i);
          // 인스턴스 변수는 각각 생성된 변수이므로 값을 변경하면 해당 객체만 값이 변경된다.
          iv.i = 300;
          System.out.println("iv객체 i= " + iv.i + "/ iv1객체 i = " + iv1.i);
     }// main
 
}// class
cs

*JVM의 영역

1
2
3
4
5
6
7
8
9
class T{
int i;
static int j;
 
public static moid main(string() args){
int k=0//지역변수
Test t=new Test();
t.i=10;
j=20
cs
일때, 

native method다른 언어와 자바가 같이 사용될 때 다른 언어의 정보가 올라가는 영역
Pc register다음번에 실행될 코드의 주소가 저장되는 영역
heap instance객체가 저장되는 영역.
i..


stack메소드가 실행되면 메소드 내부의 코드가 저장되는 영역. heap에 저장된 값을 참조하여 값을 불러들임.
argsheap
참조
k0
t
heap
참조
method클래스가 실행되면 클래스의 정보가 들어가는 영역. 클래스의 모든 정보가 저장됨. static 변수 저장됨

test
int i
static j
main()
j20


* 메소드

- 자주 사용될 코드를 미리 정의해두고 필요한 곳에서 호출하여 그 기능을 사용하기 위해서 존재
- instance method와 static method가 존재


instance methodstatic method
객체화객체화 후 사용필요 없음
실행법객체명.메서드명()클래스명.메서드명()


* 메소드 정의 방법 : 접근지정자 반환형 메서드명(매개변수...) {

     - 접근지정자 종류
public클래스 외부에 호출가능
protected동일 패키지의 다른 클래스에서 사용 가능. 패키지가 다르면 자식클래스만 사용 가능
private정의된 클래스 안에서만 호출 가능
default동일 패키지의 다른 클래스에서 호출 가능
staticstatic method
synchronized동기화 처리(multi thread에서 동시 호출 막기)

     - 반환형 : 메서드를 호출했을때 반환할 값을 내보내기 위해 정의(아래 셋 중 하나만 사용 가능)
void반환값 없음
기본형byte, short, int, long, char, float, double, boolean
참조형string, class, array

     - 매개변수 : 메서드 밖의 값을 메서드 안에 넣기 위해서(복수 지정 가능)

* 메소드의 형태

반환형매개변수기능호출
xx

- 항상 같은 일을 한다. 인스턴스 메소드.

1
2
public void test(){
// 호출한 곳으로 돌아감
cs
메소드명();
- ex> test();
xo

- 가변적, 동적인 일을 한다.

1
2
public void test(int i, char c){
// 호출한 곳으로 돌아감
cs
메소드명(값,...);
- 메소드의 파라메터와 일치하는 값을 넣어야 함
- ex> test(10,'A');
ox

- 메소드를 고정된 값으로 사용할 때
- 가장 마지막줄에 반드시 return 값; 을 기술해야함

1
2
3
4
public int test(){
...
return 10// int형 데이터
}
cs
메소드명();
- ex> int i = test();

oo- 메소드를 동적인 값으로 사용
- 가장 마지막줄에 반드시 return 값; 을 기술해야함
- parameter와 return이 같을 필요는 없음

1
2
3
4
public int test(char c){
...
return 10;
}
cs
메소드명(값);
- 매개변수의 형에 주의하며 호출
- ex> int i = test('A');
?o
(인자





관없음)

Variable Arguments
- 가변인자형(파라메터의 갯수에 상관없이 여러개의 인자값을 넣어줄 수 있는 형)
- jdk 1.5에서 부터 나온 문법
- 파라메터는 메소드 내부에서 배열로 처리됨
- 다른 매개변수와 같이 사용될때에는 제일 마지막에만 정의할 수 있음.

1
2
public void test(int ... 매개변수명){
}
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
package day0214;
 
/**
* jdk1.5 에서부터 등장한 문법인 가변인자형 (variable Arguments)의 사용 (선언된 parameter(매개변수)는 하나이고
* 입력되는 값이 여러개인 것)
*
* @author SiSt
*/
public class VariableArguments {
 
     /**
     * 가변인자형이 적용된 메소드 호출시 정수형(int)으로 인자값(arguments)을 여러개 넣을 수 있는 메소드<br/>
     * 예) method(); method(1); method(1,2,3,4,5,6,,,,)
     *
     * @param i
     */
 
     public void method(int... param) {
          // parameter 하나로 여러개의 값을 받아서 처리할 수 있다.
          // i 는 배열(array)로 처리된다.
          // System.out.println(i);
          for (int index=0;index<param.length ; index++){
               System.out.println(param[index]);
          }
     }// method
 
     public static void main(String[] args) {
          // static 영역에서 heap(instance) 영역을 사용할 때 객체화(instance화) 해서 사용해야 한다.
          // 클래스명 객체명 = new 클래스명();
          VariableArguments va = new VariableArguments();
          va.method(12,4,5,3,3,2);
 
     }// method
 
}// main
cs
- 동일형으로만 넣어주면 몇개든 입력 가능
- ex> 아래 모두 가능.
test();
test(10);
test(1,2,3,4,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
package day0213;
 
/**
* 정의할 수 있는 메소드의 형태와 호출법
*
* @author SiSt
*/
public class MethodType {
 
     public void typeA() {
          // 반환형 없고 매개변수 없는 형 : 호출하면 항상 같은일을 하게 된다.
          System.out.println("안녕");
     }// typeA
 
     // 반환형 없고 매개변수 있는 형
     // 호출시 입력되는 인자값에 따라 다른 일을 한다. (가변적인 일)
     public void typeB(int cnt) {
          for (int i = 0; i < cnt; i++) {
               System.out.print("★");
          }// end for
     }// typeB
 
     // ------------------값으로 사용하는 메서드--------------------
     // 가장 마지막줄에 반드시
     // return값(반환형과 동일한 데이터형); 을 기술해야 함
     // 반환형 있고 매개변수 없는 형 : 고정값으로 사용
     public int typeC() {
          int i = 100;
          return 10// 가장 마지막줄에 반드시 return이 있어야 함. return 타입이 int 이므로 반드시 정수형의 값을
                         // 반
     }// typeC
 
     // 가변값으로 사용되는 메소드
     // 입력되는 값에 따라서 다른 값을 반환한다.
 
     public int typeD(double d) {
          return (int) d;
     }// type D
 
     public static void main(String[] args) {
          // typeA(); //메모리에 먼저 올라가는 static에서는 instance메소드를 직접 사용할 수 없다. 객체화 필요.
          MethodType mt = new MethodType();
          mt.typeA();// 호출하면 항상 같은일을 한다.
 
          for (int i = 0; i < 5; i++) {
               mt.typeB(i);// 가변적인 일
               System.out.println();
          }// end for
 
          // 값으로 사용하는 메소드
          int i = mt.typeC();
          System.out.println("고정값 " + i + " / " + (10 + mt.typeC()));
 
          // 가변값으로 사용하는 메소드
          int j = mt.typeD(9.5);
          System.out.println("가변값 " + j + " / " + (10 + mt.typeD(3.1)));
     }// main
}// class